114 lines
5.0 KiB
Python
114 lines
5.0 KiB
Python
# 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.
|
|
|
|
"""This is a server side to enable HDCP and verify screen."""
|
|
|
|
import logging
|
|
import time
|
|
|
|
from autotest_lib.client.bin import utils
|
|
from autotest_lib.client.common_lib import error
|
|
from autotest_lib.client.cros.chameleon import chameleon_port_finder
|
|
from autotest_lib.client.cros.chameleon import chameleon_screen_test
|
|
from autotest_lib.server import test
|
|
from autotest_lib.server.cros.multimedia import remote_facade_factory
|
|
|
|
|
|
class display_HDCPScreen(test.test):
|
|
"""Server side test to enable HDCP and verify screen.
|
|
|
|
This test forces CrOS to enable HDCP and compares screens between CrOS
|
|
and Chameleon.
|
|
"""
|
|
version = 1
|
|
|
|
TEST_CONFIGS = [
|
|
# (enable_chameleon, request_cros, expected_cros_state,
|
|
# expected_chameleon_state)
|
|
(True, 'Desired', 'Enabled', True),
|
|
(False, 'Desired', 'Desired', False),
|
|
# TODO: Investigate the case below which was disabled as it failed.
|
|
# Check http://crbug.com/447493
|
|
#(True, 'Undesired', 'Undesired', False),
|
|
(False, 'Undesired', 'Undesired', False),
|
|
]
|
|
|
|
DURATION_UNPLUG_FOR_HDCP = 1
|
|
TIMEOUT_HDCP_SWITCH = 10
|
|
|
|
def run_once(self, host, test_mirrored=False):
|
|
if host.get_architecture() != 'arm':
|
|
raise error.TestNAError('HDCP is not supported on a non-ARM device')
|
|
|
|
factory = remote_facade_factory.RemoteFacadeFactory(host)
|
|
display_facade = factory.create_display_facade()
|
|
chameleon_board = host.chameleon
|
|
|
|
chameleon_board.setup_and_reset(self.outputdir)
|
|
finder = chameleon_port_finder.ChameleonVideoInputFinder(
|
|
chameleon_board, display_facade)
|
|
|
|
errors = []
|
|
for chameleon_port in finder.iterate_all_ports():
|
|
screen_test = chameleon_screen_test.ChameleonScreenTest(
|
|
host, chameleon_port, display_facade, self.outputdir)
|
|
|
|
logging.info('See the display on Chameleon: port %d (%s)',
|
|
chameleon_port.get_connector_id(),
|
|
chameleon_port.get_connector_type())
|
|
|
|
logging.info('Set mirrored: %s', test_mirrored)
|
|
display_facade.set_mirrored(test_mirrored)
|
|
|
|
resolution = display_facade.get_external_resolution()
|
|
logging.info('Detected resolution on CrOS: %r', resolution)
|
|
|
|
original_cros_state = display_facade.get_content_protection()
|
|
was_chameleon_enabled = (
|
|
chameleon_port.is_content_protection_enabled())
|
|
try:
|
|
for (enable_chameleon, request_cros, expected_cros_state,
|
|
expected_chameleon_state) in self.TEST_CONFIGS:
|
|
# Do unplug and plug to emulate switching to a different
|
|
# display with a different content protection state.
|
|
chameleon_port.unplug()
|
|
logging.info('Set Chameleon HDCP: %r', enable_chameleon)
|
|
chameleon_port.set_content_protection(enable_chameleon)
|
|
time.sleep(self.DURATION_UNPLUG_FOR_HDCP)
|
|
chameleon_port.plug()
|
|
chameleon_port.wait_video_input_stable()
|
|
|
|
logging.info('Request CrOS HDCP: %s', request_cros)
|
|
display_facade.set_content_protection(request_cros)
|
|
|
|
state = utils.wait_for_value(
|
|
display_facade.get_content_protection, 'Enabled',
|
|
timeout_sec=self.TIMEOUT_HDCP_SWITCH)
|
|
logging.info('Got CrOS state: %s', state)
|
|
if state != expected_cros_state:
|
|
error_message = ('Failed to enable HDCP, state: %r' %
|
|
state)
|
|
logging.error(error_message)
|
|
errors.append(error_message)
|
|
|
|
encrypted = chameleon_port.is_video_input_encrypted()
|
|
logging.info('Got Chameleon state: %r', encrypted)
|
|
if encrypted != expected_chameleon_state:
|
|
error_message = ('Chameleon found HDCP in wrong state: '
|
|
'expected %r but got %r' %
|
|
(expected_chameleon_state, encrypted))
|
|
logging.error(error_message)
|
|
errors.append(error_message)
|
|
|
|
logging.info('Test screen under HDCP %s...',
|
|
'enabled' if encrypted else 'disabled')
|
|
screen_test.test_screen_with_image(
|
|
resolution, test_mirrored, errors)
|
|
finally:
|
|
display_facade.set_content_protection(original_cros_state)
|
|
chameleon_port.set_content_protection(was_chameleon_enabled)
|
|
|
|
if errors:
|
|
raise error.TestFail('; '.join(set(errors)))
|