# Copyright 2020 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

AUTHOR = 'abergman, chromeos-engprod-platform-syd'
NAME = 'storage_qual_v2_stress_24'
METADATA = {
    'contacts': ['chromeos-storage@google.com'],
    'bug_component': 'b:974567',
    'criteria': 'Part of storage AVL qualification suite',
    'hw_agnostic': False
}
ATTRIBUTES = 'suite:storage_qual_v2_xl, suite:storage_qual_v2_l'
TIME = 'long'
TEST_CATEGORY = 'Stress'
TEST_CLASS = 'Hardware'
TEST_TYPE = 'Server'
PY_VERSION = 3
PRIORITY = 77
MAX_RESULT_SIZE_KB = 1024 * 1024
JOB_RETRIES = 0
REQUIRE_SSP = True
FAST = False
DEPENDENCIES = 'dut:2'

DOC = '''
Run the Tast-based storage qualification quick test.

Tast is an integration-testing framework analogous to the test-running portion
of Autotest. See https://chromium.googlesource.com/chromiumos/platform/tast/ for
more information.

See http://go/tast-failures for information about investigating failures.
'''
import tempfile
import yaml

keyval = dict()
keyval['storage_qual_version'] = 2
keyval['bug_id'] = bug_id
keyval['part_id'] = part_id
utils.write_keyval(job.resultdir, keyval)

def run(machine):
    args_dict = globals().get('args_dict', dict())

    with tempfile.NamedTemporaryFile(suffix='.yaml', mode='w+', encoding='utf-8') as temp_file:
        # Writing test arguments to yaml file except for wrapper-related arguments.
        test_args = dict()
        for key in args_dict:
            if key.startswith('tast_'):
                test_args[key] = args_dict[key]
        yaml.safe_dump(test_args,
                      stream=temp_file,
                      default_flow_style=False,
                      allow_unicode=True)

        job.run_test('tast',
                    host=hosts.create_host(machine),
                    test_exprs=['storage.FullQualificationStress.stress'],
                    ignore_test_failures=False,
                    max_run_sec=28800,
                    command_args=args,
                    varsfiles=[temp_file.name])

parallel_simple(run, machines)
