blob: 50fc193205e2f1398a8192df767ae507551ca542 [file] [log] [blame]
# Copyright (c) 2011 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 logging, time
from autotest_lib.client.bin import test
from autotest_lib.client.common_lib import error
from autotest_lib.client.cros import flimflam_test_path
import flimflam
class network_3GAssociation(test.test):
version = 1
def ConnectTo3GNetwork(self, timeout):
"""Attempts to connect to a 3G network using FlimFlam.
Args:
timeout: Timeout (in seconds) before giving up operations.
Raises:
error.TestFail if connection fails.
"""
logging.info('ConnectTo3GNetwork')
success, status = self.flim.ConnectService(
service=self.service,
timeout=timeout)
if not success:
raise error.TestFail('Could not connect: %s.' % status)
connected_states = ['ready', 'portal', 'online']
state = self.flim.WaitForServiceState(service=self.service,
expected_states=connected_states,
timeout=timeout,
ignore_failure=True)[0]
if not state in connected_states:
raise error.TestFail('Still in state %s' % state)
return state
def DisconnectFrom3GNetwork(self, disconnect_timeout):
"""Attempts to disconnect from a 3G network using FlimFlam.
Args:
disconnect_timeout: Wait this long (in seconds) for
disconnect to take effect.
Raises:
error.TestFail if the disconnect operation times out.
"""
logging.info('DisconnectFrom3GNetwork')
success, status = self.flim.DisconnectService(
service=self.service,
wait_timeout=disconnect_timeout)
if not success:
raise error.TestFail('Could not disconnect: %s.' % status)
def run_once(self, connect_count=10, maximum_avg_assoc_time_seconds=10):
# no backchannel required because we are just testing the time
# to make a network connection. The wired ethernet can be
# left with the default route.
self.flim = flimflam.FlimFlam()
self.service = self.flim.FindCellularService()
self.DisconnectFrom3GNetwork(disconnect_timeout=20)
total_time_seconds = 0.0
for _ in xrange(connect_count):
start_time_seconds = time.time()
state = self.ConnectTo3GNetwork(timeout=20)
assoc_time_seconds = time.time() - start_time_seconds
self.write_perf_keyval(
{'seconds_3G_assoc_time': assoc_time_seconds })
self.DisconnectFrom3GNetwork(disconnect_timeout=20)
total_time_seconds += assoc_time_seconds
average_assoc_time_seconds = total_time_seconds / connect_count
self.write_perf_keyval(
{'average_seconds_3G_assoc_time': average_assoc_time_seconds})
if average_assoc_time_seconds > maximum_avg_assoc_time_seconds:
raise error.TestFail(
'Average association time %s is greater than %s' % (
average_assoc_time_seconds, maximum_avg_assoc_time_seconds))