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