| # 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] |