| OLD | NEW |
| 1 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 # Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 | 4 |
| 5 import logging | 5 import logging |
| 6 import os.path | 6 import os.path |
| 7 | 7 |
| 8 from autotest_lib.client.bin import test, utils | 8 from autotest_lib.client.bin import test, utils |
| 9 from autotest_lib.client.common_lib import error, site_ui | 9 from autotest_lib.client.common_lib import error, site_ui |
| 10 | 10 |
| 11 class hardware_VideoOutSemiAuto(test.test): | 11 class hardware_VideoOutSemiAuto(test.test): |
| 12 version = 1 | 12 version = 1 |
| 13 XRANDR_PATH = "/usr/bin/xrandr" | 13 XRANDR_PATH = "/usr/bin/xrandr" |
| 14 RECONFIG_PATH = "/usr/sbin/monitor_reconfigure" | 14 RECONFIG_PATH = "/usr/bin/monitor_reconfigure" |
| 15 HDMI_ID = "HDMI" | 15 HDMI_ID = "HDMI" |
| 16 VGA_ID = "VGA" | 16 VGA_ID = "VGA" |
| 17 | 17 |
| 18 | 18 |
| 19 # Returns True if given |output| port is found on system. | 19 # Returns True if given |output| port is found on system. |
| 20 def __query_for_output(self, output): | 20 def __query_for_output(self, output): |
| 21 query_cmd = "%s -q | grep %s -c" % (self.XRANDR_PATH, output) | 21 query_cmd = "%s -q | grep %s -c" % (self.XRANDR_PATH, output) |
| 22 xrandr_out = utils.system_output(site_ui.xcommand(query_cmd), | 22 xrandr_out = utils.system_output(site_ui.xcommand(query_cmd), |
| 23 ignore_status=True) | 23 ignore_status=True) |
| 24 return int(xrandr_out) > 0 | 24 return int(xrandr_out) > 0 |
| (...skipping 10 matching lines...) Expand all Loading... |
| 35 | 35 |
| 36 # Returns if given |output| port has a device that has been configured | 36 # Returns if given |output| port has a device that has been configured |
| 37 # otherwise raises TestFail | 37 # otherwise raises TestFail |
| 38 def __output_is_set(self, output): | 38 def __output_is_set(self, output): |
| 39 query_cmd = "%s -q | grep '%s[0-9] connected' -n" % \ | 39 query_cmd = "%s -q | grep '%s[0-9] connected' -n" % \ |
| 40 (self.XRANDR_PATH, output) | 40 (self.XRANDR_PATH, output) |
| 41 start_line = int( | 41 start_line = int( |
| 42 utils.system_output(site_ui.xcommand(query_cmd)).split(':')[0] | 42 utils.system_output(site_ui.xcommand(query_cmd)).split(':')[0] |
| 43 ) | 43 ) |
| 44 | 44 |
| 45 # Gets 100 lines (to be safe) after context to get output after | 45 # Gets 100 lines (to be safe) after context to get output after |
| 46 query_cmd = \ | 46 query_cmd = \ |
| 47 "%s -q | grep '%s[0-9] connected' -n -A 100 | grep connected" % \ | 47 "%s -q | grep '%s[0-9] connected' -n -A 100 | grep connected" % \ |
| 48 (self.XRANDR_PATH, output) | 48 (self.XRANDR_PATH, output) |
| 49 | 49 |
| 50 try: | 50 try: |
| 51 end_line = int(utils.system_output( | 51 end_line = int(utils.system_output( |
| 52 site_ui.xcommand(query_cmd)).split('\n')[1].split('-')[0]) | 52 site_ui.xcommand(query_cmd)).split('\n')[1].split('-')[0]) |
| 53 except: | 53 except: |
| 54 logging.info("End line not found, assuming last output") | 54 logging.info("End line not found, assuming last output") |
| 55 end_line = -1 | 55 end_line = -1 |
| 56 | 56 |
| 57 if end_line != -1: | 57 if end_line != -1: |
| 58 lines_between = end_line - start_line - 1 | 58 lines_between = end_line - start_line - 1 |
| 59 else: | 59 else: |
| 60 line_between = 100 | 60 line_between = 100 |
| 61 query_cmd = "%s -q | grep '%s[0-9] connected' -A %d | grep \\*" % \ | 61 query_cmd = "%s -q | grep '%s[0-9] connected' -A %d | grep \\*" % \ |
| 62 (self.XRANDR_PATH, output, lines_between) | 62 (self.XRANDR_PATH, output, lines_between) |
| 63 try: | 63 try: |
| 64 utils.system(site_ui.xcommand(query_cmd)) | 64 utils.system(site_ui.xcommand(query_cmd)) |
| 65 except: | 65 except: |
| 66 raise error.TestFail("%s not set with monitor_reconfigure" % output) | 66 raise error.TestFail("%s not set with monitor_reconfigure" % output) |
| 67 | 67 |
| 68 | 68 |
| 69 # Configures |output| and returns if |output| has been configured. | 69 # Configures |output| and returns if |output| has been configured. |
| 70 # Also will return false immediately if no device detected on the port | 70 # Also will return false immediately if no device detected on the port |
| 71 def __configure_and_check_output(self, output): | 71 def __configure_and_check_output(self, output): |
| 72 connected = self.__output_connected(output) | 72 connected = self.__output_connected(output) |
| 73 if not connected: | 73 if not connected: |
| 74 logging.warning( | 74 logging.warning( |
| 75 "%s port detected but no connected device" % output | 75 "%s port detected but no connected device" % output |
| 76 ) | 76 ) |
| 77 return False | 77 return False |
| 78 else: | 78 else: |
| 79 #TODO(sosa@chromium.org) - Verify this is synchronous. | 79 #TODO(sosa@chromium.org) - Verify this is synchronous. |
| 80 utils.system(site_ui.xcommand(self.RECONFIG_PATH)) | 80 utils.system(site_ui.xcommand(self.RECONFIG_PATH)) |
| 81 self.__output_is_set(output) | 81 self.__output_is_set(output) |
| 82 return True | 82 return True |
| 83 | 83 |
| 84 | 84 |
| 85 def run_once(self): | 85 def run_once(self): |
| 86 # Sanity check for xrandr application. | 86 # Sanity check for xrandr application. |
| 87 if not os.path.isfile(self.XRANDR_PATH): | 87 if not os.path.isfile(self.XRANDR_PATH): |
| 88 raise error.TestFail(""" | 88 raise error.TestFail("xrandr not at %s" % self.XRANDR_PATH) |
| 89 XRandr missing from device cannot complete test | |
| 90 """) | |
| 91 | 89 |
| 92 # Determine if devices of interest are on system. | 90 # Determine if devices of interest are on system. |
| 93 hdmi_exists = self.__query_for_output(self.HDMI_ID) | 91 hdmi_exists = self.__query_for_output(self.HDMI_ID) |
| 94 vga_exists = self.__query_for_output(self.VGA_ID) | 92 vga_exists = self.__query_for_output(self.VGA_ID) |
| 95 | 93 |
| 96 # Raises NAError since these are optional devices. | 94 # Raises NAError since these are optional devices. |
| 97 if (not hdmi_exists) and (not vga_exists): | 95 if (not hdmi_exists) and (not vga_exists): |
| 98 raise error.TestFail("Neither VGA or HDMI ports detected") | 96 raise error.TestFail("Neither VGA nor HDMI ports detected") |
| 99 | 97 |
| 100 # Sanity check to make sure we can configure the devices. | 98 # Sanity check to make sure we can configure the devices. |
| 101 if not os.path.isfile(self.RECONFIG_PATH): | 99 if not os.path.isfile(self.RECONFIG_PATH): |
| 102 raise error.TestFail(""" | 100 raise error.TestFail("monitor_reconfigure not at %s" % |
| 103 Device detected but missing monitor_reconfigure tool | 101 self.RECONFIG_PATH); |
| 104 """) | |
| 105 | 102 |
| 106 # If either device is connected and able to be configured | 103 # If either device is connected and able to be configured |
| 107 # the test is successful. | 104 # the test is successful. |
| 108 success = False | 105 success = False |
| 109 | 106 |
| 110 # If devices exist, we should be able to configure and enable them | 107 # If devices exist, we should be able to configure and enable them |
| 111 if hdmi_exists: | 108 if hdmi_exists: |
| 112 success |= self.__configure_and_check_output(self.HDMI_ID) | 109 success |= self.__configure_and_check_output(self.HDMI_ID) |
| 113 if vga_exists: | 110 if vga_exists: |
| 114 success |= self.__configure_and_check_output(self.VGA_ID) | 111 success |= self.__configure_and_check_output(self.VGA_ID) |
| 115 | 112 |
| 116 if not success: | 113 if not success: |
| 117 raise error.TestFail(""" | 114 raise error.TestFail(""" |
| 118 HDMI port or VGA port detected but no actual device connected. | 115 HDMI port or VGA port detected but no actual device connected. |
| 119 """) | 116 """) |
| OLD | NEW |