| # Copyright (c) 2010 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. |
| |
| import logging |
| import os.path |
| |
| from autotest_lib.client.bin import test, utils |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.client.cros import cros_ui |
| |
| class hardware_VideoOutSemiAuto(test.test): |
| version = 1 |
| XRANDR_PATH = "/usr/bin/xrandr" |
| RECONFIG_PATH = "/usr/bin/monitor_reconfigure" |
| HDMI_ID = "HDMI" |
| VGA_ID = "VGA" |
| |
| |
| # Returns True if given |output| port is found on system. |
| def __query_for_output(self, output): |
| query_cmd = "%s -q | grep %s -c" % (self.XRANDR_PATH, output) |
| xrandr_out = utils.system_output(cros_ui.xcommand(query_cmd), |
| ignore_status=True) |
| return int(xrandr_out) > 0 |
| |
| |
| # Returns True if given |output| port has a connected device. |
| def __output_connected(self, output): |
| query_cmd = "%s -q | grep '%s[0-9] connected' -c" % \ |
| (self.XRANDR_PATH, output) |
| xrandr_out = utils.system_output(cros_ui.xcommand(query_cmd), |
| ignore_status=True) |
| return int(xrandr_out) > 0 |
| |
| |
| # Returns if given |output| port has a device that has been configured |
| # otherwise raises TestFail |
| def __output_is_set(self, output): |
| query_cmd = "%s -q | grep '%s[0-9] connected' -n" % \ |
| (self.XRANDR_PATH, output) |
| start_line = int( |
| utils.system_output(cros_ui.xcommand(query_cmd)).split(':')[0] |
| ) |
| |
| # Gets 100 lines (to be safe) after context to get output after |
| query_cmd = \ |
| "%s -q | grep '%s[0-9] connected' -n -A 100 | grep connected" % \ |
| (self.XRANDR_PATH, output) |
| |
| try: |
| end_line = int(utils.system_output( |
| cros_ui.xcommand(query_cmd)).split('\n')[1].split('-')[0]) |
| except: |
| logging.info("End line not found, assuming last output") |
| end_line = -1 |
| |
| if end_line != -1: |
| lines_between = end_line - start_line - 1 |
| else: |
| line_between = 100 |
| query_cmd = "%s -q | grep '%s[0-9] connected' -A %d | grep \\*" % \ |
| (self.XRANDR_PATH, output, lines_between) |
| try: |
| utils.system(cros_ui.xcommand(query_cmd)) |
| except: |
| raise error.TestFail("%s not set with monitor_reconfigure" % output) |
| |
| |
| # Configures |output| and returns if |output| has been configured. |
| # Also will return false immediately if no device detected on the port |
| def __configure_and_check_output(self, output): |
| connected = self.__output_connected(output) |
| if not connected: |
| logging.warning( |
| "%s port detected but no connected device" % output |
| ) |
| return False |
| else: |
| #TODO(sosa@chromium.org) - Verify this is synchronous. |
| utils.system(cros_ui.xcommand(self.RECONFIG_PATH)) |
| self.__output_is_set(output) |
| return True |
| |
| |
| def run_once(self): |
| # Sanity check for xrandr application. |
| if not os.path.isfile(self.XRANDR_PATH): |
| raise error.TestFail("xrandr not at %s" % self.XRANDR_PATH) |
| |
| # Determine if devices of interest are on system. |
| hdmi_exists = self.__query_for_output(self.HDMI_ID) |
| vga_exists = self.__query_for_output(self.VGA_ID) |
| |
| # Raises NAError since these are optional devices. |
| if (not hdmi_exists) and (not vga_exists): |
| raise error.TestFail("Neither VGA nor HDMI ports detected") |
| |
| # Sanity check to make sure we can configure the devices. |
| if not os.path.isfile(self.RECONFIG_PATH): |
| raise error.TestFail("monitor_reconfigure not at %s" % |
| self.RECONFIG_PATH); |
| |
| # If either device is connected and able to be configured |
| # the test is successful. |
| success = False |
| |
| # If devices exist, we should be able to configure and enable them |
| if hdmi_exists: |
| success |= self.__configure_and_check_output(self.HDMI_ID) |
| if vga_exists: |
| success |= self.__configure_and_check_output(self.VGA_ID) |
| |
| if not success: |
| raise error.TestFail(""" |
| HDMI port or VGA port detected but no actual device connected. |
| """) |