# 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_suspend'
METADATA = {
    'contacts': ['chromeos-storage@google.com'],
    'bug_component': 'b:974567',
    'criteria': 'Part of Storage Testing v3',
    'hw_agnostic': False
}
ATTRIBUTES = 'suite:storage-qual-pdp-stress, suite:storage-qual-avl-v3'
TEST_TYPE = 'Server'
DEPENDENCIES = 'servo_state:WORKING'
PRIORITY = 191
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.SuspendStress'],
                ignore_test_failures=False,
                max_run_sec=28800,
                ephemeraldevserver=False,
                report_skipped=True,
                command_args=args)

parallel_simple(run, machines)
