| # Copyright (c) 2014 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. |
| |
| """ |
| This module provides bindings for PseudoModem Manager. |
| |
| """ |
| |
| import dbus |
| import logging |
| |
| import common |
| |
| from autotest_lib.client.cros.networking import mm1_proxy |
| |
| from autotest_lib.client.bin import utils |
| from autotest_lib.client.cros.cellular import mm1_constants |
| from autotest_lib.client.cros.cellular.pseudomodem import pm_constants |
| |
| |
| class PseudoMMProxy(mm1_proxy.ModemManager1Proxy): |
| """A wrapper around a DBus proxy for PseudoModem Manager.""" |
| |
| # Used for software message propagation latencies. |
| SHORT_TIMEOUT_SECONDS = 2 |
| |
| @property |
| def iface_testing(self): |
| """@return org.chromium.Pseudomodem.Testing DBus interface.""" |
| return dbus.Interface( |
| self._bus.get_object(mm1_constants.I_MODEM_MANAGER, |
| pm_constants.TESTING_PATH), |
| pm_constants.I_TESTING) |
| |
| |
| def iface_ism(self, machine_name, timeout_seconds=SHORT_TIMEOUT_SECONDS): |
| """ |
| Get the testing interface of the given interactive state machine. |
| |
| @param machine_name: The name of the interactive state machine. |
| @param timeout_seconds: Max number of seconds to wait until interactive |
| state machine becomes available. |
| @return dbus.Interface for the testing interface of |
| InteractiveScanningMachine. |
| @raise mm1_proxy.ModemManager1ProxyError if a valid DBus object can't |
| be found. |
| |
| """ |
| def _get_machine(ignore_error): |
| machine = self._bus.get_object( |
| mm1_constants.I_MODEM_MANAGER, |
| '/'.join([pm_constants.TESTING_PATH, machine_name])) |
| if machine is None: |
| return None |
| |
| i_machine = dbus.Interface(machine, pm_constants.I_TESTING_ISM) |
| # Only way to know if this DBus object is valid is to call a |
| # method on it. |
| try: |
| i_machine.IsWaiting() # Ignore result. |
| return i_machine |
| except dbus.exceptions.DBusException as e: |
| if ignore_error: |
| return None |
| logging.debug(e) |
| raise mm1_proxy.ModemManager1ProxyError( |
| 'Failed to obtain a valid object for interactive ' |
| 'state machine %s. DBus error: %s', |
| machine_name, |
| repr(e)) |
| |
| try: |
| utils.poll_for_condition( |
| lambda: _get_machine(True), timeout=timeout_seconds) |
| except utils.TimeoutError as e: |
| pass |
| |
| return _get_machine(False) |