# 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"
NAME = "BVT"
TIME = "SHORT"
TEST_CATEGORY = "Functional"
TEST_CLASS = "suite"
TEST_TYPE = "server"

DOC = """
This test suite runs automated tests that should all pass and that verify
that a build has some minimal functionality.  These are meant to run quickly
in less than 30 minutes and should maximize coverage.
"""

from autotest_lib.client.cros import cros_logging
from autotest_lib.server import site_host_attributes

TESTS = [
  ('platform_AccurateTime', {}),
  ('platform_FilePerms', {}),
  ('platform_HighResTimers', {}),
  ('platform_KernelVersion', {}),
  ('platform_OSLimits', {}),
  ('platform_PartitionCheck', {}),
  ('build_RootFilesystemSize', {}),
  ('desktopui_ChromeFirstRender', {}),
  ('desktopui_FlashSanityCheck', {}),
  ('desktopui_KillRestart', {'binary': '^chrome$',
                             'tag': 'chrome'}),
  ('desktopui_KillRestart', {'binary': '^session_manager$',
                             'tag': 'session'}),
  ('desktopui_WindowManagerFocusNewWindows', {}),
# TODO(ericli): reenable it after screen locker is enabled.
# http://code.google.com/p/chromium-os/issues/detail?id=7758
#  ('desktopui_ScreenLocker', {}),
  ('graphics_WindowManagerGraphicsCapture', {}),
  ('logging_CrashSender', {}),
  ('logging_UserCrash', {}),
  ('login_BadAuthentication', {}),
  ('login_CryptohomeIncognitoMounted', {}),
  ('login_CryptohomeMounted', {}),
  ('login_CryptohomeUnmounted', {}),
  ('login_CryptohomeIncognitoUnmounted', {}),
  ('login_LoginSuccess', {'tag': 'default'}),
  ('login_LoginSuccess', {'creds': '$apps', 'tag': 'apps'}),
  ('login_OwnershipNotRetaken', {}),
  ('login_OwnershipTaken', {}),
  ('login_RemoteLogin', {}),
  ('network_DisableInterface', {'iface_name': 'wlan0',
                                'tag': 'wlan0'}),
  ('network_Ping', {}),
]


def run_tests(machine):
  client = hosts.create_host(machine)
  client_attributes = site_host_attributes.HostAttributes(machine)

  client_at = autotest.Autotest(client)
  for test, argv in TESTS:
    client_at.run_test(test, **argv)

  if not client_attributes.has_resume_bug:
    client_at.run_test('power_Resume')

  # Disable log rotation while shutting down just in case
  # platform_Shutdown needs to find logs.
  log_pauser = cros_logging.LogRotationPauser(client)
  log_pauser.begin()
  client.reboot()
  client_at.run_test('platform_Shutdown')
  log_pauser.end()


# TODO(pauldean): Remove redundant code once distribute_across_machines
# has baked in the lab.  Remove run_tests function and
# job.parallel_on_machines call.
if len(machines) > 1:
  TESTS += [
    ('power_Resume', {}, [], ['has_resume_bug']),
    ('platform_Shutdown', {}),
  ]
  job.distribute_across_machines(TESTS, machines)
else:
  job.parallel_on_machines(run_tests, machines)
