# Copyright 2018 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.moblab"
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"
TIME = "LENGTHY"
TEST_CATEGORY = "Stress"
TEST_CLASS = "suite"
TEST_TYPE = "server"
EXTENDED_TIMEOUT = 1209600  # 2 weeks
PY_VERSION = 3

DOC = """
Sequence for qualification new memory part to AVL.
"""

HOUR_IN_SECS=60*60

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

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, timeout=EXTENDED_TIMEOUT, **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)
