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

from autotest_lib.client.common_lib import utils

AUTHOR = "puthik"
NAME = "MemoryQual.moblab"
ATTRIBUTES = "suite:memory_qual"
TIME = "LENGTHY"
TEST_CATEGORY = "Stress"
TEST_CLASS = "suite"
TEST_TYPE = "server"

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

HOUR_IN_SECS=60*60

CLIENT_TESTS= [
    ('platform_MemCheck', {}),
    ('hardware_RamFio', {
        'requirements': [('ram_suite', [])]}),
    ('hardware_MemoryThroughput', {
        'tag': 'memory_qual', 'test': 'bcopy', 'warmup': 100,
        'num_iterations': 100, 'parallel': 2,
        'sizes' : [ 1024, 2048, 4096, 8192,
                    15360, 16384, 24576,
                    30720, 32768, 33792,
                    49152, 65536, 98304,
                    130048, 131072, 256000,
                    262144, 393216, 524288,
                    1048576, 1468006, 1572864,
                    1966080, 2097152, 2228224,
                    2621440, 3072000, 3145728,
                    3276800, 4194304, 8388608,
                    16777216, 33554432, 67108864]}),
    ('hardware_MemoryLatency', {
        'sample_size_kb': [ int(2), int(192), int(1024)]}),
    ('hardware_Memtester', {
        'tag' : 'memory_qual', 'loop' : 100}),
    ('hardware_SAT', {
        'tag' : 'memory_qual', 'seconds' : 8 * HOUR_IN_SECS}),
    ('power_MemorySuspend', {
        'tag' : 'memory_qual', 'num_suspends' : 2}),
]

CLIENT_X86_TESTS= [
    ('hardware_UnsafeMemory', {
        'sec' : 5 * HOUR_IN_SECS}),
]

SERVER_TESTS= [
    ('hardware_MemoryIntegrity', {
        'tag' : 'idle', 'seconds' : HOUR_IN_SECS, 'suspend': False}),
    ('hardware_MemoryIntegrity', {
        'tag' : 'suspend', 'seconds' : HOUR_IN_SECS, 'suspend': True}),
]

def run_client_test(machine):
    client = hosts.create_host(machine)
    client_at = autotest.Autotest(client)
    client_tests = (CLIENT_TESTS + CLIENT_X86_TESTS if client.get_arch() in
        ('i386', 'i686', 'x86_64') else CLIENT_TESTS)
    for test, argv in client_tests:
        client.reboot()
        client_at.run_test(test, **argv)

def run_server_test(machine):
    client = hosts.create_host(machine)
    for test, argv in SERVER_TESTS:
        client.reboot()
        job.run_test(test, client_ip=machine, **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)
parallel_simple(run_server_test, machines)
