It is not a separate package since Python 3.3 Signed-off-by: Lubomír Sedlář <lsedlar@redhat.com> (cherry picked from commit 3987688de6720d951bfeb0b49c364df9738b490b)
		
			
				
	
	
		
			1853 lines
		
	
	
		
			69 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			1853 lines
		
	
	
		
			69 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # -*- coding: utf-8 -*-
 | |
| 
 | |
| import copy
 | |
| import json
 | |
| import os
 | |
| import unittest
 | |
| from unittest import mock
 | |
| 
 | |
| from pungi.phases import gather
 | |
| from pungi.phases.gather import _mk_pkg_map
 | |
| from pungi.phases.pkgset.common import MaterializedPackageSet
 | |
| from tests import helpers
 | |
| from tests.helpers import MockPackageSet, MockPkg
 | |
| 
 | |
| 
 | |
| def _join(a, *rest):
 | |
|     res = copy.deepcopy(a)
 | |
|     for b in rest:
 | |
|         for key in res:
 | |
|             res[key].extend(b[key])
 | |
|     return res
 | |
| 
 | |
| 
 | |
| class TestGatherWrapper(helpers.PungiTestCase):
 | |
|     def setUp(self):
 | |
|         super(TestGatherWrapper, self).setUp()
 | |
|         self.compose = helpers.DummyCompose(self.topdir, {})
 | |
|         self.package_set = mock.Mock()
 | |
|         self.variant = helpers.MockVariant(
 | |
|             uid="Server", arches=["x86_64"], type="variant"
 | |
|         )
 | |
|         self.optional = helpers.MockVariant(
 | |
|             uid="Server-optional",
 | |
|             arches=["x86_64"],
 | |
|             type="optional",
 | |
|             parent=self.variant,
 | |
|         )
 | |
|         self.addon = helpers.MockVariant(
 | |
|             uid="Server-HA", arches=["x86_64"], type="addon", parent=self.variant
 | |
|         )
 | |
|         self.lp = helpers.MockVariant(
 | |
|             uid="Server-LP",
 | |
|             arches=["x86_64"],
 | |
|             type="layered-product",
 | |
|             parent=self.variant,
 | |
|         )
 | |
|         self.server_packages = {
 | |
|             "rpm": [{"path": "/build/foo-1.0-1.x86_64.rpm", "flags": ["input"]}],
 | |
|             "srpm": [{"path": "/build/foo-1.0-1.src.rpm", "flags": []}],
 | |
|             "debuginfo": [
 | |
|                 {"path": "/build/foo-debuginfo-1.0-1.x86_64.rpm", "flags": []}
 | |
|             ],
 | |
|         }
 | |
|         self.maxDiff = None
 | |
| 
 | |
|     def _dummy_gather(self, compose, arch, variant, package_sets, **kwargs):
 | |
|         self.assertEqual(
 | |
|             package_sets,
 | |
|             self.package_set,
 | |
|             "Called gather_packages on %s.%s with bad package sets"
 | |
|             % (variant.uid, arch),
 | |
|         )
 | |
|         if variant.uid == "Server":
 | |
|             return self.server_packages
 | |
|         if variant.uid == "Server-optional":
 | |
|             return self.optional_packages
 | |
|         if variant.uid == "Server-HA":
 | |
|             return self.addon_packages
 | |
|         if variant.uid == "Server-LP":
 | |
|             return self.lp_packages
 | |
|         self.assertFalse("This should not be reached - variant %s" % variant.uid)
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.write_packages")
 | |
|     @mock.patch("pungi.phases.gather.gather_packages")
 | |
|     def test_single_variant(self, gather_packages, write_packages):
 | |
|         # There is only one variant: exactly the packages returned by gather
 | |
|         # method should be returned without modifications.
 | |
|         self.compose.all_variants = {"Server": self.variant}
 | |
| 
 | |
|         expected_server_packages = copy.deepcopy(self.server_packages)
 | |
| 
 | |
|         gather_packages.side_effect = self._dummy_gather
 | |
| 
 | |
|         result = gather.gather_wrapper(self.compose, self.package_set, "/build")
 | |
| 
 | |
|         self.assertEqual(result, {"x86_64": {"Server": expected_server_packages}})
 | |
|         self.assertEqual(
 | |
|             write_packages.call_args_list,
 | |
|             [
 | |
|                 mock.call(
 | |
|                     self.compose,
 | |
|                     "x86_64",
 | |
|                     self.variant,
 | |
|                     expected_server_packages,
 | |
|                     path_prefix="/build",
 | |
|                 )
 | |
|             ],
 | |
|         )
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.write_packages")
 | |
|     @mock.patch("pungi.phases.gather.gather_packages")
 | |
|     def test_addon(self, gather_packages, write_packages):
 | |
|         # Addon has all packages that parent has, plus one extra input package
 | |
|         # and one fulltree-exclude package. Only the input one should remain in
 | |
|         # addon, and the fulltree one should move to parent.
 | |
|         self.compose.all_variants = {"Server": self.variant, "Server-HA": self.addon}
 | |
| 
 | |
|         move_to_parent = {
 | |
|             "path": "/build/foo-common-1.0-1.x86_64.rpm",
 | |
|             "flags": ["fulltree-exclude"],
 | |
|         }
 | |
|         keep_in_addon = {"path": "/build/bar-1.0-1.x86_64.rpm", "flags": ["input"]}
 | |
|         expected_server_packages = _join(
 | |
|             self.server_packages, _mk_pkg_map([move_to_parent])
 | |
|         )
 | |
|         self.addon_packages = _join(
 | |
|             self.server_packages, _mk_pkg_map([keep_in_addon, move_to_parent])
 | |
|         )
 | |
|         expected_addon_packages = _mk_pkg_map(
 | |
|             [{"path": "/build/bar-1.0-1.x86_64.rpm", "flags": ["input"]}]
 | |
|         )
 | |
| 
 | |
|         gather_packages.side_effect = self._dummy_gather
 | |
| 
 | |
|         result = gather.gather_wrapper(self.compose, self.package_set, "/build")
 | |
| 
 | |
|         self.assertEqual(
 | |
|             result,
 | |
|             {
 | |
|                 "x86_64": {
 | |
|                     "Server": expected_server_packages,
 | |
|                     "Server-HA": expected_addon_packages,
 | |
|                 }
 | |
|             },
 | |
|         )
 | |
|         self.assertCountEqual(
 | |
|             write_packages.call_args_list,
 | |
|             [
 | |
|                 mock.call(
 | |
|                     self.compose,
 | |
|                     "x86_64",
 | |
|                     self.variant,
 | |
|                     expected_server_packages,
 | |
|                     path_prefix="/build",
 | |
|                 ),
 | |
|                 mock.call(
 | |
|                     self.compose,
 | |
|                     "x86_64",
 | |
|                     self.addon,
 | |
|                     expected_addon_packages,
 | |
|                     path_prefix="/build",
 | |
|                 ),
 | |
|             ],
 | |
|         )
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.write_packages")
 | |
|     @mock.patch("pungi.phases.gather.gather_packages")
 | |
|     def test_layered_product(self, gather_packages, write_packages):
 | |
|         # This test is pretty much identical to the one for addon.
 | |
|         self.compose.all_variants = {"Server": self.variant, "Server-LP": self.lp}
 | |
| 
 | |
|         move_to_parent = {
 | |
|             "path": "/build/foo-common-1.0-1.x86_64.rpm",
 | |
|             "flags": ["fulltree-exclude"],
 | |
|         }
 | |
|         keep_in_lp = {"path": "/build/bar-1.0-1.x86_64.rpm", "flags": ["input"]}
 | |
|         expected_server_packages = copy.deepcopy(self.server_packages)
 | |
|         expected_server_packages["rpm"].append(move_to_parent)
 | |
|         self.lp_packages = _join(
 | |
|             self.server_packages, _mk_pkg_map([keep_in_lp, move_to_parent])
 | |
|         )
 | |
|         expected_lp_packages = _mk_pkg_map(
 | |
|             [{"path": "/build/bar-1.0-1.x86_64.rpm", "flags": ["input"]}]
 | |
|         )
 | |
| 
 | |
|         gather_packages.side_effect = self._dummy_gather
 | |
| 
 | |
|         result = gather.gather_wrapper(self.compose, self.package_set, "/build")
 | |
| 
 | |
|         self.assertEqual(
 | |
|             result,
 | |
|             {
 | |
|                 "x86_64": {
 | |
|                     "Server": expected_server_packages,
 | |
|                     "Server-LP": expected_lp_packages,
 | |
|                 }
 | |
|             },
 | |
|         )
 | |
|         self.assertCountEqual(
 | |
|             write_packages.call_args_list,
 | |
|             [
 | |
|                 mock.call(
 | |
|                     self.compose,
 | |
|                     "x86_64",
 | |
|                     self.variant,
 | |
|                     expected_server_packages,
 | |
|                     path_prefix="/build",
 | |
|                 ),
 | |
|                 mock.call(
 | |
|                     self.compose,
 | |
|                     "x86_64",
 | |
|                     self.lp,
 | |
|                     expected_lp_packages,
 | |
|                     path_prefix="/build",
 | |
|                 ),
 | |
|             ],
 | |
|         )
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.write_packages")
 | |
|     @mock.patch("pungi.phases.gather.gather_packages")
 | |
|     def test_optional(self, gather_packages, write_packages):
 | |
|         # All packages in optional that are present in parent should be removed
 | |
|         # from optional. There is no move to parent here.
 | |
|         self.compose.all_variants = {
 | |
|             "Server": self.variant,
 | |
|             "Server-optional": self.optional,
 | |
|         }
 | |
| 
 | |
|         expected_server_packages = copy.deepcopy(self.server_packages)
 | |
|         self.optional_packages = _join(
 | |
|             self.server_packages,
 | |
|             _mk_pkg_map(
 | |
|                 [
 | |
|                     {"path": "/build/bar-1.0-1.x86_64.rpm", "flags": ["input"]},
 | |
|                     {
 | |
|                         "path": "/build/foo-common-1.0-1.x86_64.rpm",
 | |
|                         "flags": ["fulltree-exclude"],
 | |
|                     },
 | |
|                 ]
 | |
|             ),
 | |
|         )
 | |
|         expected_optional_packages = _mk_pkg_map(
 | |
|             [{"path": "/build/bar-1.0-1.x86_64.rpm", "flags": ["input"]}]
 | |
|         )
 | |
| 
 | |
|         gather_packages.side_effect = self._dummy_gather
 | |
| 
 | |
|         result = gather.gather_wrapper(self.compose, self.package_set, "/build")
 | |
| 
 | |
|         self.assertEqual(
 | |
|             result,
 | |
|             {
 | |
|                 "x86_64": {
 | |
|                     "Server": expected_server_packages,
 | |
|                     "Server-optional": expected_optional_packages,
 | |
|                 }
 | |
|             },
 | |
|         )
 | |
