# Copyright 2022 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

AUTHOR = "hbarnor, ChromiumOS"
NAME = "nbr_EndToEndTest.basic_wifi"
METADATA = {
  "contacts": [
    "chromeos-core-services@google.com",
  ],
  "bug_component": "b:1341743",
  "criteria": "Test an NBR N-to-M recovery with Nebraska over WiFi."
}
TIME = "MEDIUM"
TEST_TYPE = "server"
DEPENDENCIES = "servo_state:WORKING, wificell"
HW_DEPS = ['minios']
ATTRIBUTES = "suite:nbr-wifi"

DOC = """
This tests an N-to-M recovery. This means that it will recover from a ToT
install to the current stable. This test will be used in the CQ to ensure that
changes don't break NBR.

In the lab, a job_repo_url will be passed directly to the test. It contains
information about the build to use and the IP address of lab cache server to
download update payloads from. Local runs can use cache servers as well but
the setup is fairly complicated.

Instead you can use the `running_at_desk` arg when running tests locally to
avoid the extra setup needed to access cache servers from your workstation.
`running_at_desk` will copy payloads from gs://chromeos-image-archive/ to a
public bucket that is accessible without additional configuration.

Example usage:
test_that nbr_EndToEndTest.basic_wifi <DUT> --board=<board> --args="build=RXX-XXXXX.X.X"

"""

from autotest_lib.client.common_lib import utils
from autotest_lib.client.common_lib.cros.network import xmlrpc_datatypes
from autotest_lib.client.common_lib.cros.network import xmlrpc_security_types
from autotest_lib.server.cros.network import hostap_config

args_dict = utils.args_to_dict(args)
servo_args = hosts.CrosHost.get_servo_arguments(args_dict)

def run(machine):
    wpa_config = xmlrpc_security_types.WPAConfig(
            psk='nbr_minios',
            wpa_mode=xmlrpc_security_types.WPAConfig.MODE_PURE_WPA2,
            wpa2_ciphers=[xmlrpc_security_types.WPAConfig.CIPHER_CCMP])
    ap_config = hostap_config.HostapConfig(
            frequency=2412,
            mode=hostap_config.HostapConfig.MODE_11G,
            security_config=wpa_config)
    assoc_params = xmlrpc_datatypes.AssociationParameters()
    assoc_params.security_config = wpa_config
    wifi_configs = [(ap_config, assoc_params)]
    host = hosts.create_host(machine, servo_args=servo_args, **args_dict)
    job.run_test("nbr_EndToEndTest", host=host, wifi_configs=wifi_configs,
                 n2m=False, **args_dict)

job.parallel_simple(run, machines)
