171 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			171 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Python
		
	
	
	
| # Copyright 2019 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.
 | |
| 
 | |
| import logging
 | |
| 
 | |
| from autotest_lib.client.common_lib import error
 | |
| from autotest_lib.client.cros.enterprise import enterprise_policy_base
 | |
| 
 | |
| 
 | |
| class policy_NativePrintersBulkAccessMode(
 | |
|         enterprise_policy_base.EnterprisePolicyTest):
 | |
|     """Verify behavior of NativePrinters user policy."""
 | |
|     version = 1
 | |
| 
 | |
|     def initialize(self, **kwargs):
 | |
|         """Initialize."""
 | |
|         self._initialize_test_constants()
 | |
|         self._initialize_enterprise_policy_test()
 | |
| 
 | |
| 
 | |
|     def _initialize_test_constants(self):
 | |
|         """Construct policy values as needed."""
 | |
|         PRINTERS_URL = ('https://storage.googleapis.com/chromiumos-test-assets'
 | |
|                         '-public/enterprise/printers.json')
 | |
|         PRINTERS_HASH = ('7a052c5e4f23c159668148df2a3c202bed4d65749cab5ecd0f'
 | |
|                          'a7db211c12a3b8') #sha256
 | |
|         PRINTERS2_URL = ('https://storage.googleapis.com/chromiumos-test-assets'
 | |
|                          '-public/enterprise/printers2.json')
 | |
|         PRINTERS2_HASH = ('0d7344c989893cb97484d6111bf497a999333c177e1c991c06'
 | |
|                           'db664c58e4b81a') #sha256
 | |
|         # These strings are printer ids, defined in PRINTERS_URL.
 | |
|         self.DEFINED_IDS = set(['wl', 'bl', 'other', 'both'])
 | |
|         # These strings are printer ids, defined in PRINTERS2_URL.
 | |
|         self.DEFINED_IDS2 = set(['wl2', 'bl2', 'other2', 'both2'])
 | |
|         # Whitelist and blacklist, common for both sets of printers
 | |
|         self.WHITELIST = ['both', 'both2', 'wl', 'wl2', 'otherwl']
 | |
|         self.BLACKLIST = ['both', 'both2', 'bl', 'bl2', 'otherbl']
 | |
| 
 | |
|         self.user_policies = {
 | |
|                 'NativePrintersBulkConfiguration': {'url': PRINTERS_URL,
 | |
|                                                     'hash': PRINTERS_HASH},
 | |
|                 'NativePrintersBulkWhitelist': self.WHITELIST,
 | |
|                 'NativePrintersBulkBlacklist': self.BLACKLIST}
 | |
| 
 | |
|         self.device_policies = {
 | |
|                 'DevicePrinters': {
 | |
|                         'url': PRINTERS2_URL,
 | |
|                         'hash': PRINTERS2_HASH
 | |
|                 },
 | |
|                 'DevicePrintersAllowlist': self.WHITELIST,
 | |
|                 'DevicePrintersBlocklist': self.BLACKLIST
 | |
|         }
 | |
| 
 | |
|         self.USER_ACCESS_MODE_NAME = 'NativePrintersBulkAccessMode'
 | |
|         self.DEVICE_ACCESS_MODE_NAME = 'DevicePrintersAccessMode'
 | |
|         self.ACCESS_MODE_VALUES = {'allowall': 2,
 | |
|                                    'whitelist': 1,
 | |
|                                    'blacklist': 0}
 | |
| 
 | |
| 
 | |
|     def _get_printer_ids(self):
 | |
|         """
 | |
|         Use autotest_private to read the ids of listed printers.
 | |
| 
 | |
|         @returns: a set of ids of printers that would be seen by a user under
 | |
|                   Print Destinations.
 | |
| 
 | |
|         """
 | |
|         self.cr.autotest_ext.ExecuteJavaScript(
 | |
|                 'window.__printers = null; '
 | |
|                 'chrome.autotestPrivate.getPrinterList(function(printers) {'
 | |
|                 '    window.__printers = printers;'
 | |
|                 '});')
 | |
|         self.cr.autotest_ext.WaitForJavaScriptCondition(
 | |
|                 'window.__printers !== null')
 | |
|         printers = self.cr.autotest_ext.EvaluateJavaScript(
 | |
|                 'window.__printers')
 | |
