# Copyright 2020 The ChromiumOS Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# TODO(b/342928657): Remove from PVS testplans and remove this file.

AUTHOR = "ChromeOS Team"
NAME = "firmware_FWupdateThenSleep.batteryonly"
METADATA = {
    "contacts": ["chromeos-faft@google.com", "jbettis@chromium.org"],
    "bug_component": "b:792402",  # ChromeOS > Platform > Enablement > Firmware > FAFT
    "criteria": "Run RW firmware update while on battery, then sleep and wake",
}
DEPENDENCIES = "servo_state:WORKING"
TIME = "MEDIUM"
TEST_TYPE = "server"

DOC = """
Run RW firmware update using chromeos-firmwareupdate --mode=recovery --wp=1
while on battery, then sleep and wake, then make sure the host responds and the
flash contents don't change.

If running on Servo V4 Type-C with power passthrough, the test can
change the power supply state.  Otherwise, it will require manually
removing AC power before starting the test.

Example:
test_that --board=BOARD --args 'servo_host=SERVO_IP' DUT_IP firmware_FWupdateThenSleep.batteryonly
"""

from autotest_lib.client.common_lib import utils

args_dict = utils.args_to_dict(args)
servo_args = hosts.CrosHost.get_servo_arguments(args_dict)
pdtester_args = hosts.CrosHost.get_pdtester_arguments(args_dict)


def run_firmwareupdate(machine):
    # Setup the client machine.
    host = hosts.create_host(
        machine, servo_args=servo_args, pdtester_args=pdtester_args
    )
    job.run_test(
        "firmware_FWupdateThenSleep",
        host=host,
        cmdline_args=args,
        battery_only=True,
        wp=1,
        tag="batteryonly",
    )


parallel_simple(run_firmwareupdate, machines)
