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( 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)
def run_once(self, host, test_mirrored=False, test_suspend_resume=False, test_reboot=False, test_lid_close_open=False, resolution_list=None): # Check the servo object. if test_lid_close_open and host.servo is None: raise error.TestError('Invalid servo object found on the host.') if test_lid_close_open and not host.get_board_type() == 'CHROMEBOOK': raise error.TestNAError('DUT is not Chromebook. Test Skipped') if test_mirrored and not host.get_board_type() == 'CHROMEBOOK': raise error.TestNAError('DUT is not Chromebook. Test Skipped') # Check for incompatible with servo chromebooks. board_name = host.get_board().split(':')[1] if board_name in self.INCOMPATIBLE_SERVO_BOARDS: raise error.TestNAError( 'DUT is incompatible with servo. Skipping test.') 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) errors = [] if resolution_list is None: resolution_list = self.DEFAULT_RESOLUTION_LIST chameleon_supported = True for chameleon_port in finder.iterate_all_ports(): screen_test = chameleon_screen_test.ChameleonScreenTest( host, chameleon_port, display_facade, self.outputdir) chameleon_port_name = chameleon_port.get_connector_type() logging.info('Detected %s chameleon port.', chameleon_port_name) for label, width, height in resolution_list: test_resolution = (width, height) test_name = "%s_%dx%d" % ((label, ) + test_resolution) # The chameleon DP RX doesn't support 4K resolution. # The max supported resolution is 2560x1600. # See crbug/585900 if (chameleon_port_name.startswith('DP') and test_resolution > (2560, 1600)): chameleon_supported = False if not edid.is_edid_supported(host, width, height): logging.info('Skip unsupported EDID: %s', test_name) continue if test_lid_close_open: logging.info('Close lid...') host.servo.lid_close() time.sleep(self.WAIT_TIME_LID_TRANSITION) if test_reboot: # Unplug the monitor explicitly. Otherwise, the following # use_edid_file() call would expect a valid video signal, # which is not true during reboot. chameleon_port.unplug() logging.info('Reboot...') boot_id = host.get_boot_id() host.reboot(wait=False) host.test_wait_for_shutdown(self.REBOOT_TIMEOUT) path = os.path.join(self.bindir, 'test_data', 'edids', test_name) logging.info('Use EDID: %s', test_name) with chameleon_port.use_edid_file(path): if test_lid_close_open: logging.info('Open lid...') host.servo.lid_open() time.sleep(self.WAIT_TIME_LID_TRANSITION) if test_reboot: host.test_wait_for_boot(boot_id) chameleon_port.plug() utils.wait_for_value_changed( display_facade.get_external_connector_name, old_value=False) logging.info('Set mirrored: %s', test_mirrored) display_facade.set_mirrored(test_mirrored) if test_suspend_resume: if test_mirrored: # magic sleep to wake up nyan_big in mirrored mode # TODO: find root cause time.sleep(6) logging.info('Going to suspend...') display_facade.suspend_resume() logging.info('Resumed back') screen_test.test_screen_with_image(test_resolution, test_mirrored, errors, chameleon_supported) if errors: raise error.TestFail('; '.join(set(errors)))
def run_once(self, host, test_mirrored=False, resolution_list=None): if not host.get_board_type() == 'CHROMEBOOK': raise error.TestNAError('DUT is not Chromebook. Test Skipped') if resolution_list is None: resolution_list = self.DEFAULT_RESOLUTION_LIST factory = remote_facade_factory.RemoteFacadeFactory(host) display_facade = factory.create_display_facade() chameleon_board = host.chameleon chameleon_board.reset() finder = chameleon_port_finder.ChameleonVideoInputFinder( chameleon_board, display_facade) errors = [] for chameleon_port in finder.iterate_all_ports(): screen_test = chameleon_screen_test.ChameleonScreenTest( chameleon_port, display_facade, self.outputdir) chameleon_port_name = chameleon_port.get_connector_type() logging.info('Detected %s chameleon port.', chameleon_port_name) for interface, width, height in resolution_list: if not chameleon_port_name.startswith(interface): continue test_resolution = (width, height) test_name = "%s_%dx%d" % ((interface,) + test_resolution) if not edid.is_edid_supported(host, interface, width, height): logging.info('Skip unsupported EDID: %s', test_name) continue edid_path = os.path.join(self.bindir, 'test_data', 'edids', test_name) logging.info('Use EDID: %s', test_name) with chameleon_port.use_edid_file(edid_path): index = utils.wait_for_value_changed( display_facade.get_first_external_display_index, old_value=False) if not index: raise error.TestFail("No external display is found.") # In mirror mode only display index is '0', as external # is treated same as internal(single resolution applies) if test_mirrored: index = 0 logging.info('Set mirrored: %s', test_mirrored) display_facade.set_mirrored(test_mirrored) settings_resolution_list = ( display_facade.get_available_resolutions(index)) if len(settings_resolution_list) == 0: raise error.TestFail("No resolution list is found.") logging.info('External display %d: %d resolutions found.', index, len(settings_resolution_list)) for r in settings_resolution_list: # FIXME: send a keystroke to keep display on. # This is to work around a problem where the display may be # turned off if the test has run for a long time (e.g., # greater than 15 min). When the display is off, # set_resolution() will fail. display_facade.hide_cursor() logging.info('Set resolution to %dx%d', *r) display_facade.set_resolution(index, *r) time.sleep(self.RESOLUTION_CHANGE_TIME) chameleon_port.wait_video_input_stable() screen_test.test_screen_with_image(r, test_mirrored, errors) if errors: raise error.TestFail('; '.join(set(errors)))
def run_once(self, host, test_mirrored=False, test_suspend_resume=False, test_reboot=False, test_lid_close_open=False, resolution_list=None): # Check the servo object if test_lid_close_open and host.servo is None: raise error.TestError('Invalid servo object found on the host.') if test_lid_close_open and not host.get_board_type() == 'CHROMEBOOK': raise error.TestNAError('DUT is not Chromebook. Test Skipped') factory = remote_facade_factory.RemoteFacadeFactory(host) display_facade = factory.create_display_facade() chameleon_board = host.chameleon chameleon_board.reset() finder = chameleon_port_finder.ChameleonVideoInputFinder( chameleon_board, display_facade) errors = [] if resolution_list is None: resolution_list = self.DEFAULT_RESOLUTION_LIST for chameleon_port in finder.iterate_all_ports(): screen_test = chameleon_screen_test.ChameleonScreenTest( chameleon_port, display_facade, self.outputdir) chameleon_port_name = chameleon_port.get_connector_type() logging.info('Detected %s chameleon port.', chameleon_port_name) for interface, width, height in resolution_list: if not chameleon_port_name.startswith(interface): continue test_resolution = (width, height) test_name = "%s_%dx%d" % ((interface, ) + test_resolution) if not edid.is_edid_supported(host, interface, width, height): logging.info('Skip unsupported EDID: %s', test_name) continue if test_lid_close_open: logging.info('Close lid...') host.servo.lid_close() time.sleep(self.WAIT_TIME_LID_TRANSITION) if test_reboot: logging.info('Reboot...') boot_id = host.get_boot_id() host.reboot(wait=False) host.test_wait_for_shutdown(self.REBOOT_TIMEOUT) path = os.path.join(self.bindir, 'test_data', 'edids', test_name) logging.info('Use EDID: %s', test_name) with chameleon_port.use_edid_file(path): if test_lid_close_open: logging.info('Open lid...') host.servo.lid_open() time.sleep(self.WAIT_TIME_LID_TRANSITION) if test_reboot: host.test_wait_for_boot(boot_id) utils.wait_for_value_changed( display_facade.get_external_connector_name, old_value=False) logging.info('Set mirrored: %s', test_mirrored) display_facade.set_mirrored(test_mirrored) if test_suspend_resume: if test_mirrored: # magic sleep to wake up nyan_big in mirrored mode # TODO: find root cause time.sleep(6) logging.info('Going to suspend...') display_facade.suspend_resume() logging.info('Resumed back') screen_test.test_screen_with_image(test_resolution, test_mirrored, errors) if errors: raise error.TestFail('; '.join(set(errors)))