1c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev# Copyright 2015 The Chromium OS Authors. All rights reserved. 2c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev# Use of this source code is governed by a BSD-style license that can be 3c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev# found in the LICENSE file. 4c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev 5c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadevimport time 6c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev 7527ebab2e54445f1af8a6a5f274cc8529f40ca29Bindu Mahadevfrom autotest_lib.client.common_lib import error 8c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadevfrom autotest_lib.server import autotest 9c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadevfrom autotest_lib.server import site_linux_system 10c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadevfrom autotest_lib.server.cros.network import hostap_config 11c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadevfrom autotest_lib.server.cros.network import wifi_cell_test_base 12c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadevfrom autotest_lib.client.common_lib.cros.network \ 13c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev import chrome_net_constants 14c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev 15c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadevclass network_WiFi_RoamSuspendEndToEnd(wifi_cell_test_base.WiFiCellTestBase): 16c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev """Base class that configures two APs with the same SSID that will be used 17c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev by RoamWifiEndToEnd client test to test networking UI. 18c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev 19c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev The test is run in two phases. First, where we configure the first AP and 20c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev trigger the client test. Second, where we Suspend/Resume the DUT using servo 21c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev and configure a second AP, tear down the first and trigger client side test. 22c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev 23c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev """ 24c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev version = 1 25c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev 26c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev 27c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev def _config_ap(self, channel, mode, ssid=None): 28c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev """Configure an AP with the given parameters. 29c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev 30c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev @param channel: int Wifi channel to conduct test on. 31c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev @param ssid: Name to be assigned to the Wifi network. 32c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev @param mode: Mode for the AP configuration. 33c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev 34c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev """ 35c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev ap_config = hostap_config.HostapConfig(channel=channel, mode=mode, 36c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev ssid=ssid) 37c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev self.context.configure(ap_config, multi_interface=True) 38c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev 39c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev 40c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev def _do_suspend_deconfig(self, timeout_seconds): 41c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev """Suspend the DUT and deconfigure the AP. 42c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev 43c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev @param timeout_seconds: Number of seconds to suspend the DUT. 44c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev 45c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev """ 46c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev if self._host.servo.get('lid_open') == 'not_applicable': 47c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev self.context.client.do_suspend_bg(timeout_seconds) 48c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev self.context.router.deconfig_aps(instance=0) 49c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev else: 50c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev self._host.servo.lid_close() 51c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev self._host.wait_down(timeout=timeout_seconds) 52c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev self.context.router.deconfig_aps(instance=0) 53c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev self._host.servo.lid_open() 54c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev self._host.wait_up(timeout=timeout_seconds) 55c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev 56c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev 57c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev def run_once(self, host): 58c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev """Set up two APs, run the client side test and then exit. 59c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev 60c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev """ 61c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev self.context.router.require_capabilities( 62c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev [site_linux_system.LinuxSystem.CAPABILITY_MULTI_AP]) 63c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev self.context.router.deconfig() 64c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev self._host = host 65c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev 66527ebab2e54445f1af8a6a5f274cc8529f40ca29Bindu Mahadev if not self._host.servo: 67527ebab2e54445f1af8a6a5f274cc8529f40ca29Bindu Mahadev raise error.TestNAError( 68527ebab2e54445f1af8a6a5f274cc8529f40ca29Bindu Mahadev 'Servo object returned None. Check if servo is missing or bad') 69527ebab2e54445f1af8a6a5f274cc8529f40ca29Bindu Mahadev 70c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev # Configure first AP with channel 5 and mode G and default ssid. 71c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev self._config_ap(5, hostap_config.HostapConfig.MODE_11G) 72c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev 73c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev client_at = autotest.Autotest(self._host) 74c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev ssid = self.context.router.get_ssid(instance=0) 75c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev time.sleep(chrome_net_constants.LONG_TIMEOUT) 76c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev client_at.run_test('network_RoamWifiEndToEnd', 77c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev ssid=ssid, test=chrome_net_constants.OPEN_CONNECT) 78c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev 79c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev # Configure second AP with channel 149, mode N and same ssid as before. 80c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev self._config_ap(149, hostap_config.HostapConfig.MODE_11N_PURE, ssid) 81c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev ssid = self.context.router.get_ssid(instance=1) 82c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev 83c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev # Suspend the DUT for 15 seconds and tear down the first AP. 84c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev self._do_suspend_deconfig(15) 85c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev client_at.run_test('network_RoamWifiEndToEnd', 86c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev ssid=ssid, test=chrome_net_constants.OPEN_ROAM) 87c614a8866b14cff422d8a4d06a26033fa28afa36Bindu Mahadev self.context.router.deconfig() 88