|         self.assertCountEqual(
 | |
|             write_packages.call_args_list,
 | |
|             [
 | |
|                 mock.call(
 | |
|                     self.compose,
 | |
|                     "x86_64",
 | |
|                     self.variant,
 | |
|                     expected_server_packages,
 | |
|                     path_prefix="/build",
 | |
|                 ),
 | |
|                 mock.call(
 | |
|                     self.compose,
 | |
|                     "x86_64",
 | |
|                     self.optional,
 | |
|                     expected_optional_packages,
 | |
|                     path_prefix="/build",
 | |
|                 ),
 | |
|             ],
 | |
|         )
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.write_packages")
 | |
|     @mock.patch("pungi.phases.gather.gather_packages")
 | |
|     def test_all(self, gather_packages, write_packages):
 | |
|         # Addon contains an extra package compared to parent. Layered product
 | |
|         # contains an extra package compared to addon. Optional has one extra
 | |
|         # package on it's own compared to addon. Only the one extra package
 | |
|         # should remain in all non-parent variants.
 | |
|         #
 | |
|         # There are also two packages that should move to parent variant. Addon
 | |
|         # has one of them, layered product has both.
 | |
|         self.compose.all_variants = {
 | |
|             "Server": self.variant,
 | |
|             "Server-optional": self.optional,
 | |
|             "Server-HA": self.addon,
 | |
|             "Server-LP": self.lp,
 | |
|         }
 | |
| 
 | |
|         addon_extra_package = {
 | |
|             "path": "/build/foo-addon-1.0.1-1.noarch.rpm",
 | |
|             "flags": [],
 | |
|         }
 | |
|         lp_extra_package = {"path": "/build/foo-layer-1.0.1-1.noarch.rpm", "flags": []}
 | |
|         optional_extra_package = {
 | |
|             "path": "/build/foo-optional-1.0.1-1.noarch.rpm",
 | |
|             "flags": [],
 | |
|         }
 | |
|         move_from_addon = {
 | |
|             "path": "/build/foo-addon-contrib-1.0-1.noarch.rpm",
 | |
|             "flags": ["fulltree-exclude"],
 | |
|         }
 | |
|         move_from_lp = {
 | |
|             "path": "/build/foo-layer-contrib-1.0-1.noarch.rpm",
 | |
|             "flags": ["fulltree-exclude"],
 | |
|         }
 | |
| 
 | |
|         self.addon_packages = _join(
 | |
|             self.server_packages, _mk_pkg_map([addon_extra_package, move_from_addon])
 | |
|         )
 | |
|         self.lp_packages = _join(
 | |
|             self.addon_packages, _mk_pkg_map([lp_extra_package, move_from_lp])
 | |
|         )
 | |
|         self.optional_packages = _join(
 | |
|             self.lp_packages, _mk_pkg_map([optional_extra_package])
 | |
|         )
 | |
| 
 | |
|         expected_server_packages = _join(
 | |
|             self.server_packages, _mk_pkg_map([move_from_addon, move_from_lp])
 | |
|         )
 | |
|         expected_addon_packages = _mk_pkg_map([addon_extra_package])
 | |
|         expected_lp_packages = _mk_pkg_map([lp_extra_package])
 | |
|         expected_optional_packages = _mk_pkg_map([optional_extra_package])
 | |
| 
 | |
|         gather_packages.side_effect = self._dummy_gather
 | |
| 
 | |
|         result = gather.gather_wrapper(self.compose, self.package_set, "/build")
 | |
| 
 | |
|         self.assertEqual(
 | |
|             result,
 | |
|             {
 | |
|                 "x86_64": {
 | |
|                     "Server": expected_server_packages,
 | |
|                     "Server-optional": expected_optional_packages,
 | |
|                     "Server-HA": expected_addon_packages,
 | |
|                     "Server-LP": expected_lp_packages,
 | |
|                 }
 | |
|             },
 | |
|         )
 | |
|         self.assertCountEqual(
 | |
|             write_packages.call_args_list,
 | |
|             [
 | |
|                 mock.call(
 | |
|                     self.compose,
 | |
|                     "x86_64",
 | |
|                     self.compose.all_variants["Server"],
 | |
|                     expected_server_packages,
 | |
|                     path_prefix="/build",
 | |
|                 ),
 | |
|                 mock.call(
 | |
|                     self.compose,
 | |
|                     "x86_64",
 | |
|                     self.compose.all_variants["Server-optional"],
 | |
|                     expected_optional_packages,
 | |
|                     path_prefix="/build",
 | |
|                 ),
 | |
|                 mock.call(
 | |
|                     self.compose,
 | |
|                     "x86_64",
 | |
|                     self.compose.all_variants["Server-HA"],
 | |
|                     expected_addon_packages,
 | |
|                     path_prefix="/build",
 | |
|                 ),
 | |
|                 mock.call(
 | |
|                     self.compose,
 | |
|                     "x86_64",
 | |
|                     self.compose.all_variants["Server-LP"],
 | |
|                     expected_lp_packages,
 | |
|                     path_prefix="/build",
 | |
|                 ),
 | |
|             ],
 | |
|         )
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.write_packages")
 | |
|     @mock.patch("pungi.phases.gather.gather_packages")
 | |
|     def test_keep_srpm_in_lp(self, gather_packages, write_packages):
 | |
|         # There is one binary and source package in addon and lp but not in
 | |
|         # parent. Addon should remain unchanged and the binary package should
 | |
|         # disappear from lp.
 | |
|         # This seems peculiar and may not be correct.
 | |
|         self.compose.all_variants = {
 | |
|             "Server": self.variant,
 | |
|             "Server-HA": self.addon,
 | |
|             "Server-LP": self.lp,
 | |
|         }
 | |
| 
 | |
|         addon_extra_package = {
 | |
|             "path": "/build/foo-addon-1.0.1-1.noarch.rpm",
 | |
|             "flags": [],
 | |
|         }
 | |
|         addon_extra_source = {"path": "/build/foo-addon-1.0.1-1.src.rpm", "flags": []}
 | |
| 
 | |
|         self.addon_packages = _join(
 | |
|             self.server_packages,
 | |
|             _mk_pkg_map([addon_extra_package], [addon_extra_source]),
 | |
|         )
 | |
|         self.lp_packages = _join(self.addon_packages)
 | |
| 
 | |
|         expected_server_packages = _join(self.server_packages)
 | |
|         expected_addon_packages = _mk_pkg_map(
 | |
|             [addon_extra_package], [addon_extra_source]
 | |
|         )
 | |
|         expected_lp_packages = _mk_pkg_map([], [addon_extra_source])
 | |
| 
 | |
|         gather_packages.side_effect = self._dummy_gather
 | |
| 
 | |
|         result = gather.gather_wrapper(self.compose, self.package_set, "/build")
 | |
| 
 | |
|         self.assertEqual(
 | |
|             result,
 | |
|             {
 | |
|                 "x86_64": {
 | |
|                     "Server": expected_server_packages,
 | |
|                     "Server-HA": expected_addon_packages,
 | |
|                     "Server-LP": expected_lp_packages,
 | |
|                 }
 | |
|             },
 | |
|         )
 | |
|         self.assertCountEqual(
 | |
|             write_packages.call_args_list,
 | |
|             [
 | |
|                 mock.call(
 | |
|                     self.compose,
 | |
|                     "x86_64",
 | |
|                     self.compose.all_variants["Server"],
 | |
|                     expected_server_packages,
 | |
|                     path_prefix="/build",
 | |
|                 ),
 | |
|                 mock.call(
 | |
|                     self.compose,
 | |
|                     "x86_64",
 | |
|                     self.compose.all_variants["Server-HA"],
 | |
|                     expected_addon_packages,
 | |
|                     path_prefix="/build",
 | |
|                 ),
 | |
|                 mock.call(
 | |
|                     self.compose,
 | |
|                     "x86_64",
 | |
|                     self.compose.all_variants["Server-LP"],
 | |
|                     expected_lp_packages,
 | |
|                     path_prefix="/build",
 | |
|                 ),
 | |
|             ],
 | |
|         )
 | |
| 
 | |
| 
 | |
| def _make_materialized_pkgsets(pkgsets):
 | |
|     return [MaterializedPackageSet(pkgsets, {})]
 | |
| 
 | |
| 
 | |
| class TestGetSystemRelease(unittest.TestCase):
 | |
|     def setUp(self):
 | |
|         self.compose = mock.Mock()
 | |
|         self.variant = helpers.MockVariant(
 | |
|             uid="Server", arches=["x86_64"], type="variant"
 | |
|         )
 | |
|         self.addon = helpers.MockVariant(
 | |
|             uid="Server-HA", arches=["x86_64"], type="addon", parent=self.variant
 | |
|         )
 | |
| 
 | |
|     def test_no_package_set(self):
 | |
|         self.assertEqual(
 | |
|             gather.get_system_release_packages(
 | |
|                 self.compose, "x86_64", self.variant, None
 | |
|             ),
 | |
|             (set(), set()),
 | |
|         )
 | |
| 
 | |
|     def test_no_arch_in_package_set(self):
 | |
|         self.assertEqual(
 | |
|             gather.get_system_release_packages(
 | |
|                 self.compose, "x86_64", self.variant, _make_materialized_pkgsets({})
 | |
|             ),
 | |
|             (set(), set()),
 | |
|         )
 | |
| 
 | |
|     def test_no_system_release_package(self):
 | |
|         pkgset = MockPackageSet(MockPkg("/build/bash-1.0.0-1.x86_64.rpm"))
 | |
|         packages, filter_packages = gather.get_system_release_packages(
 | |
|             self.compose,
 | |
|             "x86_64",
 | |
|             self.variant,
 | |
|             _make_materialized_pkgsets({"x86_64": pkgset}),
 | |
|         )
 | |
| 
 | |
|         self.assertEqual(packages, set())
 | |
|         self.assertEqual(filter_packages, set())
 | |
| 
 | |
|     def test_picks_single(self):
 | |
|         pkgset = MockPackageSet(
 | |
|             MockPkg("/build/dummy-1.0.0-1.x86_64.rpm", is_system_release=True),
 | |
|         )
 | |
|         packages, filter_packages = gather.get_system_release_packages(
 | |
|             self.compose,
 | |
|             "x86_64",
 | |
|             self.variant,
 | |
|             _make_materialized_pkgsets({"x86_64": pkgset}),
 | |
|         )
 | |
| 
 | |
|         self.assertEqual(packages, set([("dummy", None)]))
 | |
|         self.assertEqual(filter_packages, set())
 | |
| 
 | |
|     def test_prefers_variant(self):
 | |
|         pkgset = MockPackageSet(
 | |
|             MockPkg("/build/system-release-1.0.0-1.x86_64.rpm", is_system_release=True),
 | |
|             MockPkg(
 | |
|                 "/build/system-release-server-1.0.0-1.x86_64.rpm",
 | |
|                 is_system_release=True,
 | |
|             ),
 | |
|         )
 | |
