# 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-softbank-is_modem_up'
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:softbank"

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=['cellular.IsModemUp'],
                    ignore_test_failures=True, max_run_sec=10800,
                    command_args=args,
                    varsfiles=[temp_file.name]
                    )

parallel_simple(run, machines)
