# 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.

# Do not edit manually. Generated using ~/chromiumos/src/platform/dev/net/gen_control_files.py

AUTHOR = 'Chromium OS team'
NAME = 'tast.cellular_ota-fi-platform'
METADATA = {
    "contacts": ["chromeos-cellular-team@google.com"],
    "bug_component": "b:167157", # ChromeOS > Platform > Connectivity > Cellular
    }
TIME = 'MEDIUM'
TEST_TYPE = 'Server'
ATTRIBUTES = 'suite:cellular_ota, suite:cellular_repair'
MAX_RESULT_SIZE_KB = 1024 * 1024
PY_VERSION = 3
DEPENDENCIES = "carrier:fi, cellular_modem_state:NORMAL"

DOC = '''

See https://chromium.googlesource.com/chromiumos/platform/tast/ for
more information.

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

import json
import tempfile
import yaml

def run(machine):
    host = hosts.create_host(machine)
    with tempfile.NamedTemporaryFile(suffix='.yaml', mode='w+') as temp_file:
        host_info = host.host_info_store.get()
        yaml.safe_dump({'autotest_host_info_labels':
                        json.dumps(host_info.labels)},
                        stream=temp_file)
        temp_file.flush()

        host.reboot()
        job.run_test('tast',
                    host=host,
                    clear_tpm = False,
                    test_exprs=['("group:cellular" && "cellular_sim_active" && !"cellular_unstable" && !"cellular_run_isolated" && !"cellular_e2e" && (!"cellular_carrier_dependent" || "cellular_carrier_fi") && !"cellular_sms")'],
                    ignore_test_failures=True, max_run_sec=10800,
                    command_args=args,
                    varsfiles=[temp_file.name]
                    )

parallel_simple(run, machines)