|         packages, filter_packages = gather.get_system_release_packages(
 | |
|             self.compose,
 | |
|             "x86_64",
 | |
|             self.variant,
 | |
|             [MaterializedPackageSet({"x86_64": pkgset}, {})],
 | |
|         )
 | |
| 
 | |
|         self.assertEqual(packages, set([("system-release-server", None)]))
 | |
|         self.assertEqual(filter_packages, set([("system-release", None)]))
 | |
| 
 | |
|     def test_no_best_match(self):
 | |
|         pkgset = MockPackageSet(
 | |
|             MockPkg(
 | |
|                 "/build/system-release-foo-1.0.0-1.x86_64.rpm", is_system_release=True
 | |
|             ),
 | |
|             MockPkg(
 | |
|                 "/build/system-release-bar-1.0.0-1.x86_64.rpm", is_system_release=True
 | |
|             ),
 | |
|         )
 | |
|         packages, filter_packages = gather.get_system_release_packages(
 | |
|             self.compose,
 | |
|             "x86_64",
 | |
|             self.variant,
 | |
|             [MaterializedPackageSet({"x86_64": pkgset}, {})],
 | |
|         )
 | |
| 
 | |
|         # In this case a random package is picked, so let's check that both
 | |
|         # list contain one package and that they are different.
 | |
|         self.assertEqual(len(packages), 1)
 | |
|         self.assertEqual(len(filter_packages), 1)
 | |
|         self.assertNotEqual(packages, filter_packages)
 | |
| 
 | |
|     def test_optional_picks_parent(self):
 | |
|         pkgset = MockPackageSet(
 | |
|             MockPkg("/build/system-release-1.0.0-1.x86_64.rpm", is_system_release=True),
 | |
|             MockPkg(
 | |
|                 "/build/system-release-server-1.0.0-1.x86_64.rpm",
 | |
|                 is_system_release=True,
 | |
|             ),
 | |
|             MockPkg(
 | |
|                 "/build/system-release-client-1.0.0-1.x86_64.rpm",
 | |
|                 is_system_release=True,
 | |
|             ),
 | |
|         )
 | |
|         packages, filter_packages = gather.get_system_release_packages(
 | |
|             self.compose,
 | |
|             "x86_64",
 | |
|             self.addon,
 | |
|             [MaterializedPackageSet({"x86_64": pkgset}, {})],
 | |
|         )
 | |
| 
 | |
|         self.assertEqual(packages, set([("system-release-server", None)]))
 | |
|         self.assertCountEqual(
 | |
|             filter_packages,
 | |
|             set([("system-release-client", None), ("system-release", None)]),
 | |
|         )
 | |
| 
 | |
| 
 | |
| class TestTrimPackages(unittest.TestCase):
 | |
|     def setUp(self):
 | |
|         self.compose = mock.Mock()
 | |
|         self.variant = helpers.MockVariant(
 | |
|             uid="Server", arches=["x86_64"], type="variant"
 | |
|         )
 | |
|         self.addon = helpers.MockVariant(
 | |
|             uid="Server-HA", arches=["x86_64"], type="addon", parent=self.variant
 | |
|         )
 | |
| 
 | |
|     def test_trim_toplevel(self):
 | |
|         self.assertIsNone(
 | |
|             gather.trim_packages(self.compose, "x86_64", self.variant, {})
 | |
|         )
 | |
| 
 | |
|     def test_remove_package_explicitly(self):
 | |
|         to_remove = {"path": "/build/required-1.0.0-1.x86_64.rpm", "flags": ["input"]}
 | |
|         to_keep = {"path": "/build/empty-1.0.0-1.x86_64.rpm", "flags": []}
 | |
|         pkg_map = _mk_pkg_map([to_remove, to_keep])
 | |
|         addon_pkgs, moved_to_parent, removed_pkgs = gather.trim_packages(
 | |
|             self.compose,
 | |
|             "x86_64",
 | |
|             self.addon,
 | |
|             pkg_map,
 | |
|             remove_pkgs={"rpm": ["required"]},
 | |
|         )
 | |
| 
 | |
|         self.assertEqual(removed_pkgs, _mk_pkg_map([to_remove]))
 | |
|         self.assertEqual(addon_pkgs, _mk_pkg_map(set(["empty"]), iterable_class=set))
 | |
|         self.assertEqual(moved_to_parent, _mk_pkg_map())
 | |
|         self.assertEqual(pkg_map, _mk_pkg_map([to_keep]))
 | |
| 
 | |
|     def test_remove_package_present_in_parent(self):
 | |
|         # packages present in parent will be removed from addon
 | |
|         parent_pkgs = {"rpm": [("wanted", "x86_64")]}
 | |
|         to_remove = {"path": "/build/wanted-1.0.0-1.x86_64.rpm", "flags": []}
 | |
|         pkg_map = _mk_pkg_map([to_remove])
 | |
|         addon_pkgs, moved_to_parent, removed_pkgs = gather.trim_packages(
 | |
|             self.compose, "x86_64", self.addon, pkg_map, parent_pkgs=parent_pkgs
 | |
|         )
 | |
| 
 | |
|         self.assertEqual(removed_pkgs, _mk_pkg_map([to_remove]))
 | |
|         self.assertEqual(addon_pkgs, _mk_pkg_map(iterable_class=set))
 | |
|         self.assertEqual(moved_to_parent, _mk_pkg_map())
 | |
|         self.assertEqual(pkg_map, _mk_pkg_map())
 | |
| 
 | |
|     def test_move_package_to_parent(self):
 | |
|         # fulltree-exclude packages in addon only will move to parent
 | |
|         to_move = {
 | |
|             "path": "/build/wanted-1.0.0-1.x86_64.rpm",
 | |
|             "flags": ["fulltree-exclude"],
 | |
|         }
 | |
|         pkg_map = _mk_pkg_map([to_move])
 | |
|         addon_pkgs, moved_to_parent, removed_pkgs = gather.trim_packages(
 | |
|             self.compose, "x86_64", self.addon, pkg_map, parent_pkgs={"rpm": []}
 | |
|         )
 | |
| 
 | |
|         self.assertEqual(removed_pkgs, _mk_pkg_map())
 | |
|         self.assertEqual(addon_pkgs, _mk_pkg_map(iterable_class=set))
 | |
|         self.assertEqual(moved_to_parent, _mk_pkg_map([to_move]))
 | |
|         self.assertEqual(pkg_map, _mk_pkg_map())
 | |
| 
 | |
|     def test_keep_explicit_input_in_addon(self):
 | |
|         # fulltree-exclude packages explictly in addon will be kept in addon
 | |
|         parent_pkgs = {"rpm": []}
 | |
|         pkg = {
 | |
|             "path": "/build/wanted-1.0.0-1.x86_64.rpm",
 | |
|             "flags": ["fulltree-exclude", "input"],
 | |
|         }
 | |
|         pkg_map = _mk_pkg_map([pkg])
 | |
|         addon_pkgs, moved_to_parent, removed_pkgs = gather.trim_packages(
 | |
|             self.compose, "x86_64", self.addon, pkg_map, parent_pkgs=parent_pkgs
 | |
|         )
 | |
| 
 | |
|         self.assertEqual(removed_pkgs, _mk_pkg_map())
 | |
|         self.assertEqual(addon_pkgs, _mk_pkg_map(set(["wanted"]), iterable_class=set))
 | |
|         self.assertEqual(moved_to_parent, _mk_pkg_map())
 | |
|         self.assertEqual(pkg_map, _mk_pkg_map([pkg]))
 | |
| 
 | |
| 
 | |
| class TestWritePackages(helpers.PungiTestCase):
 | |
|     def test_write_packages(self):
 | |
|         self.compose = helpers.DummyCompose(self.topdir, {})
 | |
|         pkg_map = {
 | |
|             "rpm": [
 | |
|                 {"path": "/build/foo-1.0-1.x86_64.rpm", "flags": []},
 | |
|                 {"path": "/build/foo-common-1.0-1.x86_64.rpm", "flags": []},
 | |
|                 {"path": "/alt/build/bar-1.0-1.noarch.rpm", "flags": []},
 | |
|             ],
 | |
|             "srpm": [
 | |
|                 {"path": "/build/foo-1.0-1.src.rpm", "flags": []},
 | |
|                 {"path": "/alt/build/bar-1.0-1.src.rpm", "flags": []},
 | |
|             ],
 | |
|             "debuginfo": [
 | |
|                 {"path": "/build/foo-debuginfo-1.0-1.x86_64.rpm", "flags": []},
 | |
|             ],
 | |
|         }
 | |
|         gather.write_packages(
 | |
|             self.compose, "x86_64", self.compose.variants["Server"], pkg_map, "/alt"
 | |
|         )
 | |
| 
 | |
|         with open(
 | |
|             os.path.join(
 | |
|                 self.topdir, "work", "x86_64", "package_list", "Server.x86_64.rpm.conf"
 | |
|             )
 | |
|         ) as f:
 | |
|             self.assertCountEqual(
 | |
|                 f.read().strip().split("\n"),
 | |
|                 [
 | |
|                     "/build/foo-1.0-1.x86_64.rpm",
 | |
|                     "/build/foo-common-1.0-1.x86_64.rpm",
 | |
|                     "/build/bar-1.0-1.noarch.rpm",
 | |
|                 ],
 | |
|             )
 | |
| 
 | |
|         with open(
 | |
|             os.path.join(
 | |
|                 self.topdir, "work", "x86_64", "package_list", "Server.x86_64.srpm.conf"
 | |
|             )
 | |
|         ) as f:
 | |
|             self.assertCountEqual(
 | |
|                 f.read().strip().split("\n"),
 | |
|                 ["/build/foo-1.0-1.src.rpm", "/build/bar-1.0-1.src.rpm"],
 | |
|             )
 | |
| 
 | |
|         with open(
 | |
|             os.path.join(
 | |
|                 self.topdir,
 | |
|                 "work",
 | |
|                 "x86_64",
 | |
|                 "package_list",
 | |
|                 "Server.x86_64.debuginfo.conf",
 | |
|             )
 | |
|         ) as f:
 | |
|             self.assertEqual(f.read(), "/build/foo-debuginfo-1.0-1.x86_64.rpm\n")
 | |
| 
 | |
| 
 | |
| class TestGetVariantPackages(helpers.PungiTestCase):
 | |
|     def test_no_variant(self):
 | |
|         compose = helpers.DummyCompose(self.topdir, {})
 | |
|         packages, groups, filter_packages = gather.get_variant_packages(
 | |
|             compose, "x86_64", None, "comps"
 | |
|         )
 | |
|         self.assertEqual(packages, set())
 | |
|         self.assertEqual(groups, set())
 | |
|         self.assertEqual(filter_packages, set())
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.get_gather_source")
 | |
|     def test_just_source(self, get_gather_source):
 | |
