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

NAME = "Kernel Per Build Regression"
AUTHOR = "Chrome OS Team"
TIME = "SHORT"
TEST_CATEGORY = "Functional"
TEST_CLASS = "suite"
TEST_TYPE = "server"

DOC = """This test suite runs automated tests that should all pass
and that verifies basic system call capabilities are functional."""

from autotest_lib.client.cros import cros_logging


CLIENT_TESTS = [
    # 4096: Bytes of random data.
    # 151 : Random seed.
    # 1000: Number of loop execution attempts before
    #       exiting normally.
    # 64  : Number of vfork() subprocesses.
    # 0   : No verbosity. [0..5]
    ('crashme', { 'args_list': '4096 151 1000 64 0' }),
    # Memory stress.
    ('hardware_SAT', {}),
    ('kernel_fs_Inplace', {'dir':'/tmp', 'scratch':'/tmp/.inplace'}),
    ('kernel_fs_Inplace', {'dir':'/tmp', 'scratch':'/home/chronos/user/.ecrypt'}),
    # Check that TPM is present and started and we can talk to it.
    ('kernel_TPMPing', {}),
    # Call every syscall sequentially with special value in a single
    # register.  The special value will be rotated through each
    # register parameter.
    ('scrashme', { 'args_list': '--mode rotate' }),
    # Pass # pointer to 'structs filled with 0xd5'.
    ('scrashme', { 'args_list': '--mode rotate -SD5' }),
    # Use zero as all regparms.
    ('scrashme', { 'args_list': '--mode rotate -z' }),
]


SERVER_TESTS = [
]


def run_client_test(machine):
    client = hosts.create_host(machine)

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


def run_server_test(machine):
    client = hosts.create_host(machine)
    for test, argv in SERVER_TESTS:
        job.run_test(test, host=client, **argv)


parallel_simple(run_server_test, machines)
job.parallel_on_machines(run_client_test, machines)
