# 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_basic_info'
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 = 200
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.InternalDeviceTypeCheck', 'storage.HealthInfo', 'storage.FfuSupport'],
                ignore_test_failures=False,
                max_run_sec=1200,
                ephemeraldevserver=False,
                report_skipped=True,
                command_args=args)

parallel_simple(run, machines)
