You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
2.7 KiB
93 lines
2.7 KiB
# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
import dbus
|
|
|
|
import common
|
|
from autotest_lib.client.common_lib import error
|
|
from autotest_lib.client.cros.cellular import modem
|
|
from autotest_lib.client.cros.cellular import modem1
|
|
|
|
|
|
MMPROVIDERS = ['org.chromium', 'org.freedesktop']
|
|
SERVICE_UNKNOWN = 'org.freedesktop.DBus.Error.ServiceUnknown'
|
|
|
|
|
|
def GetManager():
|
|
"""Returns a ModemManager object.
|
|
|
|
Attempts to connect to various modemmanagers, including
|
|
ModemManager classic interfaces, ModemManager using the
|
|
ModemManager1 interfaces and cromo and return the first
|
|
ModemManager that is found.
|
|
|
|
Returns:
|
|
a ModemManager object.
|
|
"""
|
|
for provider in MMPROVIDERS:
|
|
try:
|
|
return modem.ModemManager(provider)
|
|
except dbus.exceptions.DBusException, e:
|
|
if e._dbus_error_name != SERVICE_UNKNOWN:
|
|
raise
|
|
|
|
try:
|
|
return modem1.ModemManager()
|
|
except dbus.exceptions.DBusException, e:
|
|
if e._dbus_error_name != SERVICE_UNKNOWN:
|
|
raise
|
|
|
|
return None
|
|
|
|
|
|
def EnumerateDevices(manager=None):
|
|
"""Enumerates all modems in the system.
|
|
|
|
Args:
|
|
manager: the specific manager to use, if None use the first valid
|
|
manager
|
|
|
|
Returns:
|
|
a list of (ModemManager object, modem dbus path)
|
|
"""
|
|
if not manager:
|
|
manager = GetManager()
|
|
if not manager:
|
|
raise error.TestError('Cannot connect to the modem manager, is '
|
|
'ModemManager/cromo/PseudoModemManager running?')
|
|
|
|
result = []
|
|
for path in manager.EnumerateDevices():
|
|
result.append((manager, path))
|
|
|
|
return result
|
|
|
|
|
|
def PickOneModem(modem_pattern, manager=None):
|
|
"""Pick a modem.
|
|
|
|
If a machine has a single modem, managed by one of the MMPROVIDERS,
|
|
return the dbus path and a ModemManager object for that modem.
|
|
|
|
Args:
|
|
modem_pattern: pattern that should match the modem path
|
|
manager: the specific manager to use, if None check all known managers
|
|
|
|
Returns:
|
|
(ModemManager, Modem DBUS Path) tuple
|
|
|
|
Raises:
|
|
TestError: if there are no matching modems, or there are more
|
|
than one
|
|
"""
|
|
devices = EnumerateDevices(manager)
|
|
|
|
matches = [(m, path) for m, path in devices if modem_pattern in path]
|
|
if not matches:
|
|
raise error.TestError('No modems had substring: ' + modem_pattern)
|
|
if len(matches) > 1:
|
|
raise error.TestError('Expected only one modem, got: ' +
|
|
', '.join([modem.path for modem in matches]))
|
|
return matches[0]
|