|         get_gather_source.return_value = mock.Mock(
 | |
|             return_value=mock.Mock(return_value=(set(["foo"]), set(["core"])))
 | |
|         )
 | |
|         compose = helpers.DummyCompose(self.topdir, {})
 | |
| 
 | |
|         packages, groups, filter_packages = gather.get_variant_packages(
 | |
|             compose, "x86_64", compose.variants["Server"], "comps"
 | |
|         )
 | |
|         self.assertEqual(packages, set(["foo"]))
 | |
|         self.assertEqual(groups, set(["core"]))
 | |
|         self.assertEqual(filter_packages, set())
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.get_gather_source")
 | |
|     def test_filter_system_release(self, get_gather_source):
 | |
|         get_gather_source.return_value = mock.Mock(
 | |
|             return_value=mock.Mock(return_value=(set(), set()))
 | |
|         )
 | |
|         compose = helpers.DummyCompose(self.topdir, {})
 | |
|         pkgset = MockPackageSet(
 | |
|             MockPkg("/build/system-release-1.0.0-1.x86_64.rpm", is_system_release=True),
 | |
|             MockPkg(
 | |
|                 "/build/system-release-server-1.0.0-1.x86_64.rpm",
 | |
|                 is_system_release=True,
 | |
|             ),
 | |
|         )
 | |
| 
 | |
|         packages, groups, filter_packages = gather.get_variant_packages(
 | |
|             compose,
 | |
|             "x86_64",
 | |
|             compose.variants["Server"],
 | |
|             "comps",
 | |
|             package_sets=[MaterializedPackageSet({"x86_64": pkgset}, {})],
 | |
|         )
 | |
|         self.assertEqual(packages, set([("system-release-server", None)]))
 | |
|         self.assertEqual(groups, set())
 | |
|         self.assertEqual(filter_packages, set([("system-release", None)]))
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.get_gather_source")
 | |
|     def test_disable_filter_system_release(self, get_gather_source):
 | |
|         get_gather_source.return_value = mock.Mock(
 | |
|             return_value=mock.Mock(return_value=(set([]), set([])))
 | |
|         )
 | |
|         compose = helpers.DummyCompose(
 | |
|             self.topdir, {"filter_system_release_packages": False}
 | |
|         )
 | |
|         pkgset = MockPackageSet(
 | |
|             MockPkg("/build/system-release-1.0.0-1.x86_64.rpm", is_system_release=True),
 | |
|             MockPkg(
 | |
|                 "/build/system-release-server-1.0.0-1.x86_64.rpm",
 | |
|                 is_system_release=True,
 | |
|             ),
 | |
|         )
 | |
| 
 | |
|         packages, groups, filter_packages = gather.get_variant_packages(
 | |
|             compose,
 | |
|             "x86_64",
 | |
|             compose.variants["Server"],
 | |
|             "comps",
 | |
|             package_sets=[MaterializedPackageSet({"x86_64": pkgset}, {})],
 | |
|         )
 | |
|         self.assertEqual(packages, set())
 | |
|         self.assertEqual(groups, set())
 | |
|         self.assertEqual(filter_packages, set())
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.get_gather_source")
 | |
|     def test_optional_gets_parent_and_addon(self, get_gather_source):
 | |
|         compose = helpers.DummyCompose(self.topdir, {})
 | |
|         compose.setup_optional()
 | |
|         compose.setup_addon()
 | |
| 
 | |
|         def dummy_source(arch, variant):
 | |
|             if variant.uid == "Server":
 | |
|                 return (set(["server-pkg"]), set(["server-group"]))
 | |
|             if variant.uid == "Server-HA":
 | |
|                 return (set(["addon-pkg"]), set(["addon-group"]))
 | |
|             if variant.uid == "Server-optional":
 | |
|                 return (set(["opt-pkg"]), set(["opt-group"]))
 | |
|             self.assertFalse("This should not be reached")
 | |
| 
 | |
|         get_gather_source.return_value = mock.Mock(
 | |
|             return_value=mock.Mock(side_effect=dummy_source)
 | |
|         )
 | |
| 
 | |
|         packages, groups, filter_packages = gather.get_variant_packages(
 | |
|             compose, "x86_64", compose.all_variants["Server-optional"], "comps"
 | |
|         )
 | |
|         self.assertCountEqual(packages, ["server-pkg", "addon-pkg", "opt-pkg"])
 | |
|         self.assertCountEqual(groups, ["server-group", "addon-group", "opt-group"])
 | |
|         self.assertEqual(filter_packages, set())
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.get_gather_source")
 | |
|     def test_optional_does_not_inherit_filters(self, get_gather_source):
 | |
|         compose = helpers.DummyCompose(
 | |
|             self.topdir,
 | |
|             {"filter_packages": [("^Server(-HA)?$", {"*": ["filter-me"]})]},
 | |
|         )
 | |
|         compose.setup_optional()
 | |
|         compose.setup_addon()
 | |
| 
 | |
|         get_gather_source.return_value = mock.Mock(
 | |
|             return_value=mock.Mock(return_value=(set(), set()))
 | |
|         )
 | |
| 
 | |
|         packages, groups, filter_packages = gather.get_variant_packages(
 | |
|             compose, "x86_64", compose.all_variants["Server-optional"], "comps"
 | |
|         )
 | |
|         self.assertEqual(packages, set())
 | |
|         self.assertEqual(groups, set())
 | |
|         self.assertEqual(filter_packages, set())
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.get_gather_source")
 | |
|     def test_additional_packages(self, get_gather_source):
 | |
|         compose = helpers.DummyCompose(
 | |
|             self.topdir,
 | |
|             {"additional_packages": [(".*", {"*": ["pkg", "foo.x86_64"]})]},
 | |
|         )
 | |
| 
 | |
|         get_gather_source.return_value = mock.Mock(
 | |
|             return_value=mock.Mock(return_value=(set(), set()))
 | |
|         )
 | |
| 
 | |
|         packages, groups, filter_packages = gather.get_variant_packages(
 | |
|             compose, "x86_64", compose.all_variants["Server"], "comps"
 | |
|         )
 | |
|         self.assertCountEqual(packages, [("pkg", None), ("foo", "x86_64")])
 | |
|         self.assertEqual(groups, set())
 | |
|         self.assertEqual(filter_packages, set())
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.get_gather_source")
 | |
|     def test_additional_packages_incompatible_arch(self, get_gather_source):
 | |
|         compose = helpers.DummyCompose(
 | |
|             self.topdir, {"additional_packages": [(".*", {"*": ["foo.ppc64"]})]}
 | |
|         )
 | |
| 
 | |
|         get_gather_source.return_value = mock.Mock(
 | |
|             return_value=mock.Mock(return_value=(set(), set()))
 | |
|         )
 | |
| 
 | |
|         with self.assertRaises(ValueError) as ctx:
 | |
|             packages, groups, filter_packages = gather.get_variant_packages(
 | |
|                 compose, "x86_64", compose.all_variants["Server"], "comps"
 | |
|             )
 | |
| 
 | |
|         self.assertIn("Incompatible package arch", str(ctx.exception))
 | |
| 
 | |
| 
 | |
| class TestGetParentPkgs(unittest.TestCase):
 | |
|     def setUp(self):
 | |
|         self.variant = helpers.MockVariant(
 | |
|             uid="Server", arches=["x86_64"], type="variant"
 | |
|         )
 | |
|         self.addon = helpers.MockVariant(
 | |
|             uid="Server-HA", arches=["x86_64"], type="addon", parent=self.variant
 | |
|         )
 | |
| 
 | |
|     def test_returns_empty_for_toplevel(self):
 | |
|         pkg_map = mock.Mock()
 | |
|         result = gather.get_parent_pkgs("x86_64", self.variant, pkg_map)
 | |
|         self.assertEqual(result, _mk_pkg_map(iterable_class=set))
 | |
| 
 | |
|     def test_on_addon(self):
 | |
