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