# Copyright (c) 2014 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 tcpdump_analyzer
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 packet_capturer
from autotest_lib.server.cros.network import wifi_cell_test_base


class network_WiFi_HiddenScan(wifi_cell_test_base.WiFiCellTestBase):
    """Test scanning behavior when a hidden SSID is configured."""

    version = 1

    BROADCAST_SSID = ''

    def run_once(self):
        """Test body."""
        ap_config = hostap_config.HostapConfig(channel=1, hide_ssid=True)

        # Start capture before starting anything else.
        self.context.capture_host.start_capture(
                ap_config.frequency,
                width_type=ap_config.packet_capture_mode,
                snaplen=packet_capturer.SNAPLEN_WIFI_PROBE_REQUEST)

        # We're looking for the MAC address, so disable randomization.
        with self.context.client.mac_address_randomization(False):
            # Set up the router and associate the client with it.
            self.context.configure(ap_config)
            test_ssid = self.context.router.get_ssid()
            assoc_params = xmlrpc_datatypes.AssociationParameters(
                    ssid=test_ssid, is_hidden=True)

            self.context.assert_connect_wifi(assoc_params)
            results = self.context.capture_host.stop_capture()

        if len(results) != 1:
            raise error.TestError('Expected to generate one packet '
                                  'capture but got %d instead.' %
                                  len(results))
        probe_ssids = tcpdump_analyzer.get_probe_ssids(
                results[0].local_pcap_path,
                probe_sender=self.context.client.wifi_mac)
        if len(probe_ssids) != 2:
            raise error.TestError('Expected exactly two SSIDs, but got %s' %
                                  probe_ssids)
        if probe_ssids - {self.BROADCAST_SSID, test_ssid}:
            raise error.TestError('Unexpected probe SSIDs: %s' % probe_ssids)
