# Copyright (c) 2010 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.

AUTHOR = "Chrome OS Team"
TIME = "LONG"
NAME = "NetworkWiFi"
TEST_CATEGORY = "Stress"
TEST_CLASS = "suite"
TEST_TYPE = "server"

DOC = """
This test suite runs automated WiFi enclosure tests that should all pass.

WiFiMatFunc and WiFiSecMat make up a suite of 3-machine tests to validate
basic WiFi functionality. One client, one server, and one programmable WiFi
AP/Router are required (either off-the-shelf with a network-accesible CLI or a
Linux/BSD system with a WiFi card that supports HostAP functionality).

Configuration information to run_test:

server     - the IP address of the server (automatically filled in)
client     - the IP address of the client (automatically filled in)
router     - the IP address of the WiFi AP/Router and the names of the
             wifi and wired devices to configure
"""

import os
import time

from autotest_lib.client.common_lib import error
from autotest_lib.server import site_host_attributes, site_remote_power
from autotest_lib.server import site_wifitest
from autotest_lib.server.hosts import ssh_host


# Time in seconds to leave power off during power cycle.
POWER_CYCLE_TIME_SECS = 1

# Timeout in seconds for waiting for APs to come back from power cycle.
POWER_CYCLE_TIMEOUT_SECS = 120

# Time to wait between each ssh check to
POWER_CYCLE_SLEEP_SECS = 30


def run_server_tests(machine):
  client_attributes = site_host_attributes.HostAttributes(machine)
  remote_power = site_remote_power.RemotePower(machine)

  if remote_power:
    remote_power.set_power_on()
  else:
    raise error.TestNAError('No power switch configured.')

  # Power cycle the entire unit prior to testing. Not expecting any exceptions,
  # but shouldn't leave power off no matter what happens.
  try:
    remote_power.set_power_off()
    time.sleep(POWER_CYCLE_TIME_SECS)
  finally:
    remote_power.set_power_on()

  # Wait for devices to come back.
  router = ssh_host.SSHHost(client_attributes.router_addr)
  server = ssh_host.SSHHost(client_attributes.server_addr)
  timeout = time.time() + POWER_CYCLE_TIMEOUT_SECS
  while True:
    time.sleep(POWER_CYCLE_SLEEP_SECS)

    if router.is_up() and server.is_up():
      break

    if time.time() > timeout:
      raise error.TestFail('Network hardware did not come back after power '
                           'cycle.')

  args.append('router_addr=' + str(client_attributes.router_addr))
  args.append('server_addr=' + str(client_attributes.server_addr))

  site_wifitest.run_test_dir('network_WiFiSecMat', job, args, machine)
  site_wifitest.run_test_dir('network_WiFiMatFunc', job, args, machine)
  site_wifitest.run_test_dir('network_WiFiManager', job, args, machine)


parallel_simple(run_server_tests, machines)
