普通文本  |  93行  |  2.68 KB

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