# Copyright 2015 The ChromiumOS Authors
# 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

NAME = "display_LidCloseOpen.mirrored_plug_close_unplug_plug_open"
METADATA = {
    "contacts": ["chromeos-gfx-display@google.com"],
    "bug_component": "b:188154",
    "criteria": "Fails if the checks mentioned below fail."
}
#ATTRIBUTES = "suite:chameleon_hdmi_unstable"
TEST_TYPE = "server"
DEPENDENCIES = 'chameleon, servo_state:WORKING'
JOB_RETRIES = 1

'''
This test remotely emulates external display lid close/open scenario.
This test will fail if DUT doesn't
 - go to docked mode
 - return to the original mode
 - suspend after unplug in docked mode
 - resume after open
 - pass image test
'''

args_dict = utils.args_to_dict(args)
chameleon_args = hosts.CrosHost.get_chameleon_arguments(args_dict)
servo_args = hosts.CrosHost.get_servo_arguments(args_dict)

# Plugged status (before_close, after_close, before_open)
plug_status=[(True, False, True)]

def run(machine):
    host = hosts.create_host(machine, chameleon_args=chameleon_args,
                             servo_args=servo_args)
    job.run_test("display_LidCloseOpen", host=host, plug_status=plug_status,
                 test_mirrored=True,
                 tag="mirrored_plug_close_unplug_plug_open")

parallel_simple(run, machines)
