# 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 Benchmarks"
AUTHOR = "Chrome OS Team"
TIME = "SHORT"
TEST_CATEGORY = "Benchmark"
TEST_CLASS = "suite"
TEST_TYPE = "server"

DOC = """
This test suite runs automated benchmarks for testing the performance of
the kernel scheduler.
"""

from autotest_lib.client.cros import cros_logging


CLIENT_TESTS = [
    # Bonnie: two results come out zero:
    #  randcreate_read_ksec
    #  randcreate_read_pctcp
    # Not enough space to run these tests
    ('bonnie', {'extra_args':'-s512:256 -r0 -n128'}),
    ('hackbench', {}),
    ('hardware_StorageFio', {'quicktest':'True'}), # raw block device testing
    ('kernel_HdParm', {}),
    ('platform_AesThroughput', {}),
]


SERVER_TESTS = [
    ('platform_BootPerfServer', {'iterations': 1, 'disable_sysinfo': True}),
]


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)
