# 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)