xref: /aosp_15_r20/external/autotest/client/cros/cellular/mm.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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