91 lines
3.6 KiB
Python
91 lines
3.6 KiB
Python
# Copyright (c) 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 stressing DUT by switching Chameleon EDID."""
|
|
|
|
import glob
|
|
import logging
|
|
import os
|
|
import xmlrpclib
|
|
|
|
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_EdidStress(test.test):
|
|
"""Server side external display test.
|
|
|
|
This test switches Chameleon EDID from among a large pool of EDIDs, tests
|
|
DUT recognizes the emulated monitor and emits the correct video signal to
|
|
Chameleon.
|
|
"""
|
|
version = 1
|
|
|
|
_EDID_TYPES = {'HDMI': {'HDMI', 'MHL', 'DVI'},
|
|
'DP': {'DP'},
|
|
'VGA': {'VGA'}}
|
|
|
|
def run_once(self, host, edid_set):
|
|
|
|
def _get_edid_type(s):
|
|
i = s.rfind('_') + 1
|
|
j = len(s) - len('.txt')
|
|
return s[i:j].upper()
|
|
|
|
edid_path = os.path.join(self.bindir, 'test_data', 'edids',
|
|
edid_set, '*')
|
|
|
|
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('See the display on Chameleon: port %d (%s)',
|
|
chameleon_port.get_connector_id(),
|
|
chameleon_port.get_connector_type())
|
|
|
|
connector = chameleon_port.get_connector_type()
|
|
supported_types = self._EDID_TYPES[connector]
|
|
|
|
failed_edids = []
|
|
for filepath in glob.glob(edid_path):
|
|
filename = os.path.basename(filepath)
|
|
edid_type = _get_edid_type(filename)
|
|
if edid_type not in supported_types:
|
|
logging.info('Skip EDID: %s...', filename)
|
|
continue
|
|
|
|
logging.info('Use EDID: %s...', filename)
|
|
try:
|
|
with chameleon_port.use_edid(
|
|
edid.Edid.from_file(filepath, skip_verify=True)):
|
|
resolution = utils.wait_for_value_changed(
|
|
display_facade.get_external_resolution,
|
|
old_value=None)
|
|
if resolution is None:
|
|
raise error.TestFail('No external display detected on DUT')
|
|
if screen_test.test_resolution(resolution):
|
|
raise error.TestFail('Resolution test failed')
|
|
except (error.TestFail, xmlrpclib.Fault) as e:
|
|
logging.warning(e)
|
|
logging.error('EDID not supported: %s', filename)
|
|
failed_edids.append(filename)
|
|
|
|
if failed_edids:
|
|
message = ('Total %d EDIDs not supported: ' % len(failed_edids)
|
|
+ ', '.join(failed_edids))
|
|
logging.error(message)
|
|
raise error.TestFail(message)
|