# 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 json from mock import patch import unittest from autotest_lib.client.common_lib import error from autotest_lib.client.cros.enterprise import policy_group from autotest_lib.client.cros.enterprise import policy_manager """ This is the unittest file for policy_manager.py. If you modify that file, you should be at minimum re-running this file. Add and correct tests as changes are made to the utils file. To run the tests, use the following command from your DEV box (outside_chroot): src/third_party/autotest/files/utils$ python unittest_suite.py \ autotest_lib.client.cros.enterprise.policy_manager_unittest --debug """ FX_NAME = '_get_pol_from_api' PATCH_BASE = 'autotest_lib.client.cros.enterprise.enterprise_policy_utils' PATCH_PATH = '{}.{}'.format(PATCH_BASE, FX_NAME) class TestPolicyManager(unittest.TestCase): def configPolicyManager(self, username=None): self.policy_manager = policy_manager.Policy_Manager(username) self.policy_manager.autotest_ext = 'Demo' self.maxDiff = None self.expected = {'deviceLocalAccountPolicies': {}, 'extensionPolicies': { 'ExtID1': {'Extension Policy 1': {'scope': 'user', 'level': 'mandatory', 'value': 'EP1', 'source': 'cloud'}}}, 'chromePolicies': {'Suggested Policy 1': {'scope': 'user', 'level': 'recommended', 'value': 'Suggested 1', 'source': 'cloud'}, 'Test Policy1': {'scope': 'user', 'level': 'mandatory', 'value': 'Policy1', 'source': 'cloud'}, 'Device Policy1': {'scope': 'machine', 'level': 'mandatory', 'value': 'Device 1', 'source': 'cloud'}}} def test_Defaults(self): self.configPolicyManager() self.assertEqual(type(self.policy_manager._configured), policy_group.AllPolicies) self.assertEqual(type(self.policy_manager._obtained), policy_group.AllPolicies) def test_configure_policies_and_get_configured_as_dict(self): self.configPolicyManager() self.policy_manager.configure_policies( user={'Test Policy1': 'Policy1'}, device={'Device Policy1': 'Device 1'}, suggested_user={'Suggested Policy 1': 'Suggested 1'}, extension={'ExtID1': {'Extension Policy 1': 'EP1'}}) configured = self.policy_manager.get_configured_policies_as_dict() self.assertEqual(configured, self.expected) @patch(PATCH_PATH) def test_obtain_policies_from_device_and_get_obtained_policies_as_dict( self, get_pol_mock): self.configPolicyManager() get_pol_mock.return_value = self.expected self.policy_manager.obtain_policies_from_device() received = self.policy_manager.get_obtained_policies_as_dict() self.assertEqual(received, self.expected) def test_changing_policy(self): """Test setting a policy to True, then changing the value""" self.policy_manager = policy_manager.Policy_Manager() self.policy_manager.configure_policies(user={'TP1': False}) configured = self.policy_manager.get_configured_policies_as_dict() self.assertEqual(configured['chromePolicies']['TP1']['value'], False) # Now set the policy to False self.policy_manager.configure_policies(user={'TP1': True}, new=False) configured = self.policy_manager.get_configured_policies_as_dict() self.assertEqual(configured['chromePolicies']['TP1']['value'], True) def test_remove_policy(self): """ Will test remove_policy and the private methods: _removeChromePolicy _removeExtensionPolicy """ # Setup the policy Manager self.policy_manager = policy_manager.Policy_Manager() self.policy_manager.configure_policies( user={'Test Policy1': 'Policy1', 'Test Policy2': 'Policy2'}) # Remove one policy. Verify it is gone, but the other is there. self.policy_manager.remove_policy('Test Policy2', 'user') self.assertNotIn('Test Policy2', self.policy_manager._configured.chrome) self.assertIn('Test Policy1', self.policy_manager._configured.chrome) # Add an extension Policy. Verify it is there, then remove and verify. self.policy_manager.configure_policies(extension={'ID1': {'P1': 'V1'}}, new=False) self.assertIn('ID1', self.policy_manager._configured.extension_configured_data) self.assertIn('P1', self.policy_manager._configured.extension_configured_data['ID1']) self.policy_manager.remove_policy('P1', 'extension', extID='ID1') self.assertNotIn('P1', self.policy_manager._configured.extension_configured_data['ID1']) # Attempt to remove non-existant policies. Verify an error is raised with self.assertRaises(error.TestError) as context: self.policy_manager.remove_policy('Test Policy2', 'user') self.assertEqual(str(context.exception), 'Policy Test Policy2 missing from chrome policies.') # Attempt to remove an extension policy without an ID and non-existant # policy in the valid extension with self.assertRaises(error.TestError) as context: self.policy_manager.remove_policy('P1', 'extension') self.assertEqual(str(context.exception), 'Cannot delete extension policy without extension ID') with self.assertRaises(error.TestError) as context: self.policy_manager.remove_policy('P2', 'extension', 'ID1') self.assertEqual(str(context.exception), 'Policy P2 missing from extension policies.') @patch(PATCH_PATH) def test_verify_policies(self, get_pol_mock): """Test the verify_policies method.""" self.configPolicyManager() self.policy_manager.configure_policies( user={'Test Policy1': 'Policy1'}, device={'Device Policy1': 'Device 1'}, suggested_user={'Suggested Policy 1': 'Suggested 1'}, extension={'ExtID1': {'Extension Policy 1': 'EP1'}}) get_pol_mock.return_value = self.expected self.policy_manager.obtain_policies_from_device() self.policy_manager.verify_policies() # Add another policy to the configured, and test verify_policies fails. self.policy_manager.configure_policies(extension={'ID1': {'P1': 'V1'}}, new=False) with self.assertRaises(error.TestError) as context: self.policy_manager.verify_policies() self.assertEqual( str(context.exception), 'Configured policies did not match policies received from DUT.') @patch(PATCH_PATH) def test_verify_special_extension(self, get_pol_mock): """Test the configure_extension_visual_policy and the verify_policies methods.""" self.configPolicyManager() self.policy_manager.configure_policies( user={'Test Policy1': 'Policy1'}, device={'Device Policy1': 'Device 1'}, suggested_user={'Suggested Policy 1': 'Suggested 1'}, extension={'ExtID1': {'Afile': 'Adirectory'}}) get_pol_mock.return_value = self.expected self.policy_manager.obtain_policies_from_device() with self.assertRaises(error.TestError) as context: self.policy_manager.verify_policies() self.assertEqual( str(context.exception), 'Configured policies did not match policies received from DUT.') # Add the "visual" policy (aka how the policy should be reported). self.policy_manager.configure_extension_visual_policy( {'ExtID1': {'Extension Policy 1': 'EP1'}}) self.policy_manager.verify_policies() # Test the configured shows actual policy value by default configured_policies = (self.policy_manager. get_configured_policies_as_dict()) expected_extension = {'ExtID1': {'Afile': {'scope': 'user', 'level': 'mandatory', 'value': 'Adirectory', 'source': 'cloud'}}} self.assertEqual(expected_extension, configured_policies['extensionPolicies']) # Finally, test the configured can also get the 'visual' policy. visual_configured_policies = (self.policy_manager. get_configured_policies_as_dict(True)) expected_extension = {'ExtID1': {'Extension Policy 1': {'scope': 'user', 'level': 'mandatory', 'value': 'EP1', 'source': 'cloud'}}} self.assertEqual(expected_extension, visual_configured_policies['extensionPolicies']) @patch(PATCH_PATH) def test_get_policy_value_from_DUT(self, get_pol_mock): """Test obtaining a single policy value from the DUT: Getting a policy prior to obtaining (returns None) Getting a normal chrome policy, using the Refresh flag Getting an ExtensionPolicy """ self.configPolicyManager() policy_value = self.policy_manager.get_policy_value_from_DUT( 'Test Policy1') self.assertEqual(policy_value, None) get_pol_mock.return_value = self.expected policy_value = self.policy_manager.get_policy_value_from_DUT( 'Test Policy1', refresh=True) self.assertEqual(policy_value, 'Policy1') extension_policy_value = self.policy_manager.get_policy_value_from_DUT( 'Extension Policy 1', 'ExtID1', False) self.assertEqual(extension_policy_value, 'EP1') def test_DMServerConfig(self): """ Test the getDMConfig method via the following: Test the default DM json Test the DM Json when policies are configured. """ self.configPolicyManager('Test_UserName') base_config = json.loads(self.policy_manager.getDMConfig()) default_dm = ( {'invalidation_name': 'test_policy', 'invalidation_source': 16, 'google/chromeos/device': {}, 'current_key_index': 0, 'google/chrome/extension': {}, 'managed_users': ['*'], 'google/chromeos/user': {'recommended': {}, 'mandatory': {}}, 'policy_user': 'Test_UserName'}) self.assertEqual(base_config, default_dm) self.policy_manager.configure_policies( user={'Test Policy1': 'Policy1'}, device={'SystemTimezone': 'Device 1'}, suggested_user={'Suggested Policy 1': 'Suggested 1'}, extension={'ExtID1': {'Extension Policy 1': 'EP1'}}) expected_DMJson = ( {"invalidation_name": "test_policy", "invalidation_source": 16, "google/chromeos/device": {"system_timezone.timezone": "Device 1"}, "current_key_index": 0, "google/chrome/extension": {"ExtID1": {"Extension Policy 1": "EP1"}}, "managed_users": ["*"], "google/chromeos/user": {"recommended": {"Suggested Policy 1": "Suggested 1"}, "mandatory": {"Test Policy1": "Policy1"}}, "policy_user": "Test_UserName"}) Dm_with_policies = json.loads(self.policy_manager.getDMConfig()) self.assertEqual(Dm_with_policies, expected_DMJson) def test_getCloudDpc(self): """ Test getCloudDpc and the following private methods: _arc_certs _add_shared_arc_policy _add_shared_policies _add_arc_certs """ self.configPolicyManager() self.policy_manager.configure_policies( user={'Test Policy1': 'Policy1', 'ArcCertificatesSyncMode': 'TestValue1', 'OpenNetworkConfiguration': 'Apolicy', 'VideoCaptureAllowed': True, 'ArcPolicy': {'applications': 'SomeApplication', 'OtherPolicy': 'OtherValue'} }) expected = {'applications': 'SomeApplication', 'cameraDisabled': True, 'caCerts': 'Apolicy'} cloudDpcPolicies = self.policy_manager.getCloudDpc() self.assertEqual(expected, cloudDpcPolicies) if __name__ == '__main__': unittest.main()