# Copyright 2019 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from autotest_lib.server import utils

AUTHOR = "coconutruben"
NAME = "power_Monitoring"
PURPOSE = "Continuously measure power with servod while running client tests."
CRITERIA = "This test is a wrapper for ServodWrapper wrapped test(s)."
TIME = "LONG"
TEST_CATEGORY = "Benchmark"
TEST_CLASS = "power"
TEST_TYPE = "server"
DEPENDENCIES = "servo_state:WORKING"

DOC = """
This wrapper test runs the tests specified under a given suite in a continuous
loop for a given amount of time. If the DUT runs out of power, the test charges
it before continuing the test suite.

So this test is designed to collect all relevant power tests for many loops.
This has three main advantages and use cases:
- There is a wider spread of battery charge percentages that tests run under
  as tests don't recharge at the end individually.
- This runs as a one stop test and requires less configuration and scheduling.
- As this runs as one test this allows to collect multiple samples of the same
  client test under the same OS image in environments where a new test triggers
  an image update.

Based on the above this test might be a good fit for your use case or not.

This test makes the following assumptions:
1. The DUT is attached to a servo device that supports charging and
discharging (currently only v4).

2. Servod is already running, and its host and port are provided to this
autotest.

3. The workstation (or where the autotest is kicked off from) should be in same
timezone with the DUT.

Sample usage:
test_that <ip address of DUT> power_Monitoring --args \
'suite=power_monitoring runtime_hr=20 servo_host=localhost servo_port=9999'

What are the parameters (all optional with defaults):
suite: the test suite to run.
runtime_hr: desired runtime in hours.
start_charging_level: battery charge percent when charging triggers.
stop_charging_level: battery charge percent when charging stops.
servo_host: host of servod instance.
servo_port: port that the servod instance is on.
pdash_note: User supplied note to tag the specific test; optional.
"""
# Workaround to make it compatible with moblab autotest UI.
global args_dict
try:
    args_dict
except NameError:
    args_dict = utils.args_to_dict(args)
servo_args = hosts.CrosHost.get_servo_arguments(args_dict)

def run(machine):
    host = hosts.create_host(machine, servo_args=servo_args)
    job.run_test('power_Monitoring', host=host, config=args_dict,
                 disable_sysinfo=True)
parallel_simple(run, machines)
