# Copyright 2014 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from autotest_lib.client.common_lib import utils

NAME = "MemoryQual.quick"
METADATA = {
    "contacts": ["cros-avl-memory@google.com"],
    "bug_component": "b:167260",
    "criteria": "This test is a benchmark test",
    "hw_agnostic": False,
}
ATTRIBUTES = "suite:memory_qual_quick"
TIME = "MEDIUM"
TEST_CATEGORY = "Stress"
TEST_CLASS = "suite"
TEST_TYPE = "server"
PY_VERSION = 3

DOC = """
Sequence for testing the Memory Qual running from the fixed devices.
"""

CLIENT_TESTS= [
    ('hardware_MemoryThroughput', {
        'tag': 'memory_qual', 'test': 'rd', 'warmup': 100,
        'num_iterations': 5, 'parallel': 4, 'sizes': [67108864,],
        'criteria': 25*1024}),
    ('hardware_Memtester', {
        'tag' : 'quick', 'size' : 10 * 1024, 'loop' : 1}),
    ('hardware_SAT', {
        'tag' : 'quick', 'seconds' : 10}),
]

def run_client_test(machine):
    client = hosts.create_host(machine)
    client_at = autotest.Autotest(client)
    for test, argv in CLIENT_TESTS:
        client.reboot()
        client_at.run_test(test, **argv)

keyval = dict()
try:
    keyval['bug_id'] = bug_id
    keyval['part_id'] = part_id
except NameError:
    # bug_id and/or part_id variables not defined
    pass
utils.write_keyval(job.resultdir, keyval)

job.parallel_on_machines(run_client_test, machines)
