Home | History | Annotate | Download | only in hardware_Resolution
      1 #!/usr/bin/python
      2 #
      3 # Copyright (c) 2010 The Chromium Authors. All rights reserved.
      4 # Use of this source code is governed by a BSD-style license that can be
      5 # found in the LICENSE file.
      6 
      7 __author__ = 'kdlucas (at] chromium.org (Kelly Lucas)'
      8 
      9 import logging, re
     10 
     11 from autotest_lib.client.bin import test, utils
     12 from autotest_lib.client.common_lib import error
     13 from autotest_lib.client.cros.graphics import graphics_utils
     14 
     15 _SUPPORTED_LVDS_RESOLUTIONS = ['1280x800', '1366x768']
     16 
     17 _MODETEST_COMMAND = 'modetest -c'
     18 _MODETEST_CONNECTED = 'connected'
     19 _MODETEST_CONNECTOR_LVDS = 'LVDS'
     20 # The list of connectors in this regex pattern comes from an array called
     21 # connector_type_names in the libdrm file caled modetest.c .
     22 _MODETEST_CONNECTOR_PATTERN = (r'\d+\s+\d+\s+(connected|disconnected)\s+'
     23                                r'(unknown|VGA|DVI-I|DVI-D|DVI-A|composite|'
     24                                r's-video|LVDS|component|9-pin DIN|HDMI-A|'
     25                                r'HDMI-B|TV|eDP)\s+\d+x\d+\s+\d+\s+\d+')
     26 _MODETEST_MODE_PATTERN = (r'\s+.+\d+\s+(\d+)\s+\d+\s+\d+\s+\d+\s+(\d+)\s+\d+\s+'
     27                           r'\d+\s+\d+\s+flags:')
     28 
     29 _LVDS_UNSUPPORTED_MESSAGE = '%s is not a supported LVDS resolution'
     30 
     31 class hardware_Resolution(test.test):
     32     """
     33     Verify the current screen resolution is supported.
     34     """
     35     version = 1
     36 
     37     def is_lvds_res(self, res, xrandr_output):
     38         """
     39         Returns True if the supplied resolution is associated with
     40         an LVDS connection.
     41         """
     42         search_str = r'LVDS\d+ connected ' + res
     43         for line in xrandr_output:
     44             if re.match(search_str, line):
     45                 return True
     46 
     47         return False
     48 
     49     def get_current_res(self, xrandr_output):
     50         """
     51         Get the current video resolution.
     52         Returns:
     53             string: represents the video resolution.
     54         """
     55         for line in xrandr_output:
     56             if 'Screen 0' in line:
     57                 sections = line.split(',')
     58                 for item in sections:
     59                     if 'current' in item:
     60                         res = item.split()
     61                         return '%s%s%s' % (res[1], res[2], res[3])
     62 
     63         return None
     64 
     65     def run_x(self):
     66         xrandr_output = graphics_utils.call_xrandr().split('\n')
     67 
     68         res = self.get_current_res(xrandr_output)
     69         if not res or not re.match(r'\d+x\d+$', res):
     70             raise error.TestFail('%s is not a valid resolution' % res)
     71 
     72         if self.is_lvds_res(res, xrandr_output) and \
     73            res not in _SUPPORTED_LVDS_RESOLUTIONS:
     74             raise error.TestFail(_LVDS_UNSUPPORTED_MESSAGE % res)
     75 
     76     def run_freon(self):
     77         modetest_output = utils.system_output(_MODETEST_COMMAND)
     78         logging.info('modetest output: \n{0}'.format(modetest_output))
     79 
     80         # True if the information being read is about a connected LVDS
     81         # connector, False otherwise
     82         connected_lvds = False
     83 
     84         for line in modetest_output.splitlines():
     85             connector_match = re.match(_MODETEST_CONNECTOR_PATTERN, line)
     86             if connector_match is not None:
     87                 connected_lvds = False
     88                 if connector_match.group(1) == _MODETEST_CONNECTED:
     89                     if connector_match.group(2) == _MODETEST_CONNECTOR_LVDS:
     90                         connected_lvds = True
     91 
     92             if connected_lvds:
     93                 mode_match = re.match(_MODETEST_MODE_PATTERN, line)
     94                 if mode_match is not None:
     95                     res = '{0}x{1}'.format(int(mode_match.group(1)),
     96                                            int(mode_match.group(2)))
     97                     if res not in _SUPPORTED_LVDS_RESOLUTIONS:
     98                         raise error.TestFail(_LVDS_UNSUPPORTED_MESSAGE % res)
     99 
    100     def run_once(self):
    101         if utils.is_freon():
    102             self.run_freon()
    103         else:
    104             self.run_x()
    105