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