Home | History | Annotate | Download | only in cellular
      1 # Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import dbus
      6 
      7 import common
      8 from autotest_lib.client.common_lib import error
      9 from autotest_lib.client.cros.cellular import modem
     10 from autotest_lib.client.cros.cellular import modem1
     11 
     12 
     13 MMPROVIDERS = ['org.chromium', 'org.freedesktop']
     14 SERVICE_UNKNOWN = 'org.freedesktop.DBus.Error.ServiceUnknown'
     15 
     16 
     17 def GetManager():
     18     """Returns a ModemManager object.
     19 
     20     Attempts to connect to various modemmanagers, including
     21     ModemManager classic interfaces, ModemManager using the
     22     ModemManager1 interfaces and cromo and return the first
     23     ModemManager that is found.
     24 
     25     Returns:
     26         a ModemManager object.
     27     """
     28     for provider in MMPROVIDERS:
     29         try:
     30             return modem.ModemManager(provider)
     31         except dbus.exceptions.DBusException, e:
     32             if e._dbus_error_name != SERVICE_UNKNOWN:
     33                 raise
     34 
     35     try:
     36         return modem1.ModemManager()
     37     except dbus.exceptions.DBusException, e:
     38         if e._dbus_error_name != SERVICE_UNKNOWN:
     39             raise
     40 
     41     return None
     42 
     43 
     44 def EnumerateDevices(manager=None):
     45     """Enumerates all modems in the system.
     46 
     47     Args:
     48         manager: the specific manager to use, if None use the first valid
     49                  manager
     50 
     51     Returns:
     52         a list of (ModemManager object, modem dbus path)
     53     """
     54     if not manager:
     55         manager = GetManager()
     56     if not manager:
     57         raise error.TestError('Cannot connect to the modem manager, is '
     58                               'ModemManager/cromo/PseudoModemManager running?')
     59 
     60     result = []
     61     for path in manager.EnumerateDevices():
     62         result.append((manager, path))
     63 
     64     return result
     65 
     66 
     67 def PickOneModem(modem_pattern, manager=None):
     68     """Pick a modem.
     69 
     70     If a machine has a single modem, managed by one of the MMPROVIDERS,
     71     return the dbus path and a ModemManager object for that modem.
     72 
     73     Args:
     74         modem_pattern: pattern that should match the modem path
     75         manager: the specific manager to use, if None check all known managers
     76 
     77     Returns:
     78         (ModemManager, Modem DBUS Path) tuple
     79 
     80     Raises:
     81         TestError: if there are no matching modems, or there are more
     82                    than one
     83     """
     84     devices = EnumerateDevices(manager)
     85 
     86     matches = [(m, path) for m, path in devices if modem_pattern in path]
     87     if not matches:
     88         raise error.TestError('No modems had substring: ' + modem_pattern)
     89     if len(matches) > 1:
     90         raise error.TestError('Expected only one modem, got: ' +
     91                               ', '.join([modem.path for modem in matches]))
     92     return matches[0]
     93