# Copyright 2014 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 from autotest_lib.client.common_lib import error from autotest_lib.client.bin import test from autotest_lib.client.cros.networking.chrome_testing \ import chrome_networking_test_context as cntc from autotest_lib.client.cros.networking.chrome_testing \ import chrome_networking_test_api as cnta from autotest_lib.client.common_lib.cros.network \ import chrome_net_constants class network_RoamWifiEndToEnd(test.test): """ Tests the following with chrome.networkingPrivate APIs: 1. Tests that the DUT can see and connect to the configured AP. 2. Tests the DUT can Roam/Failover between networks with same SSID. """ version = 1 def _find_configured_network(self): """Check if the required network is in the networks_found list. @return Service list of the required network; None if network not found """ networks = self.chrome_networking.get_wifi_networks() for service in networks: if service['Name'] == self.SSID: return service return None def _find_and_connect_to_configured_network(self): """Find all networks in range and connect to the required network.""" network = self._find_configured_network() if network is None: raise error.TestFail('Network with ssid=%s is not found', self.SSID) self.chrome_networking.connect_to_network(network) def _verify_device_roamed(self): """Verify that the device has roamed between networks. @raises error.TestFail if connect to second AP has failed. """ # Give the DUT some time to roam to the other AP and connect. time.sleep(self.chrome_networking.SHORT_TIMEOUT) required_network_service_list = self._find_configured_network() # Check if the network exists and it is in connected state. if required_network_service_list is None: raise error.TestFail('Network with ssid=%s is not found', self.SSID) if required_network_service_list['ConnectionState'] != 'Connected': raise error.TestFail( 'DUT failed to roam/connect to the second network') if required_network_service_list['ConnectionState'] == 'Connected': logging.info('DUT successfully roamed to the other Open network') def run_once(self, ssid, test): """Run the test. @param ssid: SSID of the APs. @param test: Set by the server test control file depending on the test that is being run. """ self.SSID = ssid with cntc.ChromeNetworkingTestContext() as testing_context: self.chrome_networking = cnta.ChromeNetworkProvider(testing_context) enabled_devices = self.chrome_networking.get_enabled_devices() if (self.chrome_networking.WIFI_DEVICE not in enabled_devices): self.chrome_networking.enable_network_device( self.chrome_networking.WIFI_DEVICE) self.chrome_networking.scan_for_networks() if test == chrome_net_constants.OPEN_CONNECT: self._find_and_connect_to_configured_network() elif test == chrome_net_constants.OPEN_ROAM: self._verify_device_roamed()