97 lines
4.1 KiB
Python
97 lines
4.1 KiB
Python
# Copyright 2014 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.
|
|
|
|
"""This is a server side external display test using the Chameleon board."""
|
|
|
|
import logging
|
|
import os
|
|
import random
|
|
import time
|
|
|
|
from autotest_lib.client.bin import utils
|
|
from autotest_lib.client.common_lib import error
|
|
from autotest_lib.client.cros.chameleon import chameleon_port_finder
|
|
from autotest_lib.client.cros.chameleon import chameleon_screen_test
|
|
from autotest_lib.client.cros.chameleon import edid
|
|
from autotest_lib.server import test
|
|
from autotest_lib.server.cros.multimedia import remote_facade_factory
|
|
|
|
|
|
class display_SuspendStress(test.test):
|
|
"""Server side external display test.
|
|
|
|
This test talks to a Chameleon board and a DUT to set up, run, and verify
|
|
external display function of the DUT with DUT being repeatedly
|
|
suspended and resumed.
|
|
"""
|
|
version = 1
|
|
DEFAULT_TESTCASE_SPEC = ('HDMI', 1920, 1080)
|
|
|
|
# TODO: Allow reading testcase_spec from command line.
|
|
def run_once(self, host, test_mirrored=False, testcase_spec=None,
|
|
repeat_count=3, suspend_time_range=(5,7)):
|
|
if test_mirrored and not host.get_board_type() == 'CHROMEBOOK':
|
|
raise error.TestNAError('DUT is not Chromebook. Test Skipped')
|
|
|
|
if testcase_spec is None:
|
|
testcase_spec = self.DEFAULT_TESTCASE_SPEC
|
|
|
|
test_name = "%s_%dx%d" % testcase_spec
|
|
_, width, height = testcase_spec
|
|
test_resolution = (width, height)
|
|
|
|
if not edid.is_edid_supported(host, testcase_spec[1], testcase_spec[2]):
|
|
raise error.TestFail('Error: EDID is not supported by the platform'
|
|
': %s', test_name)
|
|
|
|
edid_path = os.path.join(self.bindir, 'test_data', 'edids', test_name)
|
|
|
|
factory = remote_facade_factory.RemoteFacadeFactory(host)
|
|
display_facade = factory.create_display_facade()
|
|
chameleon_board = host.chameleon
|
|
|
|
chameleon_board.setup_and_reset(self.outputdir)
|
|
finder = chameleon_port_finder.ChameleonVideoInputFinder(
|
|
chameleon_board, display_facade)
|
|
for chameleon_port in finder.iterate_all_ports():
|
|
screen_test = chameleon_screen_test.ChameleonScreenTest(
|
|
host, chameleon_port, display_facade, self.outputdir)
|
|
|
|
logging.info('Use EDID: %s', test_name)
|
|
with chameleon_port.use_edid_file(edid_path):
|
|
# Keep the original connector name, for later comparison.
|
|
expected_connector = utils.wait_for_value_changed(
|
|
display_facade.get_external_connector_name,
|
|
old_value=False)
|
|
logging.info('See the display on DUT: %s', expected_connector)
|
|
|
|
if not expected_connector:
|
|
raise error.TestFail('Error: Failed to see external display'
|
|
' (chameleon) from DUT: %s', test_name)
|
|
|
|
logging.info('Set mirrored: %s', test_mirrored)
|
|
display_facade.set_mirrored(test_mirrored)
|
|
logging.info('Repeat %d times Suspend and resume', repeat_count)
|
|
|
|
count = repeat_count
|
|
while count > 0:
|
|
count -= 1
|
|
if test_mirrored:
|
|
# magic sleep to make nyan_big wake up in mirrored mode
|
|
# TODO: find root cause
|
|
time.sleep(6)
|
|
suspend_time = random.randint(*suspend_time_range)
|
|
logging.info('Going to suspend, for %d seconds...',
|
|
suspend_time)
|
|
display_facade.suspend_resume(suspend_time)
|
|
logging.info('Resumed back')
|
|
|
|
message = screen_test.check_external_display_connected(
|
|
expected_connector)
|
|
if not message:
|
|
message = screen_test.test_screen_with_image(
|
|
test_resolution, test_mirrored)
|
|
if message:
|
|
raise error.TestFail(message)
|