# 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.client.common_lib import error
from autotest_lib.client.common_lib.cros.network import iw_runner
from autotest_lib.client.common_lib.cros.network import xmlrpc_datatypes
from autotest_lib.server.cros.network import hostap_config
from autotest_lib.server.cros.network import wifi_cell_test_base

class network_WiFi_SSIDSwitchBack(wifi_cell_test_base.WiFiCellTestBase):
    """Tests roaming to a previous AP when current AP disappears."""

    version = 1

    FREQUENCY_1 = 2412
    FREQUENCY_2 = 2437
    BSSID_1 = "00:01:02:03:04:05"
    BSSID_2 = "06:07:08:09:0a:0b"
    SSID_1 = "InsideADogItsTooDarkToRead"
    SSID_2 = "HeReallyIsAnIdiot"


    def configure_connect_verify_deconfig_wait(self, ssid, freq, mode, bssid):
        """Configure an AP, connect to it, then tear it all down, again.

        This method does the following: configures the AP, connects to it and
        verifies the connection, deconfigures the AP and waits for the
        disconnect to complete.

        @param ssid string SSID for the new connection.
        @param freq int Frequency which the AP is to support.
        @param mode string AP mode from hostap_config.HostapConfig.MODE_*.
        @param bssid string BSSID for the new connection.

        """
        # Change channels on the AP.  This happens in full view of the DUT
        # and the AP deauths everyone as it exits.
        ap_config = hostap_config.HostapConfig(ssid=ssid, frequency=freq,
                                               mode=mode, bssid=bssid)
        self.context.configure(ap_config)
        assoc_params = xmlrpc_datatypes.AssociationParameters(
                ssid=self.context.router.get_ssid())
        self.context.assert_connect_wifi(assoc_params)

        self.context.assert_ping_from_dut()  # Verify that we're connected.
        self.context.client.check_iw_link_value(
                iw_runner.IW_LINK_KEY_FREQUENCY,
                freq)  # Verify that the client switched to new frequency

        # Deconfig and wait for the DUT to disconnect and end up at 'idle'.
        self.context.router.deconfig()
        self.context.client.wait_for_service_states(
                        network_WiFi_SSIDSwitchBack.SSID_1, ['idle'], 30)


    def run_once(self):
        """Test body."""
        # Connect to the first AP.  This just guarantees that this AP has
        # been placed in the connection manager profile.  Then deconfig.
        self.configure_connect_verify_deconfig_wait(
                network_WiFi_SSIDSwitchBack.SSID_1,
                network_WiFi_SSIDSwitchBack.FREQUENCY_1,
                hostap_config.HostapConfig.MODE_11B,
                network_WiFi_SSIDSwitchBack.BSSID_1)

        # Configure and connect to the second AP.  Then deconfig.
        self.configure_connect_verify_deconfig_wait(
                network_WiFi_SSIDSwitchBack.SSID_2,
                network_WiFi_SSIDSwitchBack.FREQUENCY_2,
                hostap_config.HostapConfig.MODE_11G,
                network_WiFi_SSIDSwitchBack.BSSID_2)

        # Bring the first AP back up.
        ap_config = hostap_config.HostapConfig(
                ssid=network_WiFi_SSIDSwitchBack.SSID_1,
                frequency=network_WiFi_SSIDSwitchBack.FREQUENCY_1,
                mode=hostap_config.HostapConfig.MODE_11B,
                bssid=network_WiFi_SSIDSwitchBack.BSSID_1)
        self.context.configure(ap_config)

        # Instead of explicitly connecting, just wait to see if the DUT
        # re-connects by itself
        success, state, elapsed_seconds = \
                self.context.client.wait_for_service_states(
                        network_WiFi_SSIDSwitchBack.SSID_1,
                        self.context.client.CONNECTED_STATES, 30)
        if (not success or
            state not in self.context.client.CONNECTED_STATES):
            raise error.TestFail(
                    'Failed to connect to "%s" in %f seconds (state=%s)' %
                    (network_WiFi_SSIDSwitchBack.SSID_1, elapsed_seconds,
                     state))

        # Verify that we're connected.
        self.context.assert_ping_from_dut()

        # Verify that the client switched to the original frequency
        self.context.client.check_iw_link_value(
                iw_runner.IW_LINK_KEY_FREQUENCY,
                network_WiFi_SSIDSwitchBack.FREQUENCY_1)
        self.context.router.deconfig()