|         logging.info('Printers found: %s', printers)
 | |
| 
 | |
|         if not isinstance(printers, list):
 | |
|             raise error.TestFail('Received response is not a list!')
 | |
| 
 | |
|         ID_KEY = u'printerId'
 | |
|         ids = set()
 | |
|         for printer in printers:
 | |
|             if ID_KEY in printer:
 | |
|                 ids.add(printer[ID_KEY].encode('ascii'))
 | |
|             else:
 | |
|                 raise error.TestFail('Missing %s field!' % ID_KEY)
 | |
|         logging.info('Found ids: %s', ids)
 | |
| 
 | |
|         if len(ids) < len(printers):
 | |
|             raise error.TestFail('Received response contains duplicates!')
 | |
| 
 | |
|         return ids
 | |
| 
 | |
| 
 | |
|     def _resultant_set_of_ids(self, access_mode, set_of_all_ids):
 | |
|         """
 | |
|         Calculates resultant set of printers identifiers depending on given
 | |
|         access_mode.
 | |
| 
 | |
|         @param access_mode: one of strings: 'allowall', 'whitelist',
 | |
|             'blacklist' or None (policy not set).
 | |
|         @param set_of_all_ids: set of all printer identifiers.
 | |
| 
 | |
|         @returns: a set of ids of printers.
 | |
| 
 | |
|         """
 | |
|         if access_mode is None:
 | |
|             return set()
 | |
|         if access_mode == 'blacklist':
 | |
|             return set_of_all_ids - set(self.BLACKLIST)
 | |
|         if access_mode == 'whitelist':
 | |
|             return set_of_all_ids & set(self.WHITELIST)
 | |
|         if access_mode == 'allowall':
 | |
|             return set_of_all_ids
 | |
|         raise Exception("Incorrect value of access mode")
 | |
| 
 | |
| 
 | |
|     def _test_bulk_native_printers(self, case_device, case_user):
 | |
|         """
 | |
| 
 | |
|         @param case_device: access mode set in device policies (one of strings:
 | |
|                 'allowall', 'whitelist', 'blacklist') or None (policy not set).
 | |
|         @param case_user: access mode set in user policies (one of strings:
 | |
|                 'allowall', 'whitelist', 'blacklist') or None (policy not set).
 | |
| 
 | |
|         """
 | |
|         printers = self._get_printer_ids()
 | |
|         expected = self._resultant_set_of_ids(case_device, self.DEFINED_IDS2)
 | |
|         expected |= self._resultant_set_of_ids(case_user, self.DEFINED_IDS)
 | |
|         if printers != expected:
 | |
|             raise error.TestFail('Did not see expected printer output! '
 | |
|                                  'Expected %s, found %s.' % (expected,
 | |
|                                                              printers))
 | |
| 
 | |
| 
 | |
|     def run_once(self, case):
 | |
|         """
 | |
|         Entry point of this test.
 | |
| 
 | |
|         @param case: a tuple of two access modes, the first one is for device
 | |
|                 policies, the second one is for user policies. Each access mode
 | |
|                 equals one of the strings: 'allowall', 'whitelist', 'blacklist'
 | |
|                 or is set to None (what means 'policy not set').
 | |
| 
 | |
|         """
 | |
|         case_device, case_user = case
 | |
| 
 | |
|         if case_device is None:
 | |
|             self.device_policies = {}
 | |
|             enroll = False
 | |
|         else:
 | |
|             assert(case_device in self.ACCESS_MODE_VALUES)
 | |
|             self.device_policies[self.DEVICE_ACCESS_MODE_NAME] =\
 | |
|                     self.ACCESS_MODE_VALUES[case_device]
 | |
|             enroll = True
 | |
| 
 | |
|         if case_user is None:
 | |
|             self.user_policies = {}
 | |
|         else:
 | |
|             assert(case_user in self.ACCESS_MODE_VALUES)
 | |
|             self.user_policies[self.USER_ACCESS_MODE_NAME] =\
 | |
|                     self.ACCESS_MODE_VALUES[case_user]
 | |
| 
 | |
|         self.setup_case(device_policies=self.device_policies,
 | |
|                 user_policies=self.user_policies, enroll=enroll)
 | |
|         self._test_bulk_native_printers(case_device, case_user)
 |