class TestProfileManager(unittest.TestCase): def setUp(self): current_pkgs = [ Package(name="package1", version="1.0.0", release=1, arch="x86_64"), Package(name="package2", version="2.0.0", release=2, arch="x86_64")] self.current_profile = self._mock_pkg_profile(current_pkgs) self.profile_mgr = ProfileManager(current_profile=self.current_profile) def test_update_check_no_change(self): uuid = 'FAKEUUID' uep = Mock() uep.updatePackageProfile = Mock() self.profile_mgr.has_changed = Mock(return_value=False) self.profile_mgr.write_cache = Mock() self.profile_mgr.update_check(uep, uuid) self.assertEqual(0, uep.updatePackageProfile.call_count) self.assertEqual(0, self.profile_mgr.write_cache.call_count) def test_update_check_has_changed(self): uuid = 'FAKEUUID' uep = Mock() uep.updatePackageProfile = Mock() self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() self.profile_mgr.update_check(uep, uuid) uep.updatePackageProfile.assert_called_with(uuid, FACT_MATCHER) self.assertEqual(1, self.profile_mgr.write_cache.call_count) def test_update_check_packages_not_supported(self): uuid = 'FAKEUUID' uep = Mock() uep.supports_resource = Mock(return_value=False) uep.updatePackageProfile = Mock() self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() self.profile_mgr.update_check(uep, uuid) self.assertEqual(0, uep.updatePackageProfile.call_count) uep.supports_resource.assert_called_with('packages') self.assertEqual(0, self.profile_mgr.write_cache.call_count) def test_update_check_packages_disabled(self): uuid = 'FAKEUUID' uep = Mock() self.profile_mgr._set_report_package_profile(0) uep.updatePackageProfile = Mock() self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() self.profile_mgr.update_check(uep, uuid) self.assertEqual(0, uep.updatePackageProfile.call_count) uep.supports_resource.assert_called_with('packages') self.assertEqual(0, self.profile_mgr.write_cache.call_count) def test_update_check_error_uploading(self): uuid = 'FAKEUUID' uep = Mock() self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() # Throw an exception when trying to upload: uep.updatePackageProfile = Mock(side_effect=Exception('BOOM!')) self.assertRaises(Exception, self.profile_mgr.update_check, uep, uuid) uep.updatePackageProfile.assert_called_with(uuid, FACT_MATCHER) self.assertEqual(0, self.profile_mgr.write_cache.call_count) def test_has_changed_no_cache(self): self.profile_mgr._cache_exists = Mock(return_value=False) self.assertTrue(self.profile_mgr.has_changed()) def test_has_changed_no_changes(self): cached_pkgs = [ Package(name="package1", version="1.0.0", release=1, arch="x86_64"), Package(name="package2", version="2.0.0", release=2, arch="x86_64")] cached_profile = self._mock_pkg_profile(cached_pkgs) self.profile_mgr._cache_exists = Mock(return_value=True) self.profile_mgr._read_cache = Mock(return_value=cached_profile) self.assertFalse(self.profile_mgr.has_changed()) self.profile_mgr._read_cache.assert_called_with() def test_has_changed(self): cached_pkgs = [ Package(name="package1", version="1.0.0", release=1, arch="x86_64"), Package(name="package3", version="3.0.0", release=3, arch="x86_64")] cached_profile = self._mock_pkg_profile(cached_pkgs) self.profile_mgr._cache_exists = Mock(return_value=True) self.profile_mgr._read_cache = Mock(return_value=cached_profile) self.assertTrue(self.profile_mgr.has_changed()) self.profile_mgr._read_cache.assert_called_with() def test_update_check_consumer_uuid_none(self): uuid = None uep = Mock() self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() res = self.profile_mgr.update_check(uep, uuid) self.assertEqual(0, res) def test_package_json_handles_non_unicode(self): package = Package(name=b'\xf6', version=b'\xf6', release=b'\xf6', arch=b'\xf6', vendor=b'\xf6') data = package.to_dict() json_str = json.dumps(data) # to json data = json.loads(json_str) # and back to an object for attr in ['name', 'version', 'release', 'arch', 'vendor']: self.assertEqual(u'\ufffd', data[attr]) def test_package_json_as_unicode_type(self): # note that the data type at time of writing is bytes, so this is just defensive coding package = Package(name=u'Björk', version=u'Björk', release=u'Björk', arch=u'Björk', vendor=u'Björk') data = package.to_dict() json_str = json.dumps(data) # to json data = json.loads(json_str) # and back to an object for attr in ['name', 'version', 'release', 'arch', 'vendor']: self.assertEqual(u'Björk', data[attr]) def test_package_json_missing_attributes(self): package = Package(name=None, version=None, release=None, arch=None, vendor=None) data = package.to_dict() json_str = json.dumps(data) # to json data = json.loads(json_str) # and back to an object for attr in ['name', 'version', 'release', 'arch', 'vendor']: self.assertEqual(None, data[attr]) @staticmethod def _mock_pkg_profile(packages): """ Turn a list of package objects into an RPMProfile object. """ dict_list = [] for pkg in packages: dict_list.append(pkg.to_dict()) mock_file = Mock() mock_file.read = Mock(return_value=json.dumps(dict_list)) mock_profile = RPMProfile(from_file=mock_file) return mock_profile
class TestProfileManager(unittest.TestCase): def setUp(self): current_pkgs = [ Package(name="package1", version="1.0.0", release=1, arch="x86_64"), Package(name="package2", version="2.0.0", release=2, arch="x86_64")] self.current_profile = self._mock_pkg_profile(current_pkgs) self.profile_mgr = ProfileManager(current_profile=self.current_profile) def test_update_check_no_change(self): uuid = 'FAKEUUID' uep = Mock() uep.updatePackageProfile = Mock() self.profile_mgr.has_changed = Mock(return_value=False) self.profile_mgr.write_cache = Mock() self.profile_mgr.update_check(uep, uuid) self.assertEquals(0, uep.updatePackageProfile.call_count) self.assertEquals(0, self.profile_mgr.write_cache.call_count) def test_update_check_has_changed(self): uuid = 'FAKEUUID' uep = Mock() uep.updatePackageProfile = Mock() self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() self.profile_mgr.update_check(uep, uuid) uep.updatePackageProfile.assert_called_with(uuid, FACT_MATCHER) self.assertEquals(1, self.profile_mgr.write_cache.call_count) def test_update_check_packages_not_supported(self): uuid = 'FAKEUUID' uep = Mock() uep.supports_resource = Mock(return_value=False) uep.updatePackageProfile = Mock() self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() self.profile_mgr.update_check(uep, uuid) self.assertEquals(0, uep.updatePackageProfile.call_count) uep.supports_resource.assert_called_with('packages') self.assertEquals(0, self.profile_mgr.write_cache.call_count) def test_update_check_packages_disabled(self): uuid = 'FAKEUUID' uep = Mock() self.profile_mgr._set_report_package_profile(0) uep.updatePackageProfile = Mock() self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() self.profile_mgr.update_check(uep, uuid) self.assertEquals(0, uep.updatePackageProfile.call_count) uep.supports_resource.assert_called_with('packages') self.assertEquals(0, self.profile_mgr.write_cache.call_count) def test_update_check_error_uploading(self): uuid = 'FAKEUUID' uep = Mock() self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() # Throw an exception when trying to upload: uep.updatePackageProfile = Mock(side_effect=Exception('BOOM!')) self.assertRaises(Exception, self.profile_mgr.update_check, uep, uuid) uep.updatePackageProfile.assert_called_with(uuid, FACT_MATCHER) self.assertEquals(0, self.profile_mgr.write_cache.call_count) def test_has_changed_no_cache(self): self.profile_mgr._cache_exists = Mock(return_value=False) self.assertTrue(self.profile_mgr.has_changed()) def test_has_changed_no_changes(self): cached_pkgs = [ Package(name="package1", version="1.0.0", release=1, arch="x86_64"), Package(name="package2", version="2.0.0", release=2, arch="x86_64")] cached_profile = self._mock_pkg_profile(cached_pkgs) self.profile_mgr._cache_exists = Mock(return_value=True) self.profile_mgr._read_cache = Mock(return_value=cached_profile) self.assertFalse(self.profile_mgr.has_changed()) self.profile_mgr._read_cache.assert_called_with() def test_has_changed(self): cached_pkgs = [ Package(name="package1", version="1.0.0", release=1, arch="x86_64"), Package(name="package3", version="3.0.0", release=3, arch="x86_64")] cached_profile = self._mock_pkg_profile(cached_pkgs) self.profile_mgr._cache_exists = Mock(return_value=True) self.profile_mgr._read_cache = Mock(return_value=cached_profile) self.assertTrue(self.profile_mgr.has_changed()) self.profile_mgr._read_cache.assert_called_with() @staticmethod def _mock_pkg_profile(packages): """ Turn a list of package objects into an RPMProfile object. """ dict_list = [] for pkg in packages: dict_list.append(pkg.to_dict()) mock_file = Mock() mock_file.read = Mock(return_value=json.dumps(dict_list)) mock_profile = RPMProfile(from_file=mock_file) return mock_profile
class TestProfileManager(unittest.TestCase): def setUp(self): current_pkgs = [ Package(name="package1", version="1.0.0", release=1, arch="x86_64"), Package(name="package2", version="2.0.0", release=2, arch="x86_64") ] self.current_profile = self._mock_pkg_profile(current_pkgs) self.profile_mgr = ProfileManager(current_profile=self.current_profile) def test_update_check_no_change(self): uuid = 'FAKEUUID' uep = Mock() uep.updatePackageProfile = Mock() self.profile_mgr.has_changed = Mock(return_value=False) self.profile_mgr.write_cache = Mock() self.profile_mgr.update_check(uep, uuid) self.assertEqual(0, uep.updatePackageProfile.call_count) self.assertEqual(0, self.profile_mgr.write_cache.call_count) def test_update_check_has_changed(self): uuid = 'FAKEUUID' uep = Mock() uep.updatePackageProfile = Mock() self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() self.profile_mgr.update_check(uep, uuid) uep.updatePackageProfile.assert_called_with(uuid, FACT_MATCHER) self.assertEqual(1, self.profile_mgr.write_cache.call_count) def test_update_check_packages_not_supported(self): uuid = 'FAKEUUID' uep = Mock() uep.supports_resource = Mock(return_value=False) uep.updatePackageProfile = Mock() self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() self.profile_mgr.update_check(uep, uuid) self.assertEqual(0, uep.updatePackageProfile.call_count) uep.supports_resource.assert_called_with('packages') self.assertEqual(0, self.profile_mgr.write_cache.call_count) def test_update_check_packages_disabled(self): uuid = 'FAKEUUID' uep = Mock() self.profile_mgr._set_report_package_profile(0) uep.updatePackageProfile = Mock() self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() self.profile_mgr.update_check(uep, uuid) self.assertEqual(0, uep.updatePackageProfile.call_count) uep.supports_resource.assert_called_with('packages') self.assertEqual(0, self.profile_mgr.write_cache.call_count) def test_update_check_error_uploading(self): uuid = 'FAKEUUID' uep = Mock() self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() # Throw an exception when trying to upload: uep.updatePackageProfile = Mock(side_effect=Exception('BOOM!')) self.assertRaises(Exception, self.profile_mgr.update_check, uep, uuid) uep.updatePackageProfile.assert_called_with(uuid, FACT_MATCHER) self.assertEqual(0, self.profile_mgr.write_cache.call_count) def test_has_changed_no_cache(self): self.profile_mgr._cache_exists = Mock(return_value=False) self.assertTrue(self.profile_mgr.has_changed()) def test_has_changed_no_changes(self): cached_pkgs = [ Package(name="package1", version="1.0.0", release=1, arch="x86_64"), Package(name="package2", version="2.0.0", release=2, arch="x86_64") ] cached_profile = self._mock_pkg_profile(cached_pkgs) self.profile_mgr._cache_exists = Mock(return_value=True) self.profile_mgr._read_cache = Mock(return_value=cached_profile) self.assertFalse(self.profile_mgr.has_changed()) self.profile_mgr._read_cache.assert_called_with() def test_has_changed(self): cached_pkgs = [ Package(name="package1", version="1.0.0", release=1, arch="x86_64"), Package(name="package3", version="3.0.0", release=3, arch="x86_64") ] cached_profile = self._mock_pkg_profile(cached_pkgs) self.profile_mgr._cache_exists = Mock(return_value=True) self.profile_mgr._read_cache = Mock(return_value=cached_profile) self.assertTrue(self.profile_mgr.has_changed()) self.profile_mgr._read_cache.assert_called_with() def test_update_check_consumer_uuid_none(self): uuid = None uep = Mock() self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() res = self.profile_mgr.update_check(uep, uuid) self.assertEqual(0, res) @staticmethod def _mock_pkg_profile(packages): """ Turn a list of package objects into an RPMProfile object. """ dict_list = [] for pkg in packages: dict_list.append(pkg.to_dict()) mock_file = Mock() mock_file.read = Mock(return_value=json.dumps(dict_list)) mock_profile = RPMProfile(from_file=mock_file) return mock_profile
class TestProfileManager(unittest.TestCase): def setUp(self): current_pkgs = [ Package(name="package1", version="1.0.0", release=1, arch="x86_64"), Package(name="package2", version="2.0.0", release=2, arch="x86_64") ] temp_repo_dir = tempfile.mkdtemp() self.addCleanup(shutil.rmtree, temp_repo_dir) repo_file_name = os.path.join(temp_repo_dir, 'awesome.repo') with open(repo_file_name, 'w') as repo_file: repo_file.write(CONTENT_REPO_FILE) self.current_profile = self._mock_pkg_profile(current_pkgs, repo_file_name, ENABLED_MODULES) self.profile_mgr = ProfileManager() self.profile_mgr.current_profile = self.current_profile def test_update_check_no_change(self): uuid = 'FAKEUUID' uep = Mock() uep.updatePackageProfile = Mock() self.profile_mgr.has_changed = Mock(return_value=False) self.profile_mgr.write_cache = Mock() self.profile_mgr.update_check(uep, uuid) self.assertEqual(0, uep.updatePackageProfile.call_count) self.assertEqual(0, self.profile_mgr.write_cache.call_count) def test_update_check_has_changed(self): uuid = 'FAKEUUID' uep = Mock() uep.has_capability = Mock(return_value=False) uep.updatePackageProfile = Mock() self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() self.profile_mgr.update_check(uep, uuid) uep.updatePackageProfile.assert_called_with(uuid, FACT_MATCHER) self.assertEqual(1, self.profile_mgr.write_cache.call_count) def test_combined_profile_update_check_has_changed(self): uuid = 'FAKEUUID' uep = Mock() uep.has_capability = Mock(return_value=True) uep.updateCombinedProfile = Mock() self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() self.profile_mgr.update_check(uep, uuid) uep.updateCombinedProfile.assert_called_with(uuid, FACT_MATCHER) self.assertEqual(1, self.profile_mgr.write_cache.call_count) def test_update_check_packages_not_supported(self): uuid = 'FAKEUUID' uep = Mock() uep.supports_resource = Mock(return_value=False) uep.updatePackageProfile = Mock() self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() self.profile_mgr.update_check(uep, uuid) self.assertEqual(0, uep.updatePackageProfile.call_count) uep.supports_resource.assert_called_with('packages') self.assertEqual(0, self.profile_mgr.write_cache.call_count) def test_update_check_packages_disabled(self): uuid = 'FAKEUUID' uep = Mock() self.profile_mgr.report_package_profile = 0 uep.updatePackageProfile = Mock() self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() self.profile_mgr.update_check(uep, uuid) self.assertEqual(0, uep.updatePackageProfile.call_count) uep.supports_resource.assert_called_with('packages') self.assertEqual(0, self.profile_mgr.write_cache.call_count) def test_report_package_profile_environment_variable(self): with patch.dict('os.environ', {'SUBMAN_DISABLE_PROFILE_REPORTING': '1'}), \ patch.object(cache, 'conf') as conf: # report_package_profile is set to 1 and SUBMAN_DISABLE_PROFILE_REPORTING is set to 1, the # package profile should not be reported. conf.__getitem__.return_value.get_int.return_value = 1 self.assertFalse(self.profile_mgr.profile_reporting_enabled()) # report_package_profile in rhsm.conf is set to 0 and SUBMAN_DISABLE_PROFILE_REPORTING is set # to 1, the package profile should not be reported. conf.__getitem__.return_value.get_int.return_value = 0 self.assertFalse(self.profile_mgr.profile_reporting_enabled()) with patch.dict('os.environ', {'SUBMAN_DISABLE_PROFILE_REPORTING': '0'}), \ patch.object(cache, 'conf') as conf: # report_package_profile in rhsm.conf is set to 1 and SUBMAN_DISABLE_PROFILE_REPORTING is set # to 0, the package profile should be reported. conf.__getitem__.return_value.get_int.return_value = 1 self.assertTrue(self.profile_mgr.profile_reporting_enabled()) # report_package_profile in rhsm.conf is set to 0 and SUBMAN_DISABLE_PROFILE_REPORTING is set # to 0, the package profile should not be reported. conf.__getitem__.return_value.get_int.return_value = 0 self.assertFalse(self.profile_mgr.profile_reporting_enabled()) with patch.dict('os.environ', {}), patch.object(cache, 'conf') as conf: # report_package_profile in rhsm.conf is set to 1 and SUBMAN_DISABLE_PROFILE_REPORTING is not # set, the package profile should be reported. conf.__getitem__.return_value.get_int.return_value = 1 self.assertTrue(self.profile_mgr.profile_reporting_enabled()) # report_package_profile in rhsm.conf is set to 0 and SUBMAN_DISABLE_PROFILE_REPORTING is not # set, the package profile should not be reported. conf.__getitem__.return_value.get_int.return_value = 0 self.assertFalse(self.profile_mgr.profile_reporting_enabled()) def test_update_check_error_uploading(self): uuid = 'FAKEUUID' uep = Mock() uep.has_capability = Mock(return_value=False) self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() # Throw an exception when trying to upload: uep.updatePackageProfile = Mock(side_effect=Exception('BOOM!')) self.assertRaises(Exception, self.profile_mgr.update_check, uep, uuid) uep.updatePackageProfile.assert_called_with(uuid, FACT_MATCHER) self.assertEqual(0, self.profile_mgr.write_cache.call_count) def test_combined_profile_update_check_error_uploading(self): uuid = 'FAKEUUID' uep = Mock() uep.has_capability = Mock(return_value=True) self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() # Throw an exception when trying to upload: uep.updateCombinedProfile = Mock(side_effect=Exception('BOOM!')) self.assertRaises(Exception, self.profile_mgr.update_check, uep, uuid) uep.updateCombinedProfile.assert_called_with(uuid, FACT_MATCHER) self.assertEqual(0, self.profile_mgr.write_cache.call_count) def test_has_changed_no_cache(self): self.profile_mgr._cache_exists = Mock(return_value=False) self.assertTrue(self.profile_mgr.has_changed()) def test_has_changed_no_changes(self): cached_pkgs = [ Package(name="package1", version="1.0.0", release=1, arch="x86_64"), Package(name="package2", version="2.0.0", release=2, arch="x86_64") ] temp_repo_dir = tempfile.mkdtemp() self.addCleanup(shutil.rmtree, temp_repo_dir) repo_file_name = os.path.join(temp_repo_dir, 'awesome.repo') with open(repo_file_name, 'w') as repo_file: repo_file.write(CONTENT_REPO_FILE) cached_profile = self._mock_pkg_profile(cached_pkgs, repo_file_name, ENABLED_MODULES) self.profile_mgr._cache_exists = Mock(return_value=True) self.profile_mgr._read_cache = Mock(return_value=cached_profile) self.assertFalse(self.profile_mgr.has_changed()) self.profile_mgr._read_cache.assert_called_with() def test_has_changed(self): cached_pkgs = [ Package(name="package1", version="1.0.0", release=1, arch="x86_64"), Package(name="package3", version="3.0.0", release=3, arch="x86_64") ] cached_profile = self._mock_pkg_profile( cached_pkgs, "/non/existing/path/to/repo/file", []) self.profile_mgr._cache_exists = Mock(return_value=True) self.profile_mgr._read_cache = Mock(return_value=cached_profile) self.assertTrue(self.profile_mgr.has_changed()) self.profile_mgr._read_cache.assert_called_with() def test_update_check_consumer_uuid_none(self): uuid = None uep = Mock() self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() res = self.profile_mgr.update_check(uep, uuid) self.assertEqual(0, res) def test_package_json_handles_non_unicode(self): package = Package(name=b'\xf6', version=b'\xf6', release=b'\xf6', arch=b'\xf6', vendor=b'\xf6') data = package.to_dict() json_str = json.dumps(data) # to json data = json.loads(json_str) # and back to an object for attr in ['name', 'version', 'release', 'arch', 'vendor']: self.assertEqual(u'\ufffd', data[attr]) def test_package_json_as_unicode_type(self): # note that the data type at time of writing is bytes, so this is just defensive coding package = Package(name=u'Björk', version=u'Björk', release=u'Björk', arch=u'Björk', vendor=u'Björk') data = package.to_dict() json_str = json.dumps(data) # to json data = json.loads(json_str) # and back to an object for attr in ['name', 'version', 'release', 'arch', 'vendor']: self.assertEqual(u'Björk', data[attr]) def test_package_json_missing_attributes(self): package = Package(name=None, version=None, release=None, arch=None, vendor=None) data = package.to_dict() json_str = json.dumps(data) # to json data = json.loads(json_str) # and back to an object for attr in ['name', 'version', 'release', 'arch', 'vendor']: self.assertEqual(None, data[attr]) def test_module_md_uniquify(self): modules_input = [{ "name": "duck", "stream": 0, "version": "20180730233102", "context": "deadbeef", "arch": "noarch", "profiles": ["default"], "installed_profiles": [], "status": "enabled" }, { "name": "duck", "stream": 0, "version": "20180707144203", "context": "c0ffee42", "arch": "noarch", "profiles": ["default", "server"], "installed_profiles": ["server"], "status": "unknown" }] self.assertEqual(modules_input, ModulesProfile._uniquify(modules_input)) # now test dup modules self.assertEqual( modules_input, ModulesProfile._uniquify(modules_input + [modules_input[0]])) @staticmethod def _mock_pkg_profile(packages, repo_file, enabled_modules): """ Turn a list of package objects into an RPMProfile object. """ dict_list = [] for pkg in packages: dict_list.append(pkg.to_dict()) mock_file = Mock() mock_file.read = Mock(return_value=json.dumps(dict_list)) mock_rpm_profile = RPMProfile(from_file=mock_file) mock_enabled_repos_profile = EnabledReposProfile(repo_file=repo_file) mock_module_profile = ModulesProfile() mock_module_profile.collect = Mock(return_value=enabled_modules) mock_profile = { "rpm": mock_rpm_profile, "enabled_repos": mock_enabled_repos_profile, "modulemd": mock_module_profile } return mock_profile
class TestProfileManager(unittest.TestCase): def setUp(self): current_pkgs = [ Package(name="package1", version="1.0.0", release=1, arch="x86_64"), Package(name="package2", version="2.0.0", release=2, arch="x86_64") ] temp_repo_dir = tempfile.mkdtemp() self.addCleanup(shutil.rmtree, temp_repo_dir) repo_file_name = os.path.join(temp_repo_dir, 'awesome.repo') with open(repo_file_name, 'w') as repo_file: repo_file.write(CONTENT_REPO_FILE) self.current_profile = self._mock_pkg_profile(current_pkgs, repo_file_name, ENABLED_MODULES) self.profile_mgr = ProfileManager() self.profile_mgr.current_profile = self.current_profile def test_update_check_no_change(self): uuid = 'FAKEUUID' uep = Mock() uep.updatePackageProfile = Mock() self.profile_mgr.has_changed = Mock(return_value=False) self.profile_mgr.write_cache = Mock() self.profile_mgr.update_check(uep, uuid) self.assertEqual(0, uep.updatePackageProfile.call_count) self.assertEqual(0, self.profile_mgr.write_cache.call_count) def test_update_check_has_changed(self): uuid = 'FAKEUUID' uep = Mock() uep.has_capability = Mock(return_value=False) uep.updatePackageProfile = Mock() self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() self.profile_mgr.update_check(uep, uuid, True) uep.updatePackageProfile.assert_called_with(uuid, FACT_MATCHER) self.assertEqual(1, self.profile_mgr.write_cache.call_count) def test_combined_profile_update_check_has_changed(self): uuid = 'FAKEUUID' uep = Mock() uep.has_capability = Mock(return_value=True) uep.updateCombinedProfile = Mock() self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() self.profile_mgr.update_check(uep, uuid, True) uep.updateCombinedProfile.assert_called_with(uuid, FACT_MATCHER) self.assertEqual(1, self.profile_mgr.write_cache.call_count) def test_update_check_packages_not_supported(self): uuid = 'FAKEUUID' uep = Mock() uep.supports_resource = Mock(return_value=False) uep.updatePackageProfile = Mock() self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() self.profile_mgr.update_check(uep, uuid) self.assertEqual(0, uep.updatePackageProfile.call_count) uep.supports_resource.assert_called_with('packages') self.assertEqual(0, self.profile_mgr.write_cache.call_count) def test_update_check_packages_disabled(self): uuid = 'FAKEUUID' uep = Mock() self.profile_mgr.report_package_profile = 0 uep.updatePackageProfile = Mock() self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() self.profile_mgr.update_check(uep, uuid) self.assertEqual(0, uep.updatePackageProfile.call_count) uep.supports_resource.assert_called_with('packages') self.assertEqual(0, self.profile_mgr.write_cache.call_count) def test_report_package_profile_environment_variable(self): with patch.dict('os.environ', {'SUBMAN_DISABLE_PROFILE_REPORTING': '1'}), \ patch.object(cache, 'conf') as conf: # report_package_profile is set to 1 and SUBMAN_DISABLE_PROFILE_REPORTING is set to 1, the # package profile should not be reported. conf.__getitem__.return_value.get_int.return_value = 1 self.assertFalse(self.profile_mgr.profile_reporting_enabled()) # report_package_profile in rhsm.conf is set to 0 and SUBMAN_DISABLE_PROFILE_REPORTING is set # to 1, the package profile should not be reported. conf.__getitem__.return_value.get_int.return_value = 0 self.assertFalse(self.profile_mgr.profile_reporting_enabled()) with patch.dict('os.environ', {'SUBMAN_DISABLE_PROFILE_REPORTING': '0'}), \ patch.object(cache, 'conf') as conf: # report_package_profile in rhsm.conf is set to 1 and SUBMAN_DISABLE_PROFILE_REPORTING is set # to 0, the package profile should be reported. conf.__getitem__.return_value.get_int.return_value = 1 self.assertTrue(self.profile_mgr.profile_reporting_enabled()) # report_package_profile in rhsm.conf is set to 0 and SUBMAN_DISABLE_PROFILE_REPORTING is set # to 0, the package profile should not be reported. conf.__getitem__.return_value.get_int.return_value = 0 self.assertFalse(self.profile_mgr.profile_reporting_enabled()) with patch.dict('os.environ', {}), patch.object(cache, 'conf') as conf: # report_package_profile in rhsm.conf is set to 1 and SUBMAN_DISABLE_PROFILE_REPORTING is not # set, the package profile should be reported. conf.__getitem__.return_value.get_int.return_value = 1 self.assertTrue(self.profile_mgr.profile_reporting_enabled()) # report_package_profile in rhsm.conf is set to 0 and SUBMAN_DISABLE_PROFILE_REPORTING is not # set, the package profile should not be reported. conf.__getitem__.return_value.get_int.return_value = 0 self.assertFalse(self.profile_mgr.profile_reporting_enabled()) def test_update_check_error_uploading(self): uuid = 'FAKEUUID' uep = Mock() uep.has_capability = Mock(return_value=False) self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() # Throw an exception when trying to upload: uep.updatePackageProfile = Mock(side_effect=Exception('BOOM!')) self.assertRaises(Exception, self.profile_mgr.update_check, uep, uuid, True) uep.updatePackageProfile.assert_called_with(uuid, FACT_MATCHER) self.assertEqual(0, self.profile_mgr.write_cache.call_count) def test_combined_profile_update_check_error_uploading(self): uuid = 'FAKEUUID' uep = Mock() uep.has_capability = Mock(return_value=True) self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() # Throw an exception when trying to upload: uep.updateCombinedProfile = Mock(side_effect=Exception('BOOM!')) self.assertRaises(Exception, self.profile_mgr.update_check, uep, uuid, True) uep.updateCombinedProfile.assert_called_with(uuid, FACT_MATCHER) self.assertEqual(0, self.profile_mgr.write_cache.call_count) def test_has_changed_no_cache(self): self.profile_mgr._cache_exists = Mock(return_value=False) self.assertTrue(self.profile_mgr.has_changed()) def test_has_changed_no_changes(self): cached_pkgs = [ Package(name="package1", version="1.0.0", release=1, arch="x86_64"), Package(name="package2", version="2.0.0", release=2, arch="x86_64") ] temp_repo_dir = tempfile.mkdtemp() self.addCleanup(shutil.rmtree, temp_repo_dir) repo_file_name = os.path.join(temp_repo_dir, 'awesome.repo') with open(repo_file_name, 'w') as repo_file: repo_file.write(CONTENT_REPO_FILE) cached_profile = self._mock_pkg_profile(cached_pkgs, repo_file_name, ENABLED_MODULES) self.profile_mgr._cache_exists = Mock(return_value=True) self.profile_mgr._read_cache = Mock(return_value=cached_profile) self.assertFalse(self.profile_mgr.has_changed()) self.profile_mgr._read_cache.assert_called_with() def test_has_changed(self): cached_pkgs = [ Package(name="package1", version="1.0.0", release=1, arch="x86_64"), Package(name="package3", version="3.0.0", release=3, arch="x86_64") ] cached_profile = self._mock_pkg_profile(cached_pkgs, "/non/existing/path/to/repo/file", []) self.profile_mgr._cache_exists = Mock(return_value=True) self.profile_mgr._read_cache = Mock(return_value=cached_profile) self.assertTrue(self.profile_mgr.has_changed()) self.profile_mgr._read_cache.assert_called_with() def test_update_check_consumer_uuid_none(self): uuid = None uep = Mock() self.profile_mgr.has_changed = Mock(return_value=True) self.profile_mgr.write_cache = Mock() res = self.profile_mgr.update_check(uep, uuid) self.assertEqual(0, res) def test_package_json_handles_non_unicode(self): package = Package(name=b'\xf6', version=b'\xf6', release=b'\xf6', arch=b'\xf6', vendor=b'\xf6') data = package.to_dict() json_str = json.dumps(data) # to json data = json.loads(json_str) # and back to an object for attr in ['name', 'version', 'release', 'arch', 'vendor']: self.assertEqual(u'\ufffd', data[attr]) def test_package_json_as_unicode_type(self): # note that the data type at time of writing is bytes, so this is just defensive coding package = Package(name=u'Björk', version=u'Björk', release=u'Björk', arch=u'Björk', vendor=u'Björk') data = package.to_dict() json_str = json.dumps(data) # to json data = json.loads(json_str) # and back to an object for attr in ['name', 'version', 'release', 'arch', 'vendor']: self.assertEqual(u'Björk', data[attr]) def test_package_json_missing_attributes(self): package = Package(name=None, version=None, release=None, arch=None, vendor=None) data = package.to_dict() json_str = json.dumps(data) # to json data = json.loads(json_str) # and back to an object for attr in ['name', 'version', 'release', 'arch', 'vendor']: self.assertEqual(None, data[attr]) def test_module_md_uniquify(self): modules_input = [ { "name": "duck", "stream": 0, "version": "20180730233102", "context": "deadbeef", "arch": "noarch", "profiles": ["default"], "installed_profiles": [], "status": "enabled" }, { "name": "duck", "stream": 0, "version": "20180707144203", "context": "c0ffee42", "arch": "noarch", "profiles": ["default", "server"], "installed_profiles": ["server"], "status": "unknown" } ] self.assertEqual(modules_input, ModulesProfile._uniquify(modules_input)) # now test dup modules self.assertEqual(modules_input, ModulesProfile._uniquify(modules_input + [modules_input[0]])) @staticmethod def _mock_pkg_profile(packages, repo_file, enabled_modules): """ Turn a list of package objects into an RPMProfile object. """ dict_list = [] for pkg in packages: dict_list.append(pkg.to_dict()) mock_file = Mock() mock_file.read = Mock(return_value=json.dumps(dict_list)) mock_rpm_profile = RPMProfile(from_file=mock_file) mock_enabled_repos_profile = EnabledReposProfile(repo_file=repo_file) mock_module_profile = ModulesProfile() mock_module_profile.collect = Mock(return_value=enabled_modules) mock_profile = { "rpm": mock_rpm_profile, "enabled_repos": mock_enabled_repos_profile, "modulemd": mock_module_profile } return mock_profile