1f6bb17f0dcad6ff3ec876e65a035a7823f9d0c7fTom Wai-Hong Tam# Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
2f6bb17f0dcad6ff3ec876e65a035a7823f9d0c7fTom Wai-Hong Tam# Use of this source code is governed by a BSD-style license that can be
3f6bb17f0dcad6ff3ec876e65a035a7823f9d0c7fTom Wai-Hong Tam# found in the LICENSE file.
4f6bb17f0dcad6ff3ec876e65a035a7823f9d0c7fTom Wai-Hong Tam
5f6bb17f0dcad6ff3ec876e65a035a7823f9d0c7fTom Wai-Hong Tam"""This is a server side stressing DUT by switching Chameleon EDID."""
6f6bb17f0dcad6ff3ec876e65a035a7823f9d0c7fTom Wai-Hong Tam
7f6bb17f0dcad6ff3ec876e65a035a7823f9d0c7fTom Wai-Hong Tamimport glob
8f6bb17f0dcad6ff3ec876e65a035a7823f9d0c7fTom Wai-Hong Tamimport logging
9f6bb17f0dcad6ff3ec876e65a035a7823f9d0c7fTom Wai-Hong Tamimport os
1040549c1be2935da67049619e46ca839102c66b17Tom Wai-Hong Tamimport xmlrpclib
11f6bb17f0dcad6ff3ec876e65a035a7823f9d0c7fTom Wai-Hong Tam
12a5e90d95a96acb3464e229337878b3301a45f490Tom Wai-Hong Tamfrom autotest_lib.client.bin import utils
13f6bb17f0dcad6ff3ec876e65a035a7823f9d0c7fTom Wai-Hong Tamfrom autotest_lib.client.common_lib import error
143101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tamfrom autotest_lib.client.cros.chameleon import chameleon_port_finder
153101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tamfrom autotest_lib.client.cros.chameleon import chameleon_screen_test
162588ce1c77ed94ffd9cf53540bb5c2cc351558c7Tom Wai-Hong Tamfrom autotest_lib.client.cros.chameleon import edid
173101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tamfrom autotest_lib.server import test
183101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tamfrom autotest_lib.server.cros.multimedia import remote_facade_factory
19f6bb17f0dcad6ff3ec876e65a035a7823f9d0c7fTom Wai-Hong Tam
20f6bb17f0dcad6ff3ec876e65a035a7823f9d0c7fTom Wai-Hong Tam
213101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tamclass display_EdidStress(test.test):
22f6bb17f0dcad6ff3ec876e65a035a7823f9d0c7fTom Wai-Hong Tam    """Server side external display test.
23f6bb17f0dcad6ff3ec876e65a035a7823f9d0c7fTom Wai-Hong Tam
24f6bb17f0dcad6ff3ec876e65a035a7823f9d0c7fTom Wai-Hong Tam    This test switches Chameleon EDID from among a large pool of EDIDs, tests
25f6bb17f0dcad6ff3ec876e65a035a7823f9d0c7fTom Wai-Hong Tam    DUT recognizes the emulated monitor and emits the correct video signal to
26f6bb17f0dcad6ff3ec876e65a035a7823f9d0c7fTom Wai-Hong Tam    Chameleon.
27f6bb17f0dcad6ff3ec876e65a035a7823f9d0c7fTom Wai-Hong Tam    """
28f6bb17f0dcad6ff3ec876e65a035a7823f9d0c7fTom Wai-Hong Tam    version = 1
29f6bb17f0dcad6ff3ec876e65a035a7823f9d0c7fTom Wai-Hong Tam
305f769562b27e2cb4a54dfc49ad8cc56c86b67b46Tom Wai-Hong Tam    _EDID_TYPES = {'HDMI': {'HDMI', 'MHL', 'DVI'},
31eb3350dc27676af6520b9869f7e9cd46899c00ceTom Wai-Hong Tam                   'DP': {'DP'},
32eb3350dc27676af6520b9869f7e9cd46899c00ceTom Wai-Hong Tam                   'VGA': {'VGA'}}
33f6bb17f0dcad6ff3ec876e65a035a7823f9d0c7fTom Wai-Hong Tam
346abfd627e6786a60f84d7f63d5c8fe02707f1957Kalin Stoyanov    def run_once(self, host, edid_set):
3549567d92b3e8499f8fd96abd2b1f3be6d88ac62bHung-ying Tyan
3649567d92b3e8499f8fd96abd2b1f3be6d88ac62bHung-ying Tyan        def _get_edid_type(s):
3749567d92b3e8499f8fd96abd2b1f3be6d88ac62bHung-ying Tyan            i = s.rfind('_') + 1
3849567d92b3e8499f8fd96abd2b1f3be6d88ac62bHung-ying Tyan            j = len(s) - len('.txt')
3949567d92b3e8499f8fd96abd2b1f3be6d88ac62bHung-ying Tyan            return s[i:j].upper()
4049567d92b3e8499f8fd96abd2b1f3be6d88ac62bHung-ying Tyan
416abfd627e6786a60f84d7f63d5c8fe02707f1957Kalin Stoyanov        edid_path = os.path.join(self.bindir, 'test_data', 'edids',
426abfd627e6786a60f84d7f63d5c8fe02707f1957Kalin Stoyanov                                 edid_set, '*')
433101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam
443101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam        factory = remote_facade_factory.RemoteFacadeFactory(host)
453101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam        display_facade = factory.create_display_facade()
463101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam        chameleon_board = host.chameleon
473101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam
483101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam        chameleon_board.reset()
493101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam        finder = chameleon_port_finder.ChameleonVideoInputFinder(
503101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                chameleon_board, display_facade)
513101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam        for chameleon_port in finder.iterate_all_ports():
523101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam            screen_test = chameleon_screen_test.ChameleonScreenTest(
533101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                chameleon_port, display_facade, self.outputdir)
543101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam
553101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam            logging.info('See the display on Chameleon: port %d (%s)',
563101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                         chameleon_port.get_connector_id(),
573101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                         chameleon_port.get_connector_type())
583101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam
593101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam            connector = chameleon_port.get_connector_type()
603101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam            supported_types = self._EDID_TYPES[connector]
613101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam
623101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam            failed_edids = []
633101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam            for filepath in glob.glob(edid_path):
643101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                filename = os.path.basename(filepath)
653101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                edid_type = _get_edid_type(filename)
663101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                if edid_type not in supported_types:
673101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                    logging.info('Skip EDID: %s...', filename)
683101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                    continue
693101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam
703101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                logging.info('Use EDID: %s...', filename)
713101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                try:
723101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                    with chameleon_port.use_edid(
733101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                            edid.Edid.from_file(filepath, skip_verify=True)):
74a5e90d95a96acb3464e229337878b3301a45f490Tom Wai-Hong Tam                        resolution = utils.wait_for_value_changed(
75a5e90d95a96acb3464e229337878b3301a45f490Tom Wai-Hong Tam                                display_facade.get_external_resolution,
762ccb5e98f7c1e2c56ad542f0f906e5bcf3151893Hung-ying Tyan                                old_value=None)
772ccb5e98f7c1e2c56ad542f0f906e5bcf3151893Hung-ying Tyan                        if resolution is None:
782ccb5e98f7c1e2c56ad542f0f906e5bcf3151893Hung-ying Tyan                            raise error.TestFail('No external display detected on DUT')
793101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                        if screen_test.test_resolution(resolution):
803101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                            raise error.TestFail('Resolution test failed')
8140549c1be2935da67049619e46ca839102c66b17Tom Wai-Hong Tam                except (error.TestFail, xmlrpclib.Fault) as e:
823101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                    logging.warning(e)
833101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                    logging.error('EDID not supported: %s', filename)
843101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                    failed_edids.append(filename)
853101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam
863101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam            if failed_edids:
873101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                message = ('Total %d EDIDs not supported: ' % len(failed_edids)
883101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                           + ', '.join(failed_edids))
893101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                logging.error(message)
903101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                raise error.TestFail(message)
91