# 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'}),
# TODO(cmasone): http://crosbug.com/14008
#  ('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)
