1# Lint as: python2, python3
2# Copyright 2018 The Chromium OS Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6import logging
7import time
8
9from autotest_lib.server import test
10from autotest_lib.client.bin import utils
11from autotest_lib.client.common_lib import error
12from autotest_lib.client.cros.chameleon import chameleon_port_finder
13from autotest_lib.client.cros.chameleon import chameleon_screen_test
14from autotest_lib.server.cros.multimedia import remote_facade_factory
15
16
17class display_CheckModesAfterSignOutSignIn(test.test):
18    """ To Check the modes after sign out/sign in"""
19    version = 1
20    KEY_DELAY = 0.3
21    LOGOUT_DELAY = 20
22
23    def logout(self):
24        """Log out the User"""
25        logging.info("Signing out")
26
27        # Pressing the keys twice to logout
28        self.input_facade.blocking_playback_of_default_file("keyboard",
29                                                            'keyboard_ctrl+shift+q')
30        time.sleep(self.KEY_DELAY)
31        self.input_facade.blocking_playback_of_default_file("keyboard",
32                                                            'keyboard_ctrl+shift+q')
33
34    def is_logged_out(self):
35        """Will check whether user logged out"""
36        logging.debug("checking /home/chronos/user/Downloads/ to know "
37                      "whether user logged out or not!")
38        return self.host.path_exists('/home/chronos/user/Downloads/') is False
39
40    def check_mode(self, test_mirrored_mode=True):
41        """Checks the display mode is as expected
42
43        @param test_mirrored: True if mirror mode
44        @raise error.TestFail if the display mode is not preserved.
45        """
46        logging.info("Is Mirrored mode enabled?: %s",
47                     self.display_facade.is_mirrored_enabled())
48        if self.display_facade.is_mirrored_enabled() != test_mirrored_mode:
49            raise error.TestFail('Display mode %s is not preserved!' %
50                                 ('mirrored' if test_mirrored_mode
51                                     else 'extended'))
52
53    def check_external_display(self, test_mirrored):
54        """Display status check
55
56        @param test_mirrored: True if mirror mode
57        """
58
59        # Check connector
60        if self.screen_test.check_external_display_connected(
61                self.connector_used, self.errors) is None:
62
63            # Check mode is same as beginning of the test
64            self.check_mode(test_mirrored)
65
66            # Check test image
67            resolution = self.chameleon_port.get_resolution()
68            self.screen_test.test_screen_with_image(
69                    resolution, test_mirrored, self.errors)
70
71    def run_test_on_port(self, chameleon_port, test_mirrored):
72        """Run the test on the given Chameleon port.
73
74        @param chameleon_port: a ChameleonPorts object.
75        @param test_mirrored: True if mirror mode
76        @raise error.TestFail if any display errors
77        """
78        self.chameleon_port = chameleon_port
79        self.screen_test = chameleon_screen_test.ChameleonScreenTest(
80                self.host, chameleon_port, self.display_facade, self.outputdir)
81
82        # Get connector type used (HDMI,DP,...)
83        self.connector_used = self.display_facade.get_external_connector_name()
84
85        # Set main display mode for the test
86        logging.info("Setting Mirrored display mode")
87        self.display_facade.set_mirrored(test_mirrored)
88        self.logout()
89        utils.poll_for_condition(
90                self.is_logged_out,
91                exception=error.TestFail('User is not logged out'),
92                timeout=self.LOGOUT_DELAY,
93                sleep_interval=1)
94        logging.info("Restarting the chrome again!")
95        self.browser_facade.start_default_chrome(restart=True)
96        logging.info("Checking the external display mode and image!")
97        self.check_external_display(test_mirrored)
98        if self.errors:
99            raise error.TestFail('; '.join(set(self.errors)))
100
101    def run_once(self, host, test_mirrored=True):
102        """Checks the mode is preserved after logout
103
104        @param host: DUT object
105        @param test_mirrored: True if mirror mode
106        """
107        self.host = host
108        self.errors = list()
109        chameleon_board = host.chameleon
110        factory = remote_facade_factory.RemoteFacadeFactory(
111                self.host, results_dir=self.resultsdir)
112        self.display_facade = factory.create_display_facade()
113        self.browser_facade = factory.create_browser_facade()
114        self.input_facade = factory.create_input_facade()
115        self.input_facade.initialize_input_playback("keyboard")
116        chameleon_board.setup_and_reset(self.outputdir)
117        finder = chameleon_port_finder.ChameleonVideoInputFinder(
118                chameleon_board, self.display_facade)
119
120        # Iterates all connected video ports and ensures every of them plugged
121        for chameleon_port in finder.iterate_all_ports():
122            self.run_test_on_port(chameleon_port, test_mirrored)
123