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