119 lines
4.8 KiB
Python
119 lines
4.8 KiB
Python
# Lint as: python2, python3
|
|
# Copyright 2014 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.
|
|
|
|
"""Classes to do resolution comparison."""
|
|
|
|
import logging
|
|
import six.moves.xmlrpc_client
|
|
|
|
|
|
class ExactMatchResolutionComparer(object):
|
|
"""A class to compare the resolutions by using exact match.
|
|
|
|
Calling its member method compare() does the comparison.
|
|
|
|
"""
|
|
|
|
def __init__(self, chameleon_port, display_facade):
|
|
"""Initializes the ExactMatchResolutionComparer objects."""
|
|
self._chameleon_port = chameleon_port
|
|
self._display_facade = display_facade
|
|
|
|
|
|
def compare(self, expected_resolution):
|
|
"""Compares the resolutions among the given one, Chameleon's, and CrOS'.
|
|
|
|
This method first checks if CrOS is under mirrored mode or not.
|
|
|
|
If under extended mode, checks the resolutions of both CrOS and
|
|
Chameleon exactly match the expected one.
|
|
|
|
If under mirror mode, only checks the resolution of CrOS exactly
|
|
matches the one of Chameleon.
|
|
|
|
@param expected_resolution: A tuple (width, height) for the expected
|
|
resolution.
|
|
@return: None if the check passes; otherwise, a string of error message.
|
|
"""
|
|
try:
|
|
chameleon_resolution = self._chameleon_port.get_resolution()
|
|
except six.moves.xmlrpc_client.Fault as e:
|
|
logging.exception(e)
|
|
return str(e)
|
|
cros_resolution = self._display_facade.get_external_resolution()
|
|
|
|
logging.info('Checking the resolutions of Chameleon and CrOS...')
|
|
if expected_resolution != cros_resolution or (
|
|
chameleon_resolution != cros_resolution):
|
|
message = ('Detected mis-matched resolutions: '
|
|
'CrOS %r; Chameleon %r; Expected %r.' %
|
|
(cros_resolution, chameleon_resolution,
|
|
expected_resolution))
|
|
# Note: In mirrored mode, the device may be in hardware mirror
|
|
# (as opposed to software mirror). If so, the actual resolution
|
|
# could be different from the expected one. So we skip the check
|
|
# in mirrored mode. The resolution of the CrOS and Chameleon
|
|
# should be same no matter the device in mirror mode or not.
|
|
if chameleon_resolution != cros_resolution or (
|
|
not self._display_facade.is_mirrored_enabled()):
|
|
logging.error(message)
|
|
return message
|
|
else:
|
|
logging.warn(message)
|
|
else:
|
|
logging.info('Resolutions across CrOS and Chameleon match: %dx%d',
|
|
*expected_resolution)
|
|
return None
|
|
|
|
|
|
class VgaResolutionComparer(object):
|
|
"""A class to compare the resolutions for VGA interface.
|
|
|
|
Calling its member method compare() does the comparison.
|
|
|
|
"""
|
|
|
|
def __init__(self, chameleon_port, display_facade):
|
|
"""Initializes the VgaResolutionComparer objects."""
|
|
self._chameleon_port = chameleon_port
|
|
self._display_facade = display_facade
|
|
|
|
|
|
def compare(self, expected_resolution):
|
|
"""Compares the resolutions among the given one, Chameleon's, and CrOS'.
|
|
|
|
There is no DE (data enable) signal in the VGA standard, the captured
|
|
image of Chameleon side is larger than the expected image.
|
|
|
|
It checks the resolution of CrOS matches the expected one and
|
|
the resolution of Chameleon is larger than or equal to the one of CrOS.
|
|
|
|
@param expected_resolution: A tuple (width, height) of the expected
|
|
resolution.
|
|
@return: None if the check passes; otherwise, a string of error message.
|
|
"""
|
|
try:
|
|
chameleon_resolution = self._chameleon_port.get_resolution()
|
|
except six.moves.xmlrpc_client.Fault as e:
|
|
logging.exception(e)
|
|
return str(e)
|
|
cros_resolution = self._display_facade.get_external_resolution()
|
|
|
|
logging.info('Checking the resolutions of Chameleon and CrOS...')
|
|
if expected_resolution != cros_resolution or (
|
|
chameleon_resolution[0] < cros_resolution[0] or
|
|
chameleon_resolution[1] < cros_resolution[1]):
|
|
message = ('Detected mis-matched VGA resolutions: '
|
|
'CrOS %r; Chameleon %r; Expected %r.' %
|
|
(cros_resolution, chameleon_resolution,
|
|
expected_resolution))
|
|
logging.error(message)
|
|
return message
|
|
else:
|
|
logging.info('Detected VGA resolutions: '
|
|
'CrOS: %dx%d; Chameleon: %dx%d.',
|
|
*(cros_resolution + chameleon_resolution))
|
|
return None
|