# Copyright (c) 2013 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.

from autotest_lib.server.cros.network import wifi_cell_test_base

class network_WiFi_Roam(wifi_cell_test_base.WiFiCellTestBase):
    """Tests roaming to an AP that changes while the client is awake

    This test run seeks to associate the DUT with an AP with a set of
    association parameters, create a second AP with a second set of
    parameters but the same SSID, and shut down the first DUT.  We
    seek to observe that the DUT successfully connects to the second
    AP in a reasonable amount of time.
    """

    version = 1

    def parse_additional_arguments(self, commandline_args, additional_params):
        """Hook into super class to take control files parameters.

        @param commandline_args dict of parsed parameters from the autotest.
        @param additional_params tuple of (HostapConfig,
                                           AssociationParameters).

        """
        self._router0_conf, self._router1_conf, self._client_conf = (
                additional_params)


    def run_once(self):
        """Test body."""
        # Configure the inital AP.
        self._router0_conf.security_config.install_router_credentials(
                self.context.router.host)
        self.context.configure(self._router0_conf)
        router_ssid = self.context.router.get_ssid()

        # Connect to the inital AP.
        self._client_conf.ssid = router_ssid
        self.context.assert_connect_wifi(self._client_conf)

        # Setup a second AP with the same SSID.
        self._router1_conf.ssid = router_ssid
        self.context.configure(self._router1_conf, multi_interface=True)

        # Tear down the AP instance that the DUT is currently connected to.
        self.context.router.deconfig({ 'instance': 0 })

        # Expect that the DUT will re-connect to the new AP.
        self.context.wait_for_connection(router_ssid,
                                         self._router1_conf.frequency,
                                         ap_num=1);
        self.context.router.deconfig()
