# 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_ChannelHop(wifi_cell_test_base.WiFiCellTestBase):
    """Tests roaming when an AP changes channels on an SSID."""

    version = 1
    ORIGINAL_FREQUENCY = 2412
    ORIGINAL_BSSID = "00:01:02:03:04:05"

    def run_once(self):
        """Test body."""
        freq = network_WiFi_ChannelHop.ORIGINAL_FREQUENCY
        ssid = self.context.router.build_unique_ssid()
        ap_config = hostap_config.HostapConfig(
                ssid=ssid,
                frequency=freq,
                mode=hostap_config.HostapConfig.MODE_11B,
                bssid=network_WiFi_ChannelHop.ORIGINAL_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()
        self.context.client.check_iw_link_value(
                iw_runner.IW_LINK_KEY_FREQUENCY,
                freq)
        self.context.router.deconfig()

        # This checks both channel jumping on the same BSSID and channel
        # jumping between BSSIDs, all inside the same SSID.
        for freq, bssid in ((2437, network_WiFi_ChannelHop.ORIGINAL_BSSID),
                            (2462, network_WiFi_ChannelHop.ORIGINAL_BSSID),
                            (2422, "06:07:08:09:0a:0b"),
                            (2447, "0c:0d:0e:0f:10:11")):
            # Wait for the disconnect to happen.
            success, state, elapsed_seconds = \
                    self.context.client.wait_for_service_states(ssid,
                            ['idle'], 30)
            if not success:
                raise error.TestFail(
                        'Failed to disconnect from "%s" in %f seconds (state=%s)' %
                        (ssid, elapsed_seconds, state))

            # 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=hostap_config.HostapConfig.MODE_11B,
                    bssid=bssid)
            self.context.configure(ap_config)

            # Wait for the DUT to scan and acquire the AP at the new
            # frequency.
            success, state, elapsed_seconds = \
                    self.context.client.wait_for_service_states(ssid,
                            self.context.client.CONNECTED_STATES, 30)
            if not success:
                raise error.TestFail(
                        'Failed to connect to "%s" in %f seconds (state=%s)' %
                        (ssid, elapsed_seconds, state))

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

            # Verify that the client switched to new frequency
            self.context.client.check_iw_link_value(
                    iw_runner.IW_LINK_KEY_FREQUENCY,
                    freq)
            self.context.router.deconfig()
