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

NAME = 'storage_testing_v3_stress_write_2'
METADATA = {
    'contacts': ['chromeos-storage@google.com'],
    'bug_component': 'b:974567',
    'criteria': 'Part of Storage Testing v3',
    'hw_agnostic': False
}
ATTRIBUTES = 'suite:storage-qual-avl-v3'
TEST_TYPE = 'Server'
DEPENDENCIES = 'servo_state:WORKING'
PRIORITY = 193
MAX_RESULT_SIZE_KB = 1024 * 1024
JOB_RETRIES = 0
REQUIRE_SSP = True
FAST = False

from autotest_lib.client.common_lib import utils

args_dict = utils.args_to_dict(args)
assert 'servo_state:WORKING' in DEPENDENCIES
servo_args = hosts.CrosHost.get_servo_arguments(args_dict)

keyval = dict()
keyval['storage_qual_version'] = 3
try:
    keyval['bug_id'] = args_dict['bug_id']
    keyval['part_id'] = args_dict['part_id']
except KeyError:
    # bug_id and/or part_id variables not defined
    pass

try:
    # process qual_run_id separately to ensure that bug_id and part_id
    # are captured even if it's not a qual run
    keyval['qual_run_id'] = args_dict['qual_run_id']
except KeyError:
    # qual_run_id not defined
    pass

utils.write_keyval(job.resultdir, keyval)

def run(machine):
    job.run_test('tast',
                host=hosts.create_host(machine, servo_args=servo_args),
                test_exprs=['storage.StressWrite.iteration_2'],
                ignore_test_failures=False,
                max_run_sec=28800,
                ephemeraldevserver=False,
                report_skipped=True,
                command_args=args)

parallel_simple(run, machines)
