| # 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. |
| |
| from autotest_lib.client.bin import test |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.client.cros import backchannel |
| from autotest_lib.client.cros import network |
| from autotest_lib.client.cros.cellular.pseudomodem import pseudomodem |
| |
| import time |
| import dbus, dbus.mainloop.glib |
| |
| from autotest_lib.client.cros import flimflam_test_path |
| import flimflam |
| |
| DEVICE_TIMEOUT=45 |
| |
| class network_3GStressEnable(test.test): |
| """ |
| Stress-tests enabling and disabling a technology at short intervals. |
| |
| """ |
| version = 1 |
| |
| okerrors = [ |
| 'org.chromium.flimflam.Error.InProgress' |
| ] |
| |
| def _enable_device(self, enable): |
| try: |
| if enable: |
| self.device.Enable(timeout=DEVICE_TIMEOUT) |
| else: |
| self.device.Disable(timeout=DEVICE_TIMEOUT) |
| except dbus.exceptions.DBusException, err: |
| if err._dbus_error_name in network_3GStressEnable.okerrors: |
| return |
| else: |
| raise error.TestFail(err) |
| |
| def _test(self, settle): |
| self._enable_device(True) |
| time.sleep(settle) |
| self._enable_device(False) |
| time.sleep(settle) |
| |
| def _run_once_internal(self, cycles, min, max): |
| self.flim = flimflam.FlimFlam(dbus.SystemBus()) |
| network.ResetAllModems(self.flim) |
| self.device = self.flim.FindCellularDevice() |
| if not self.device: |
| raise error.TestFail('Failed to find a cellular device.') |
| service = self.flim.FindCellularService() |
| if service: |
| # If cellular's already up, take it down to start. |
| try: |
| service.SetProperty('AutoConnect', False) |
| except dbus.exceptions.DBusException, err: |
| # If the device has never connected to the cellular service |
| # before, flimflam will raise InvalidService when attempting |
| # to change the AutoConnect property. |
| if err._dbus_error_name != 'org.chromium.flimflam.'\ |
| 'Error.InvalidService': |
| raise err |
| self._enable_device(False) |
| for t in xrange(max, min, -1): |
| for n in xrange(cycles): |
| # deciseconds are an awesome unit. |
| print 'Cycle %d: %f seconds delay.' % (n, t / 10.0) |
| self._test(t / 10.0) |
| print 'Done.' |
| |
| def run_once(self, cycles=3, min=15, max=25, use_pseudomodem=False, |
| pseudomodem_family='3GPP'): |
| with backchannel.Backchannel(): |
| with pseudomodem.TestModemManagerContext( |
| use_pseudomodem, family=pseudomodem_family): |
| self._run_once_internal(cycles, min, max) |