| # 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 |
| import time |
| import urlparse |
| |
| from autotest_lib.client.bin import test |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.client.cros import network |
| from autotest_lib.client.cros.networking import shill_context |
| from autotest_lib.client.cros.networking import shill_proxy |
| |
| |
| # Default timeouts in seconds |
| CONNECT_TIMEOUT = 120 |
| DISCONNECT_TIMEOUT = 60 |
| |
| class cellular_Smoke(test.test): |
| """ |
| Tests that 3G modem can connect to the network |
| |
| The test attempts to connect using the 3G network. The test then |
| disconnects from the network, and verifies that the modem still |
| responds to modem manager DBUS API calls. It repeats the |
| connect/disconnect sequence several times. |
| |
| """ |
| version = 1 |
| |
| |
| def run_once_internal(self): |
| """ |
| Executes the test. |
| |
| """ |
| old_modem_info = self.test_env.modem.GetModemProperties() |
| |
| for _ in xrange(self.connect_count): |
| device = self.test_env.shill.find_cellular_device_object() |
| if not device: |
| raise error.TestError('No cellular device found.') |
| |
| service = self.test_env.shill.wait_for_cellular_service_object() |
| if not service: |
| raise error.TestError('No cellular service found.') |
| |
| logging.info('Connecting to service %s', service.object_path) |
| self.test_env.shill.connect_service_synchronous( |
| service, CONNECT_TIMEOUT) |
| |
| state = self.test_env.shill.get_dbus_property( |
| service, shill_proxy.ShillProxy.SERVICE_PROPERTY_STATE) |
| logging.info('Service state = %s', state) |
| |
| if state == 'portal': |
| url_pattern = ('https://quickaccess.verizonwireless.com/' |
| 'images_b2c/shared/nav/' |
| 'vz_logo_quickaccess.jpg?foo=%d') |
| bytes_to_fetch = 4476 |
| else: |
| url_pattern = network.FETCH_URL_PATTERN_FOR_TEST |
| bytes_to_fetch = 64 * 1024 |
| |
| interface = self.test_env.shill.get_dbus_property( |
| device, shill_proxy.ShillProxy.DEVICE_PROPERTY_INTERFACE) |
| logging.info('Expected interface for %s: %s', |
| service.object_path, interface) |
| network.CheckInterfaceForDestination( |
| urlparse.urlparse(url_pattern).hostname, |
| interface) |
| |
| fetch_time = network.FetchUrl(url_pattern, bytes_to_fetch, |
| self.fetch_timeout) |
| self.write_perf_keyval({ |
| 'seconds_3G_fetch_time': fetch_time, |
| 'bytes_3G_bytes_received': bytes_to_fetch, |
| 'bits_second_3G_speed': 8 * bytes_to_fetch / fetch_time |
| }) |
| |
| self.test_env.shill.disconnect_service_synchronous( |
| service, DISCONNECT_TIMEOUT) |
| |
| # Verify that we can still get information about the modem |
| logging.info('Old modem info: %s', ', '.join(old_modem_info)) |
| new_modem_info = self.test_env.modem.GetModemProperties() |
| if len(new_modem_info) != len(old_modem_info): |
| logging.info('New modem info: %s', ', '.join(new_modem_info)) |
| raise error.TestFail('Test shutdown: ' |
| 'failed to leave modem in working state.') |
| |
| if self.sleep_kludge: |
| logging.info('Sleeping for %.1f seconds', self.sleep_kludge) |
| time.sleep(self.sleep_kludge) |
| |
| |
| def run_once(self, test_env, connect_count=5, sleep_kludge=5, |
| fetch_timeout=120): |
| with test_env, shill_context.ServiceAutoConnectContext( |
| test_env.shill.wait_for_cellular_service_object, False): |
| self.test_env = test_env |
| self.connect_count = connect_count |
| self.sleep_kludge = sleep_kludge |
| self.fetch_timeout = fetch_timeout |
| |
| self.run_once_internal() |