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