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

parallel_simple(run, machines)
