普通文本  |  108行  |  4.09 KB

# 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.find_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()