|         pkg_map = {
 | |
|             "x86_64": {
 | |
|                 "Server": {
 | |
|                     "rpm": [{"path": "/build/foo-1.0-1.x86_64.rpm", "flags": []}],
 | |
|                     "srpm": [{"path": "/build/foo-1.0-1.src.rpm", "flags": []}],
 | |
|                     "debuginfo": [
 | |
|                         {"path": "/build/foo-debuginfo-1.0-1.x86_64.rpm", "flags": []},
 | |
|                     ],
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|         result = gather.get_parent_pkgs("x86_64", self.addon, pkg_map)
 | |
|         self.assertEqual(
 | |
|             result,
 | |
|             {
 | |
|                 "rpm": set([("foo", "x86_64")]),
 | |
|                 "srpm": set([("foo", "src")]),
 | |
|                 "debuginfo": set([("foo-debuginfo", "x86_64")]),
 | |
|             },
 | |
|         )
 | |
| 
 | |
| 
 | |
| class TestGatherPackages(helpers.PungiTestCase):
 | |
|     @mock.patch("pungi.phases.gather.get_variant_packages")
 | |
|     @mock.patch("pungi.phases.gather.get_gather_method")
 | |
|     def test_no_extra_options(self, get_gather_method, get_variant_packages):
 | |
|         packages, groups, filters = mock.Mock(), mock.Mock(), mock.Mock()
 | |
|         get_variant_packages.return_value = (packages, groups, filters)
 | |
|         compose = helpers.DummyCompose(self.topdir, {})
 | |
|         pkg_set = mock.Mock()
 | |
|         self.assertEqual(
 | |
|             gather.gather_packages(
 | |
|                 compose, "x86_64", compose.variants["Server"], pkg_set
 | |
|             ),
 | |
|             {"rpm": [], "srpm": [], "debuginfo": []},
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             get_gather_method.call_args_list,
 | |
|             [mock.call(compose.conf["gather_method"])] * 3,
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             get_variant_packages.call_args_list,
 | |
|             [
 | |
|                 mock.call(
 | |
|                     compose, "x86_64", compose.variants["Server"], "module", pkg_set
 | |
|                 ),
 | |
|                 mock.call(
 | |
|                     compose, "x86_64", compose.variants["Server"], "comps", pkg_set
 | |
|                 ),
 | |
|                 mock.call(
 | |
|                     compose, "x86_64", compose.variants["Server"], "json", pkg_set
 | |
|                 ),
 | |
|             ],
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             get_gather_method.return_value.return_value.call_args_list,
 | |
|             [
 | |
|                 mock.call(
 | |
|                     "x86_64",
 | |
|                     compose.variants["Server"],
 | |
|                     packages,
 | |
|                     groups,
 | |
|                     filters,
 | |
|                     set(),
 | |
|                     set(),
 | |
|                     pkg_set,
 | |
|                     fulltree_excludes=set(),
 | |
|                     prepopulate=set(),
 | |
|                 )
 | |
|             ]
 | |
|             * 3,
 | |
|         )
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.get_variant_packages")
 | |
|     def test_empty_variant(self, get_variant_packages):
 | |
|         packages, groups, filters = mock.Mock(), mock.Mock(), mock.Mock()
 | |
|         get_variant_packages.return_value = (packages, groups, filters)
 | |
|         compose = helpers.DummyCompose(self.topdir, {})
 | |
|         compose.variants["Server"].is_empty = True
 | |
|         pkg_set = mock.Mock()
 | |
|         self.assertEqual(
 | |
|             gather.gather_packages(
 | |
|                 compose, "x86_64", compose.variants["Server"], pkg_set
 | |
|             ),
 | |
|             _mk_pkg_map(),
 | |
|         )
 | |
|         self.assertEqual(get_variant_packages.call_args_list, [])
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.get_variant_packages")
 | |
|     @mock.patch("pungi.phases.gather.get_gather_method")
 | |
|     def test_multilib_white_black_list(self, get_gather_method, get_variant_packages):
 | |
|         packages, groups, filters = mock.Mock(), mock.Mock(), mock.Mock()
 | |
|         get_variant_packages.return_value = (packages, groups, filters)
 | |
|         compose = helpers.DummyCompose(
 | |
|             self.topdir,
 | |
|             {
 | |
|                 "multilib_whitelist": {"*": ["white"]},
 | |
|                 "multilib_blacklist": {"*": ["black"]},
 | |
|             },
 | |
|         )
 | |
|         pkg_set = mock.Mock()
 | |
|         self.assertEqual(
 | |
|             gather.gather_packages(
 | |
|                 compose, "x86_64", compose.variants["Server"], pkg_set
 | |
|             ),
 | |
|             {"rpm": [], "srpm": [], "debuginfo": []},
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             get_gather_method.call_args_list,
 | |
|             [mock.call(compose.conf["gather_method"])] * 3,
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             get_variant_packages.call_args_list,
 | |
|             [
 | |
|                 mock.call(
 | |
|                     compose, "x86_64", compose.variants["Server"], "module", pkg_set
 | |
|                 ),
 | |
|                 mock.call(
 | |
|                     compose, "x86_64", compose.variants["Server"], "comps", pkg_set
 | |
|                 ),
 | |
|                 mock.call(
 | |
|                     compose, "x86_64", compose.variants["Server"], "json", pkg_set
 | |
|                 ),
 | |
|             ],
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             get_gather_method.return_value.return_value.call_args_list,
 | |
|             [
 | |
|                 mock.call(
 | |
|                     "x86_64",
 | |
|                     compose.variants["Server"],
 | |
|                     packages,
 | |
|                     groups,
 | |
|                     filters,
 | |
|                     set(["white"]),
 | |
|                     set(["black"]),
 | |
|                     pkg_set,
 | |
|                     fulltree_excludes=set(),
 | |
|                     prepopulate=set(),
 | |
|                 )
 | |
|             ]
 | |
|             * 3,
 | |
|         )
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.get_variant_packages")
 | |
|     @mock.patch("pungi.phases.gather.get_gather_method")
 | |
|     def test_per_source_method(self, get_gather_method, get_variant_packages):
 | |
|         packages, groups, filters = mock.Mock(), mock.Mock(), mock.Mock()
 | |
|         get_variant_packages.return_value = (packages, groups, filters)
 | |
|         compose = helpers.DummyCompose(
 | |
|             self.topdir,
 | |
|             {
 | |
|                 "multilib_whitelist": {"*": ["white"]},
 | |
|                 "multilib_blacklist": {"*": ["black"]},
 | |
|                 "gather_method": {
 | |
|                     "^Server$": {"comps": "deps", "module": "nodeps", "json": "deps"}
 | |
|                 },
 | |
|             },
 | |
|         )
 | |
|         pkg_set = mock.Mock()
 | |
|         gather.gather_packages(compose, "x86_64", compose.variants["Server"], pkg_set),
 | |
|         self.assertEqual(
 | |
|             get_gather_method.call_args_list,
 | |
|             [mock.call("nodeps"), mock.call("deps"), mock.call("deps")],
 | |
|         )
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.get_variant_packages")
 | |
|     @mock.patch("pungi.phases.gather.get_gather_method")
 | |
|     def test_hybrid_method(self, get_gather_method, get_variant_packages):
 | |
|         packages, groups, filters = mock.Mock(), mock.Mock(), mock.Mock()
 | |
|         get_variant_packages.side_effect = lambda c, v, a, s, p: (
 | |
|             (packages, groups, filters) if s == "comps" else (None, None, None)
 | |
|         )
 | |
|         get_gather_method.return_value.return_value.return_value = {
 | |
|             "rpm": [],
 | |
|             "srpm": [],
 | |
|             "debuginfo": [],
 | |
|         }
 | |
|         compose = helpers.DummyCompose(self.topdir, {"gather_method": "hybrid"})
 | |
|         variant = compose.variants["Server"]
 | |
|         pkg_set = mock.Mock()
 | |
|         gather.gather_packages(compose, "x86_64", variant, pkg_set),
 | |
|         self.assertEqual(
 | |
|             get_variant_packages.call_args_list,
 | |
|             [mock.call(compose, "x86_64", variant, "comps", pkg_set)],
 | |
|         )
 | |
|         self.assertEqual(get_gather_method.call_args_list, [mock.call("hybrid")])
 | |
|         method_kwargs = get_gather_method.return_value.return_value.call_args_list[0][1]
 | |
|         self.assertEqual(method_kwargs["packages"], packages)
 | |
|         self.assertEqual(method_kwargs["groups"], groups)
 | |
| 
 | |
| 
 | |
| class TestReuseOldGatherPackages(helpers.PungiTestCase):
 | |
|     def _save_config_dump(self, compose):
 | |
|         config_dump_full = compose.paths.log.log_file("global", "config-dump")
 | |
|         with open(config_dump_full, "w") as f:
 | |
|             json.dump(compose.conf, f, sort_keys=True, indent=4)
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.load_old_gather_result")
 | |
|     def test_reuse_no_old_gather_result(self, load_old_gather_result):
 | |
|         load_old_gather_result.return_value = None
 | |
| 
 | |
|         compose = helpers.DummyCompose(self.topdir, {"gather_allow_reuse": True})
 | |
|         self._save_config_dump(compose)
 | |
|         result = gather.reuse_old_gather_packages(
 | |
|             compose, "x86_64", compose.variants["Server"], [], "deps"
 | |
|         )
 | |
|         self.assertEqual(result, None)
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.load_old_gather_result")
 | |
|     def test_reuse_no_old_compose_config(self, load_old_gather_result):
 | |
|         load_old_gather_result.return_value = {
 | |
|             "rpm": [{"path": "/build/bash-1.0.0-1.x86_64.rpm"}],
 | |
|             "srpm": [],
 | |
|             "debuginfo": [],
 | |
|         }
 | |
| 
 | |
|         compose = helpers.DummyCompose(self.topdir, {"gather_allow_reuse": True})
 | |
|         self._save_config_dump(compose)
 | |
| 
 | |
|         result = gather.reuse_old_gather_packages(
 | |
|             compose, "x86_64", compose.variants["Server"], [], "deps"
 | |
|         )
 | |
|         self.assertEqual(result, None)
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.load_old_gather_result")
 | |
|     def test_reuse_compose_config_different(self, load_old_gather_result):
 | |
|         load_old_gather_result.return_value = {
 | |
|             "rpm": [{"path": "/build/bash-1.0.0-1.x86_64.rpm"}],
 | |
|             "srpm": [],
 | |
|             "debuginfo": [],
 | |
|         }
 | |
| 
 | |
|         compose = helpers.DummyCompose(self.topdir, {"gather_allow_reuse": True})
 | |
|         self._save_config_dump(compose)
 | |
|         compose_conf_copy = dict(compose.conf)
 | |
|         compose_conf_copy["gather_method"] = "nodeps"
 | |
|         compose.load_old_compose_config.return_value = compose_conf_copy
 | |
| 
 | |
|         result = gather.reuse_old_gather_packages(
 | |
|             compose, "x86_64", compose.variants["Server"], [], "nodeps"
 | |
|         )
 | |
|         self.assertEqual(result, None)
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.load_old_gather_result")
 | |
|     def test_reuse_compose_config_different_whitelist(self, load_old_gather_result):
 | |
|         for whitelist_opt in ["product_id", "pkgset_koji_builds"]:
 | |
|             load_old_gather_result.return_value = {
 | |
|                 "rpm": [{"path": "/build/bash-1.0.0-1.x86_64.rpm"}],
 | |
|                 "srpm": [],
 | |
|                 "debuginfo": [],
 | |
|             }
 | |
| 
 | |
|             compose = helpers.DummyCompose(self.topdir, {"gather_allow_reuse": True})
 | |
|             self._save_config_dump(compose)
 | |
|             compose_conf_copy = dict(compose.conf)
 | |
|             compose_conf_copy[whitelist_opt] = "different"
 | |
|             compose.load_old_compose_config.return_value = compose_conf_copy
 | |
| 
 | |
|             result = gather.reuse_old_gather_packages(
 | |
|                 compose, "x86_64", compose.variants["Server"], [], "deps"
 | |
|             )
 | |
|             self.assertEqual(result, {"rpm": [], "srpm": [], "debuginfo": []})
 | |
| 
 | |
|     def _prepare_package_sets(
 | |
|         self, load_old_gather_result, extra_global_pkgs=None, **kwargs
 | |
|     ):
 | |
|         old_rpm = "/build/bash-1.0.0-1.x86_64.rpm"
 | |
|         new_rpm = "/build/bash-1.0.0-2.x86_64.rpm"
 | |
| 
 | |
|         pkg_old = MockPkg(old_rpm, sourcerpm="bash", requires=[], provides=[])
 | |
|         pkg_new = MockPkg(new_rpm, sourcerpm="bash", **kwargs)
 | |
|         pkgset = MockPackageSet(pkg_new)
 | |
|         pkgset.old_file_cache = {pkg_old.path: pkg_old}
 | |
|         pkgset.file_cache = {pkg_new.path: pkg_new}
 | |
|         package_sets = [{"global": pkgset, "x86_64": pkgset}]
 | |
| 
 | |
|         load_old_gather_result.return_value = {
 | |
|             "rpm": [{"path": old_rpm}],
 | |
|             "srpm": [],
 | |
|             "debuginfo": [],
 | |
|         }
 | |
|         return package_sets
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.load_old_gather_result")
 | |
|     def test_reuse(self, load_old_gather_result):
 | |
|         package_sets = self._prepare_package_sets(
 | |
|             load_old_gather_result, requires=[], provides=[]
 | |
|         )
 | |
|         compose = helpers.DummyCompose(self.topdir, {"gather_allow_reuse": True})
 | |
|         self._save_config_dump(compose)
 | |
|         compose.load_old_compose_config.return_value = compose.conf
 | |
| 
 | |
|         result = gather.reuse_old_gather_packages(
 | |
|             compose, "x86_64", compose.variants["Server"], package_sets, "deps"
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             result,
 | |
|             {
 | |
|                 "debuginfo": [],
 | |
|                 "rpm": [{"path": "/build/bash-1.0.0-2.x86_64.rpm"}],
 | |
|                 "srpm": [],
 | |
|             },
 | |
|         )
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.load_old_gather_result")
 | |
|     def test_reuse_update_gather_lookaside_repos(self, load_old_gather_result):
 | |
|         package_sets = self._prepare_package_sets(
 | |
|             load_old_gather_result, requires=[], provides=[]
 | |
|         )
 | |
|         compose = helpers.DummyCompose(self.topdir, {"gather_allow_reuse": True})
 | |
|         self._save_config_dump(compose)
 | |
|         compose.load_old_compose_config.return_value = copy.deepcopy(compose.conf)
 | |
| 
 | |
|         gather._update_config(compose, "Server", "x86_64", compose.topdir)
 | |
|         result = gather.reuse_old_gather_packages(
 | |
|             compose, "x86_64", compose.variants["Server"], package_sets, "deps"
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             result,
 | |
|             {
 | |
|                 "debuginfo": [],
 | |
|                 "rpm": [{"path": "/build/bash-1.0.0-2.x86_64.rpm"}],
 | |
|                 "srpm": [],
 | |
|             },
 | |
|         )
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.load_old_gather_result")
 | |
|     def test_reuse_update_gather_lookaside_repos_different_initial_repos(
 | |
|         self, load_old_gather_result
 | |
|     ):
 | |
|         package_sets = self._prepare_package_sets(
 | |
|             load_old_gather_result, requires=[], provides=[]
 | |
|         )
 | |
|         compose = helpers.DummyCompose(self.topdir, {"gather_allow_reuse": True})
 | |
|         self._save_config_dump(compose)
 | |
|         lookasides = compose.conf["gather_lookaside_repos"]
 | |
|         lookasides.append(("^Server$", {"x86_64": "http://localhost/real.repo"}))
 | |
|         compose.load_old_compose_config.return_value = copy.deepcopy(compose.conf)
 | |
| 
 | |
|         gather._update_config(compose, "Server", "x86_64", compose.topdir)
 | |
|         result = gather.reuse_old_gather_packages(
 | |
|             compose, "x86_64", compose.variants["Server"], package_sets, "deps"
 | |
|         )
 | |
|         self.assertEqual(result, None)
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.load_old_gather_result")
 | |
|     def test_reuse_update_gather_lookaside_repos_different_initial_repos_list(
 | |
|         self, load_old_gather_result
 | |
|     ):
 | |
|         package_sets = self._prepare_package_sets(
 | |
|             load_old_gather_result, requires=[], provides=[]
 | |
|         )
 | |
|         compose = helpers.DummyCompose(self.topdir, {"gather_allow_reuse": True})
 | |
|         self._save_config_dump(compose)
 | |
|         lookasides = compose.conf["gather_lookaside_repos"]
 | |
|         repos = ["http://localhost/real1.repo", "http://localhost/real2.repo"]
 | |
|         lookasides.append(("^Server$", {"x86_64": repos}))
 | |
|         compose.load_old_compose_config.return_value = copy.deepcopy(compose.conf)
 | |
| 
 | |
|         gather._update_config(compose, "Server", "x86_64", compose.topdir)
 | |
|         result = gather.reuse_old_gather_packages(
 | |
|             compose, "x86_64", compose.variants["Server"], package_sets, "deps"
 | |
|         )
 | |
|         self.assertEqual(result, None)
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.load_old_gather_result")
 | |
|     def test_reuse_no_old_file_cache(self, load_old_gather_result):
 | |
|         package_sets = self._prepare_package_sets(
 | |
|             load_old_gather_result, requires=[], provides=[]
 | |
|         )
 | |
|         package_sets[0]["global"].old_file_cache = {
 | |
|             "/build/foo-1-1.x86_64.rpm": MockPkg("foo-1-1.x86_64.rpm", sourcerpm="foo")
 | |
|         }
 | |
|         compose = helpers.DummyCompose(self.topdir, {"gather_allow_reuse": True})
 | |
|         self._save_config_dump(compose)
 | |
|         compose.load_old_compose_config.return_value = compose.conf
 | |
| 
 | |
|         result = gather.reuse_old_gather_packages(
 | |
|             compose, "x86_64", compose.variants["Server"], package_sets, "deps"
 | |
|         )
 | |
|         self.assertEqual(result, None)
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.load_old_gather_result")
 | |
|     def test_reuse_two_rpms_from_same_source(self, load_old_gather_result):
 | |
|         package_sets = self._prepare_package_sets(
 | |
|             load_old_gather_result, requires=[], provides=[]
 | |
|         )
 | |
|         bash_pkg = MockPkg(
 | |
|             "bash-1-2.x86_64.rpm", sourcerpm="bash", requires=[], provides=[]
 | |
|         )
 | |
|         pkg_set = package_sets[0]["global"]
 | |
|         pkg_set.old_file_cache["/build/bash-1-2.x86_64.rpm"] = bash_pkg
 | |
|         pkg_set.file_cache["/build/bash-1-2.x86_64.rpm"] = bash_pkg
 | |
|         compose = helpers.DummyCompose(self.topdir, {"gather_allow_reuse": True})
 | |
|         self._save_config_dump(compose)
 | |
|         compose.load_old_compose_config.return_value = compose.conf
 | |
| 
 | |
|         result = gather.reuse_old_gather_packages(
 | |
|             compose, "x86_64", compose.variants["Server"], package_sets, "deps"
 | |
|         )
 | |
|         self.assertEqual(result, None)
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.load_old_gather_result")
 | |
|     def test_reuse_rpm_added_removed(self, load_old_gather_result):
 | |
|         package_sets = self._prepare_package_sets(
 | |
|             load_old_gather_result, requires=[], provides=[]
 | |
|         )
 | |
|         foo_pkg = MockPkg(
 | |
|             "foo-1-1.x86_64.rpm", sourcerpm="foo", requires=[], provides=[]
 | |
|         )
 | |
|         file_pkg = MockPkg(
 | |
|             "file-1-1.x86_64.rpm", sourcerpm="file", requires=[], provides=[]
 | |
|         )
 | |
|         pkg_set = package_sets[0]["global"]
 | |
|         pkg_set.old_file_cache["/build/file-1-1.x86_64.rpm"] = file_pkg
 | |
|         pkg_set.file_cache["/build/foo-1-1.x86_64.rpm"] = foo_pkg
 | |
|         compose = helpers.DummyCompose(self.topdir, {"gather_allow_reuse": True})
 | |
|         self._save_config_dump(compose)
 | |
|         compose.load_old_compose_config.return_value = compose.conf
 | |
| 
 | |
|         result = gather.reuse_old_gather_packages(
 | |
|             compose, "x86_64", compose.variants["Server"], package_sets, "deps"
 | |
|         )
 | |
|         self.assertEqual(result, None)
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.load_old_gather_result")
 | |
|     def test_reuse_different_packages(self, load_old_gather_result):
 | |
|         package_sets = self._prepare_package_sets(
 | |
|             load_old_gather_result, requires=[], provides=["foo"]
 | |
|         )
 | |
|         package_sets[0]["global"].old_file_cache = None
 | |
|         compose = helpers.DummyCompose(self.topdir, {"gather_allow_reuse": True})
 | |
|         self._save_config_dump(compose)
 | |
|         compose.load_old_compose_config.return_value = compose.conf
 | |
| 
 | |
|         result = gather.reuse_old_gather_packages(
 | |
|             compose, "x86_64", compose.variants["Server"], package_sets, "deps"
 | |
|         )
 | |
|         self.assertEqual(result, None)
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.load_old_gather_result")
 | |
|     def test_reuse_requires_changed(self, load_old_gather_result):
 | |
|         package_sets = self._prepare_package_sets(
 | |
|             load_old_gather_result, requires=["foo"], provides=[]
 | |
|         )
 | |
|         compose = helpers.DummyCompose(self.topdir, {"gather_allow_reuse": True})
 | |
|         self._save_config_dump(compose)
 | |
|         compose.load_old_compose_config.return_value = compose.conf
 | |
| 
 | |
|         result = gather.reuse_old_gather_packages(
 | |
|             compose, "x86_64", compose.variants["Server"], package_sets, "deps"
 | |
|         )
 | |
|         self.assertEqual(result, None)
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.load_old_gather_result")
 | |
|     def test_reuse_provides_changed(self, load_old_gather_result):
 | |
|         package_sets = self._prepare_package_sets(
 | |
|             load_old_gather_result, requires=[], provides=["foo"]
 | |
|         )
 | |
|         compose = helpers.DummyCompose(self.topdir, {"gather_allow_reuse": True})
 | |
|         self._save_config_dump(compose)
 | |
|         compose.load_old_compose_config.return_value = compose.conf
 | |
| 
 | |
|         result = gather.reuse_old_gather_packages(
 | |
|             compose, "x86_64", compose.variants["Server"], package_sets, "deps"
 | |
|         )
 | |
|         self.assertEqual(result, None)
 | |
| 
 | |
| 
 | |
| class TestWritePrepopulate(helpers.PungiTestCase):
 | |
|     def test_without_config(self):
 | |
|         compose = helpers.DummyCompose(self.topdir, {})
 | |
|         gather.write_prepopulate_file(compose)
 | |
|         self.assertFalse(
 | |
|             os.path.isfile(
 | |
|                 os.path.join(self.topdir, "work", "global", "prepopulate.json")
 | |
|             )
 | |
|         )
 | |
| 
 | |
|     def test_copy_by_filename(self):
 | |
|         compose = helpers.DummyCompose(
 | |
|             self.topdir, {"gather_prepopulate": "input-prepopulate.json"}
 | |
|         )
 | |
|         compose.config_dir = self.topdir
 | |
|         helpers.copy_fixture(
 | |
|             "prepopulate.json", os.path.join(self.topdir, "input-prepopulate.json")
 | |
|         )
 | |
| 
 | |
|         gather.write_prepopulate_file(compose)
 | |
|         self.assertTrue(
 | |
|             os.path.isfile(
 | |
|                 os.path.join(self.topdir, "work", "global", "prepopulate.json")
 | |
|             )
 | |
|         )
 | |
| 
 | |
|     def test_copy_local_by_scm_dict(self):
 | |
|         compose = helpers.DummyCompose(
 | |
|             self.topdir,
 | |
|             {
 | |
|                 "gather_prepopulate": {
 | |
|                     "file": "input-prepopulate.json",
 | |
|                     "scm": "file",
 | |
|                     "repo": None,
 | |
|                 }
 | |
|             },
 | |
|         )
 | |
|         compose.config_dir = self.topdir
 | |
|         helpers.copy_fixture(
 | |
|             "prepopulate.json", os.path.join(self.topdir, "input-prepopulate.json")
 | |
|         )
 | |
| 
 | |
|         gather.write_prepopulate_file(compose)
 | |
|         self.assertTrue(
 | |
|             os.path.isfile(
 | |
|                 os.path.join(self.topdir, "work", "global", "prepopulate.json")
 | |
|             )
 | |
|         )
 | |
| 
 | |
| 
 | |
| class TestGetPrepopulate(helpers.PungiTestCase):
 | |
|     def setUp(self):
 | |
|         super(TestGetPrepopulate, self).setUp()
 | |
|         self.compose = helpers.DummyCompose(self.topdir, {})
 | |
| 
 | |
|     def test_no_file(self):
 | |
|         self.assertEqual(
 | |
|             gather.get_prepopulate_packages(
 | |
|                 self.compose, "x86_64", self.compose.variants["Server"]
 | |
|             ),
 | |
|             set(),
 | |
|         )
 | |
| 
 | |
|     def test_for_one_variant(self):
 | |
|         helpers.copy_fixture(
 | |
|             "prepopulate.json",
 | |
|             os.path.join(self.topdir, "work", "global", "prepopulate.json"),
 | |
|         )
 | |
|         self.assertCountEqual(
 | |
|             gather.get_prepopulate_packages(
 | |
|                 self.compose, "x86_64", self.compose.variants["Server"]
 | |
|             ),
 | |
|             ["foo-common.noarch", "foo.i686", "foo.x86_64"],
 | |
|         )
 | |
| 
 | |
|     def test_for_all_variants(self):
 | |
|         helpers.copy_fixture(
 | |
|             "prepopulate.json",
 | |
|             os.path.join(self.topdir, "work", "global", "prepopulate.json"),
 | |
|         )
 | |
|         self.assertCountEqual(
 | |
|             gather.get_prepopulate_packages(self.compose, "x86_64", None),
 | |
|             ["foo-common.noarch", "foo.i686", "foo.x86_64", "bar.x86_64"],
 | |
|         )
 | |
| 
 | |
|     def test_for_all_variants_include_arch_set_to_false(self):
 | |
|         helpers.copy_fixture(
 | |
|             "prepopulate.json",
 | |
|             os.path.join(self.topdir, "work", "global", "prepopulate.json"),
 | |
|         )
 | |
|         self.assertCountEqual(
 | |
|             gather.get_prepopulate_packages(
 | |
|                 self.compose, "x86_64", None, include_arch=False
 | |
|             ),
 | |
|             ["foo-common", "foo", "bar"],
 | |
|         )
 | |
| 
 | |
| 
 | |
| class TestGatherPhase(helpers.PungiTestCase):
 | |
|     @mock.patch("pungi.phases.gather.link_files")
 | |
|     @mock.patch("pungi.phases.gather.gather_wrapper")
 | |
|     def test_run(self, gather_wrapper, link_files):
 | |
|         pkgset_phase = mock.Mock()
 | |
|         compose = helpers.DummyCompose(self.topdir, {})
 | |
|         compose.notifier = mock.Mock()
 | |
|         compose.all_variants["Client"].is_empty = True
 | |
|         pkg_map = gather_wrapper.return_value
 | |
| 
 | |
|         def _mk_link_call(arch, variant):
 | |
|             return mock.call(
 | |
|                 compose,
 | |
|                 arch,
 | |
|                 compose.all_variants[variant],
 | |
|                 pkg_map[arch][variant],
 | |
|                 pkgset_phase.package_sets,
 | |
|                 manifest=phase.manifest,
 | |
|             )
 | |
| 
 | |
|         phase = gather.GatherPhase(compose, pkgset_phase)
 | |
|         phase.run()
 | |
|         phase.stop()
 | |
| 
 | |
|         self.assertEqual(
 | |
|             gather_wrapper.call_args_list,
 | |
|             [mock.call(compose, pkgset_phase.package_sets, pkgset_phase.path_prefix)],
 | |
|         )
 | |
|         self.assertCountEqual(
 | |
|             link_files.call_args_list,
 | |
|             [
 | |
|                 _mk_link_call("x86_64", "Server"),
 | |
|                 _mk_link_call("amd64", "Server"),
 | |
|                 _mk_link_call("amd64", "Everything"),
 | |
|                 _mk_link_call("x86_64", "Everything"),
 | |
|             ],
 | |
|         )
 | |
|         self.assertTrue(
 | |
|             os.path.isfile(
 | |
|                 os.path.join(self.topdir, "compose", "metadata", "rpms.json")
 | |
|             )
 | |
|         )
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.link_files")
 | |
|     @mock.patch("pungi.phases.gather.gather_wrapper")
 | |
|     def test_writes_manifest_when_skipped(self, gather_wrapper, link_files):
 | |
|         pkgset_phase = mock.Mock()
 | |
|         compose = helpers.DummyCompose(self.topdir, {})
 | |
|         compose.notifier = mock.Mock()
 | |
| 
 | |
|         phase = gather.GatherPhase(compose, pkgset_phase)
 | |
|         phase.stop()
 | |
| 
 | |
|         self.assertEqual(gather_wrapper.call_args_list, [])
 | |
|         self.assertFalse(
 | |
|             os.path.isfile(
 | |
|                 os.path.join(self.topdir, "compose", "metadata", "rpms.json")
 | |
|             )
 | |
|         )
 | |
| 
 | |
|     def test_validates_wrong_requiring_variant(self):
 | |
|         pkgset_phase = mock.Mock()
 | |
|         compose = helpers.DummyCompose(
 | |
|             self.topdir, {"variant_as_lookaside": [("foo", "Server")]}
 | |
|         )
 | |
|         phase = gather.GatherPhase(compose, pkgset_phase)
 | |
|         phase.validate()
 | |
| 
 | |
|     def test_validates_wrong_required_variant(self):
 | |
|         pkgset_phase = mock.Mock()
 | |
|         compose = helpers.DummyCompose(
 | |
|             self.topdir, {"variant_as_lookaside": [("Server", "foo")]}
 | |
|         )
 | |
|         phase = gather.GatherPhase(compose, pkgset_phase)
 | |
|         with self.assertRaises(ValueError) as ctx:
 | |
|             phase.validate()
 | |
| 
 | |
|         self.assertIn("'foo' doesn't exist", str(ctx.exception))
 | |
| 
 | |
|     def test_validates_both_requires_missing(self):
 | |
|         pkgset_phase = mock.Mock()
 | |
|         compose = helpers.DummyCompose(
 | |
|             self.topdir, {"variant_as_lookaside": [("foo", "bar")]}
 | |
|         )
 | |
|         phase = gather.GatherPhase(compose, pkgset_phase)
 | |
|         phase.validate()
 | |
| 
 | |
|     def test_validates_variants_requiring_is_not_subset_of_required(self):
 | |
|         pkgset_phase = mock.Mock()
 | |
|         compose = helpers.DummyCompose(
 | |
|             self.topdir, {"variant_as_lookaside": [("Everything", "Client")]}
 | |
|         )
 | |
|         phase = gather.GatherPhase(compose, pkgset_phase)
 | |
|         with self.assertRaises(ValueError) as ctx:
 | |
|             phase.validate()
 | |
|         self.assertIn("architectures of variant 'Client'", str(ctx.exception))
 | |
| 
 | |
|     def test_validates_variants_requiring_is_subset_of_required(self):
 | |
|         pkgset_phase = mock.Mock()
 | |
|         compose = helpers.DummyCompose(
 | |
|             self.topdir, {"variant_as_lookaside": [("Client", "Everything")]}
 | |
|         )
 | |
|         phase = gather.GatherPhase(compose, pkgset_phase)
 | |
|         phase.validate()
 | |
| 
 | |
| 
 | |
| class TestGetPackagesToGather(helpers.PungiTestCase):
 | |
|     def setUp(self):
 | |
|         super(TestGetPackagesToGather, self).setUp()
 | |
|         self.compose = helpers.DummyCompose(
 | |
|             self.topdir,
 | |
|             {"additional_packages": [(".*", {"*": ["pkg", "foo2.x86_64"]})]},
 | |
|         )
 | |
|         helpers.copy_fixture(
 | |
|             "prepopulate.json",
 | |
|             os.path.join(self.topdir, "work", "global", "prepopulate.json"),
 | |
|         )
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.get_gather_source")
 | |
|     def test_all_arches(self, get_gather_source):
 | |
|         get_gather_source.return_value = mock.Mock(
 | |
|             return_value=mock.Mock(return_value=(set([("foo", None)]), set(["core"])))
 | |
|         )
 | |
| 
 | |
|         packages, groups = gather.get_packages_to_gather(self.compose)
 | |
| 
 | |
|         self.assertCountEqual(packages, ["foo", "foo2.x86_64", "pkg"])
 | |
|         self.assertEqual(groups, ["core"])
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.get_gather_source")
 | |
|     def test_all_include_arch_set_to_false(self, get_gather_source):
 | |
|         get_gather_source.return_value = mock.Mock(
 | |
|             return_value=mock.Mock(return_value=(set([("foo", None)]), set(["core"])))
 | |
|         )
 | |
| 
 | |
|         packages, groups = gather.get_packages_to_gather(
 | |
|             self.compose, include_arch=False
 | |
|         )
 | |
| 
 | |
|         self.assertCountEqual(packages, ["foo", "foo2", "pkg"])
 | |
|         self.assertEqual(groups, ["core"])
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.get_gather_source")
 | |
|     def test_all_include_prepopulated(self, get_gather_source):
 | |
|         get_gather_source.return_value = mock.Mock(
 | |
|             return_value=mock.Mock(return_value=(set([("foo", None)]), set(["core"])))
 | |
|         )
 | |
| 
 | |
|         packages, groups = gather.get_packages_to_gather(
 | |
|             self.compose, include_prepopulated=True
 | |
|         )
 | |
| 
 | |
|         self.assertCountEqual(
 | |
|             packages,
 | |
|             [
 | |
|                 "foo",
 | |
|                 "pkg",
 | |
|                 "foo-common.noarch",
 | |
|                 "foo.x86_64",
 | |
|                 "foo.i686",
 | |
|                 "foo2.x86_64",
 | |
|                 "bar.x86_64",
 | |
|             ],
 | |
|         )
 | |
|         self.assertEqual(groups, ["core"])
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.get_gather_source")
 | |
|     def test_all_include_prepopulated_no_include_arch(self, get_gather_source):
 | |
|         get_gather_source.return_value = mock.Mock(
 | |
|             return_value=mock.Mock(return_value=(set([("foo", None)]), set(["core"])))
 | |
|         )
 | |
| 
 | |
|         packages, groups = gather.get_packages_to_gather(
 | |
|             self.compose, include_prepopulated=True, include_arch=False
 | |
|         )
 | |
| 
 | |
|         self.assertCountEqual(packages, ["foo", "pkg", "foo-common", "foo2", "bar"])
 | |
|         self.assertEqual(groups, ["core"])
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.get_gather_source")
 | |
|     def test_all_one_arch(self, get_gather_source):
 | |
|         get_gather_source.return_value = mock.Mock(
 | |
|             return_value=mock.Mock(return_value=(set([("foo", None)]), set(["core"])))
 | |
|         )
 | |
| 
 | |
|         packages, groups = gather.get_packages_to_gather(self.compose, "x86_64")
 | |
| 
 | |
|         self.assertCountEqual(packages, ["foo", "pkg", "foo2.x86_64"])
 | |
|         self.assertEqual(groups, ["core"])
 | |
| 
 | |
| 
 | |
| class TestUpdateConfig(unittest.TestCase):
 | |
|     def test_add_to_empty(self):
 | |
|         compose = mock.Mock(conf={})
 | |
|         gather._update_config(compose, "Server", "x86_64", "/tmp/foo")
 | |
|         self.assertEqual(
 | |
|             compose.conf,
 | |
|             {"gather_lookaside_repos": [("^Server$", {"x86_64": "/tmp/foo"})]},
 | |
|         )
 | |
| 
 | |
|     def test_add_to_existing(self):
 | |
|         compose = mock.Mock(
 | |
|             conf={"gather_lookaside_repos": [("^Server$", {"x86_64": "/tmp/bar"})]}
 | |
|         )
 | |
|         gather._update_config(compose, "Server", "x86_64", "/tmp/foo")
 | |
|         self.assertEqual(
 | |
|             compose.conf,
 | |
|             {
 | |
|                 "gather_lookaside_repos": [
 | |
|                     ("^Server$", {"x86_64": "/tmp/bar"}),
 | |
|                     ("^Server$", {"x86_64": "/tmp/foo"}),
 | |
|                 ]
 | |
|             },
 | |
|         )
 | |
| 
 | |
| 
 | |
| class TestUpdateLookasideConfig(helpers.PungiTestCase):
 | |
|     def setUp(self):
 | |
|         super(TestUpdateLookasideConfig, self).setUp()
 | |
|         self.compose = helpers.DummyCompose(self.topdir, {})
 | |
|         self.pkg_map = mock.Mock()
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather._update_config")
 | |
|     @mock.patch("pungi.phases.gather._make_lookaside_repo")
 | |
|     def test_no_config(self, mock_make_repo, mock_update_config):
 | |
|         gather._update_lookaside_config(
 | |
|             self.compose, self.compose.variants["Server"], "x86_64", self.pkg_map
 | |
|         )
 | |
|         self.assertEqual(mock_make_repo.call_args_list, [])
 | |
|         self.assertEqual(mock_update_config.call_args_list, [])
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather._update_config")
 | |
|     @mock.patch("pungi.phases.gather._make_lookaside_repo")
 | |
|     def test_no_matching_config(self, mock_make_repo, mock_update_config):
 | |
|         self.compose.conf["variant_as_lookaside"] = [("Everything", "Client")]
 | |
|         gather._update_lookaside_config(
 | |
|             self.compose, self.compose.variants["Server"], "x86_64", self.pkg_map
 | |
|         )
 | |
|         self.assertEqual(mock_make_repo.call_args_list, [])
 | |
|         self.assertEqual(mock_update_config.call_args_list, [])
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather._update_config")
 | |
|     @mock.patch("pungi.phases.gather._make_lookaside_repo")
 | |
|     def test_missing_arch(self, mock_make_repo, mock_update_config):
 | |
|         # Client only has amd64
 | |
|         self.compose.conf["variant_as_lookaside"] = [("Server", "Client")]
 | |
|         gather._update_lookaside_config(
 | |
|             self.compose, self.compose.variants["Server"], "x86_64", self.pkg_map
 | |
|         )
 | |
|         self.assertEqual(len(self.compose.log_warning.call_args_list), 1)
 | |
|         self.assertEqual(mock_make_repo.call_args_list, [])
 | |
|         self.assertEqual(mock_update_config.call_args_list, [])
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather._update_config")
 | |
|     @mock.patch("pungi.phases.gather._make_lookaside_repo")
 | |
|     def test_match(self, mock_make_repo, mock_update_config):
 | |
|         self.compose.conf["variant_as_lookaside"] = [("Server", "Everything")]
 | |
|         gather._update_lookaside_config(
 | |
|             self.compose, self.compose.variants["Server"], "x86_64", self.pkg_map
 | |
|         )
 | |
|         self.assertEqual(len(self.compose.log_warning.call_args_list), 0)
 | |
|         self.assertEqual(
 | |
|             mock_make_repo.call_args_list,
 | |
|             [
 | |
|                 mock.call(
 | |
|                     self.compose,
 | |
|                     self.compose.variants["Everything"],
 | |
|                     "x86_64",
 | |
|                     self.pkg_map,
 | |
|                     None,
 | |
|                 )
 | |
|             ],
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             mock_update_config.call_args_list,
 | |
|             [mock.call(self.compose, "Server", "x86_64", mock_make_repo.return_value)],
 | |
|         )
 | |
| 
 | |
| 
 | |
| class TestMakeLookasideRepo(helpers.PungiTestCase):
 | |
|     def setUp(self):
 | |
|         super(TestMakeLookasideRepo, self).setUp()
 | |
|         self.compose = helpers.DummyCompose(self.topdir, {})
 | |
|         self.variant = self.compose.variants["Server"]
 | |
|         self.arch = "x86_64"
 | |
|         self.repodir = self.compose.paths.work.lookaside_repo(
 | |
|             self.arch, self.variant, create_dir=False
 | |
|         )
 | |
|         self.pkglist = self.compose.paths.work.lookaside_package_list(
 | |
|             self.arch, self.variant
 | |
|         )
 | |
|         self.package_sets = self._make_pkgset_phase(["p1", "p2"]).package_sets
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.run")
 | |
|     def test_existing_repo(self, mock_run):
 | |
|         helpers.touch(os.path.join(self.repodir, "repodata", "primary.xml"))
 | |
|         repopath = gather._make_lookaside_repo(
 | |
|             self.compose, self.variant, self.arch, {}
 | |
|         )
 | |
|         self.assertEqual(self.repodir, repopath)
 | |
|         self.assertFalse(os.path.exists(self.pkglist))
 | |
|         self.assertEqual(mock_run.call_args_list, [])
 | |
| 
 | |
|     def assertCorrect(self, repopath, path_prefix, MockCR, mock_run):
 | |
|         with open(self.pkglist) as f:
 | |
|             packages = f.read().splitlines()
 | |
|         self.assertCountEqual(
 | |
|             packages,
 | |
|             [
 | |
|                 "pkg/pkg-1.0-1.x86_64.rpm",
 | |
|                 "pkg/pkg-debuginfo-1.0-1.x86_64.rpm",
 | |
|                 "pkg/pkg-1.0-1.src.rpm",
 | |
|             ],
 | |
|         )
 | |
| 
 | |
|         self.assertEqual(self.repodir, repopath)
 | |
|         self.assertEqual(
 | |
|             MockCR.return_value.get_createrepo_cmd.call_args_list,
 | |
|             [
 | |
|                 mock.call(
 | |
|                     path_prefix,
 | |
|                     update=True,
 | |
|                     database=True,
 | |
|                     skip_stat=True,
 | |
|                     pkglist=self.pkglist,
 | |
|                     outputdir=repopath,
 | |
|                     baseurl="file://%s" % path_prefix,
 | |
|                     workers=3,
 | |
|                     update_md_path=self.compose.paths.work.pkgset_repo("p2", self.arch),
 | |
|                 )
 | |
|             ],
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             mock_run.call_args_list,
 | |
|             [
 | |
|                 mock.call(
 | |
|                     MockCR.return_value.get_createrepo_cmd.return_value,
 | |
|                     logfile=os.path.join(
 | |
|                         self.topdir,
 | |
|                         "logs",
 | |
|                         self.arch,
 | |
|                         "lookaside_repo_Server.%s.log" % self.arch,
 | |
|                     ),
 | |
|                     show_cmd=True,
 | |
|                 )
 | |
|             ],
 | |
|         )
 | |
| 
 | |
|     @mock.patch("pungi.wrappers.kojiwrapper.KojiWrapper")
 | |
|     @mock.patch("pungi.phases.gather.CreaterepoWrapper")
 | |
|     @mock.patch("pungi.phases.gather.run")
 | |
|     def test_create_repo_koji_pkgset(self, mock_run, MockCR, MockKW):
 | |
|         self.compose.conf.update({"pkgset_source": "koji", "koji_profile": "koji"})
 | |
| 
 | |
|         pkg_map = {
 | |
|             self.arch: {
 | |
|                 self.variant.uid: {
 | |
|                     "rpm": [{"path": "/tmp/packages/pkg/pkg-1.0-1.x86_64.rpm"}],
 | |
|                     "debuginfo": [
 | |
|                         {"path": "/tmp/packages/pkg/pkg-debuginfo-1.0-1.x86_64.rpm"}
 | |
|                     ],
 | |
|                     "srpm": [{"path": "/tmp/packages/pkg/pkg-1.0-1.src.rpm"}],
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         MockKW.return_value.koji_module.config.topdir = "/tmp/packages"
 | |
| 
 | |
|         repopath = gather._make_lookaside_repo(
 | |
|             self.compose, self.variant, self.arch, pkg_map, self.package_sets
 | |
|         )
 | |
| 
 | |
|         self.assertCorrect(repopath, "/tmp/packages/", MockCR, mock_run)
 | |
| 
 | |
|     @mock.patch("pungi.phases.gather.CreaterepoWrapper")
 | |
|     @mock.patch("pungi.phases.gather.run")
 | |
|     def test_create_repo_repos_pkgset(self, mock_run, MockCR):
 | |
|         self.compose.conf.update({"pkgset_source": "repos"})
 | |
| 
 | |
|         dl_dir = self.compose.paths.work.topdir("global")
 | |
| 
 | |
|         pkg_map = {
 | |
|             self.arch: {
 | |
|                 self.variant.uid: {
 | |
|                     "rpm": [
 | |
|                         {
 | |
|                             "path": os.path.join(
 | |
|                                 dl_dir, "download/pkg/pkg-1.0-1.x86_64.rpm"
 | |
|                             )
 | |
|                         }
 | |
|                     ],
 | |
|                     "debuginfo": [
 | |
|                         {
 | |
|                             "path": os.path.join(
 | |
|                                 dl_dir, "download/pkg/pkg-debuginfo-1.0-1.x86_64.rpm"
 | |
|                             )
 | |
|                         }
 | |
|                     ],
 | |
|                     "srpm": [
 | |
|                         {"path": os.path.join(dl_dir, "download/pkg/pkg-1.0-1.src.rpm")}
 | |
|                     ],
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         repopath = gather._make_lookaside_repo(
 | |
|             self.compose, self.variant, self.arch, pkg_map, self.package_sets
 | |
|         )
 | |
| 
 | |
|         self.assertCorrect(repopath, dl_dir + "/download/", MockCR, mock_run)
 |