112 lines
4.3 KiB
Python
112 lines
4.3 KiB
Python
# 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 socket
|
|
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)
|
|
# TODO(b/114292737): Once IPv6 support is enabled on
|
|
# cellular, we should not need to limit this check to just
|
|
# AF_INET.
|
|
network.CheckInterfaceForDestination(
|
|
urlparse.urlparse(url_pattern).hostname,
|
|
interface, socket.AF_INET)
|
|
|
|
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()
|