blob: d01d40be0bdf851eaecf82e8a04d121b8e4f0723 [file] [log] [blame]
# 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)