• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2017 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5import glob
6import logging
7import os
8import utils
9
10from autotest_lib.client.common_lib import error
11from autotest_lib.client.cros.enterprise import enterprise_policy_base
12from autotest_lib.client.cros.input_playback import input_playback
13
14POLL_TIMEOUT = 5
15POLL_FREQUENCY = 0.5
16
17
18class policy_DisableScreenshots(
19        enterprise_policy_base.EnterprisePolicyTest):
20    """
21    Test DisableScreenshots policy effect on ChromerOS behavior.
22
23    This test verifies the behavior of Chrome OS with a set of valid values
24    for the DisableScreenshots user policy ie, the policy value is set to True,
25    False or is Unset.
26    These valid values are covered by the test cases: DisableScreenshot_Block,
27    NotSet_Allow and False_Allow.
28
29    When the policy value is None or is set to False (as in the cases
30    NotSet_Allow and False_Allow), then screenshots will be captured on pressing
31    the Ctrl and F5 keyboard buttons. When the value is set to True (as in case
32    DisableScreenshot_Block), screenshot capture is disabled.
33
34    """
35    version = 1
36
37    def initialize(self, **kwargs):
38        """Emulate a keyboard in order to play back the screenshot shortcut."""
39        self._initialize_test_constants()
40        super(policy_DisableScreenshots, self).initialize(**kwargs)
41        self.player = input_playback.InputPlayback()
42        self.player.emulate(input_type='keyboard')
43        self.player.find_connected_inputs()
44
45
46    def _initialize_test_constants(self):
47        """Initialize test-specific constants, some from class constants."""
48        self.POLICY_NAME = 'DisableScreenshots'
49        self._DOWNLOADS = '/home/chronos/user/Downloads/'
50        self._SCREENSHOT_PATTERN = 'Screenshot*'
51        self._SCREENSHOT_FILENAME = self._DOWNLOADS + self._SCREENSHOT_PATTERN
52
53        self.TEST_CASES = {
54            'DisableScreenshot_Block': True,
55            'False_Allow': False,
56            'NotSet_Allow': None
57        }
58        self.STARTUP_URLS = ['chrome://policy', 'chrome://settings']
59        self.SUPPORTING_POLICIES = {
60            'RestoreOnStartupURLs': self.STARTUP_URLS,
61            'RestoreOnStartup': 4
62        }
63
64
65    def _capture_screenshot(self):
66        """Capture a screenshot by pressing Ctrl +F5."""
67        self.player.blocking_playback_of_default_file(
68                input_type='keyboard', filename='keyboard_ctrl+f5')
69
70
71    def _screenshot_file_exists(self):
72        """
73        Return True if screenshot was captured. else returns False.
74
75        @returns boolean indicating if screenshot file was saved or not.
76
77        """
78        try:
79            utils.poll_for_condition(
80                    lambda: len(glob.glob(self._SCREENSHOT_FILENAME)) > 0,
81                    timeout=POLL_TIMEOUT,
82                    sleep_interval=POLL_FREQUENCY)
83        except utils.TimeoutError:
84            logging.info('Screenshot file not found.')
85            return False
86
87        logging.info('Screenshot file found.')
88        return True
89
90
91    def _delete_screenshot_files(self):
92        """Delete existing screenshot files, if any."""
93        for filename in glob.glob(self._SCREENSHOT_FILENAME):
94            os.remove(filename)
95
96
97    def cleanup(self):
98        """Cleanup files created in this test, if any and close the player."""
99        self._delete_screenshot_files()
100        self.player.close()
101        super(policy_DisableScreenshots, self).cleanup()
102
103
104    def _test_screenshot_disabled(self, policy_value):
105        """
106        Verify CrOS enforces the DisableScreenshots policy.
107
108        When DisableScreenshots policy value is undefined, screenshots shall
109        be captured via the keyboard shortcut Ctrl + F5.
110        When DisableScreenshots policy is set to True screenshots shall not
111        be captured.
112
113        @param policy_value: policy value for this case.
114
115        """
116        logging.info('Deleting preexisting Screenshot files.')
117        self._delete_screenshot_files()
118
119        self._capture_screenshot()
120        screenshot_file_captured = self._screenshot_file_exists()
121        if policy_value:
122            if screenshot_file_captured:
123                raise error.TestFail('Screenshot should not be captured')
124        elif not screenshot_file_captured:
125            raise error.TestFail('Screenshot should be captured')
126
127
128    def run_once(self, case):
129        """
130        Setup and run the test configured for the specified test case.
131
132        @param case: Name of the test case to run.
133
134        """
135        case_value = self.TEST_CASES[case]
136        self.SUPPORTING_POLICIES[self.POLICY_NAME] = case_value
137        self.setup_case(user_policies=self.SUPPORTING_POLICIES)
138        self._test_screenshot_disabled(case_value)
139