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)
|