1aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov# Copyright 2014 The Chromium OS Authors. All rights reserved.
2aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov# Use of this source code is governed by a BSD-style license that can be
3aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov# found in the LICENSE file.
4aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov
5aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov"""This is test switching the external display mode."""
6aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov
7aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanovimport logging, time
8aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov
94eca901f8bb777c61411a883731c91b7c9966120Tom Wai-Hong Tamfrom autotest_lib.client.common_lib import error
103101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tamfrom autotest_lib.client.cros.chameleon import chameleon_port_finder
113101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tamfrom autotest_lib.client.cros.chameleon import chameleon_screen_test
123101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tamfrom autotest_lib.server import test
133101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tamfrom autotest_lib.server.cros.multimedia import remote_facade_factory
14aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov
15aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov
163101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tamclass display_SwitchMode(test.test):
17aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov    """External Display switch between extended and mirrored modes.
18aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov
19aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov    This test switches the external display mode between extended
20aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov    and mirrored modes, and checks resolution and static test image.
21aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov    """
22aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov    version = 1
23aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov    WAIT_AFTER_SWITCH = 5
24aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov
25aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov    def check_external_display(self, test_mirrored):
26aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov        """Display status check
27aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov
28aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov        @param test_mirrored: is mirrored mode active
29aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov
30aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov        """
31a435cc0a9e2feea72edb87d84dfd6ac944aef39bTom Wai-Hong Tam        resolution = self.display_facade.get_external_resolution()
32aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov        # Check connector
33c32cd25e14e64c4550685962a461e9d620955129Tom Wai-Hong Tam        if self.screen_test.check_external_display_connected(
34c32cd25e14e64c4550685962a461e9d620955129Tom Wai-Hong Tam                self.connector_used, self.errors) is None:
35c32cd25e14e64c4550685962a461e9d620955129Tom Wai-Hong Tam            # Check test image
36c32cd25e14e64c4550685962a461e9d620955129Tom Wai-Hong Tam            self.screen_test.test_screen_with_image(
37c32cd25e14e64c4550685962a461e9d620955129Tom Wai-Hong Tam                    resolution, test_mirrored, self.errors)
384eca901f8bb777c61411a883731c91b7c9966120Tom Wai-Hong Tam        if self.errors:
394eca901f8bb777c61411a883731c91b7c9966120Tom Wai-Hong Tam            raise error.TestFail('; '.join(set(self.errors)))
40aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov
41aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov
42aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov    def set_mode_and_check(self, test_mirrored):
43aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov        """Sets display mode and checks status
44aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov
45aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov        @param test_mirrored: is mirrored mode active
46aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov
47aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov        """
48a52a17eea34deb28b64931e0744c278931213c28Tom Wai-Hong Tam        logging.info('Set mirrored: %s', test_mirrored)
49a52a17eea34deb28b64931e0744c278931213c28Tom Wai-Hong Tam        self.display_facade.set_mirrored(test_mirrored)
50aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov        time.sleep(self.WAIT_AFTER_SWITCH)
51aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov        self.check_external_display(test_mirrored)
52aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov
53aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov
54aa9476e6db648bb6899be05a409b887b534e2230Kalin Stoyanov    def run_once(self, host, repeat):
553101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam        factory = remote_facade_factory.RemoteFacadeFactory(host)
563101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam        self.display_facade = factory.create_display_facade()
573101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam        chameleon_board = host.chameleon
583101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam
593101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam        chameleon_board.reset()
603101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam        finder = chameleon_port_finder.ChameleonVideoInputFinder(
613101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                chameleon_board, self.display_facade)
623101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam
633101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam        self.errors = []
643101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam        for chameleon_port in finder.iterate_all_ports():
653101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam            self.chameleon_port = chameleon_port
663101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam            self.screen_test = chameleon_screen_test.ChameleonScreenTest(
673101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                    chameleon_port, self.display_facade, self.outputdir)
683101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam
693101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam            logging.debug('See the display on Chameleon: port %d (%s)',
703101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                         self.chameleon_port.get_connector_id(),
713101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                         self.chameleon_port.get_connector_type())
723101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam            # Keep the original connector name, for later comparison.
733101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam            self.connector_used = (
743101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                    self.display_facade.get_external_connector_name())
753101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam
763101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam            for i in xrange(repeat):
773101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                logging.info("Iteration %d", (i + 1))
783101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                self.set_mode_and_check(False)
793101f5391422c58b1be1de503453f9ce45a6fca8Tom Wai-Hong Tam                self.set_mode_and_check(True)
80