# 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.cros.network import xmlrpc_datatypes
from autotest_lib.server import site_linux_system
from autotest_lib.server.cros.network import hostap_config
from autotest_lib.server.cros.network import wifi_cell_test_base


class network_WiFi_IBSS(wifi_cell_test_base.WiFiCellTestBase):
    """Test that we can connect to an IBSS (Adhoc) endpoint."""
    version = 1


    def run_once(self):
        """Body of the test."""
        self.context.client.require_capabilities(
                [site_linux_system.LinuxSystem.CAPABILITY_IBSS])
        self.context.router.require_capabilities(
                [site_linux_system.LinuxSystem.CAPABILITY_IBSS])
        # In the past, we have seen a bug where a previous association on a
        # channel where IBSS was disallowed would prohibit wpa_supplicant
        # from setting the interface to adhoc mode (since the kernel refuses
        # to allow adhoc mode on the previous channel).
        configuration = hostap_config.HostapConfig(
                channel=52, mode=hostap_config.HostapConfig.MODE_11A)
        self.context.configure(configuration)
        assoc_params = xmlrpc_datatypes.AssociationParameters(
                ssid=self.context.router.get_ssid())
        self.context.assert_connect_wifi(assoc_params)
        self.context.client.shill.disconnect(assoc_params.ssid)
        configuration = hostap_config.HostapConfig(
                frequency=2412, mode=hostap_config.HostapConfig.MODE_11B)
        self.context.configure(configuration, is_ibss=True)
        assoc_params = xmlrpc_datatypes.AssociationParameters(
                ssid=self.context.router.get_ssid(),
                discovery_timeout=30,
                association_timeout=30,
                configuration_timeout=30,
                station_type=xmlrpc_datatypes.
                        AssociationParameters.STATION_TYPE_IBSS)
        self.context.assert_connect_wifi(assoc_params)
        self.context.assert_ping_from_dut()
        self.context.client.shill.disconnect(assoc_params.ssid)
        self.context.router.deconfig_aps()
