test_build_grouping.py (5986B)
1 #!/usr/bin/env python3 2 3 # This file is in the public domain. 4 5 import importlib.machinery 6 import importlib.util 7 import sys 8 import unittest 9 from dataclasses import replace 10 from io import StringIO 11 from pathlib import Path 12 from types import SimpleNamespace 13 from unittest.mock import patch 14 15 ROOT = Path(__file__).parents[1] 16 sys.path.insert(0, str(ROOT)) 17 sys.path.insert(0, str(ROOT / "buildscripts")) 18 LOADER = importlib.machinery.SourceFileLoader("taler_pkg", str(ROOT / "taler-pkg")) 19 SPEC = importlib.util.spec_from_loader(LOADER.name, LOADER) 20 TALER_PKG = importlib.util.module_from_spec(SPEC) 21 LOADER.exec_module(TALER_PKG) 22 23 from package_config import parse_config # noqa: E402 24 25 26 class BuildGroupingTests(unittest.TestCase): 27 def test_libmicrohttpd_is_built_before_gnunet(self): 28 buildorder = TALER_PKG.buildsort(TALER_PKG.components) 29 30 self.assertLess(buildorder.index("libmicrohttpd"), buildorder.index("gnunet")) 31 32 def test_typescript_packages_share_one_group(self): 33 buildorder = TALER_PKG.buildsort(TALER_PKG.components) 34 typescript_packages = { 35 name 36 for name in TALER_PKG.components 37 if TALER_PKG.config.packages[name].repository == "typescript-core" 38 } 39 40 groups = TALER_PKG.group_components(typescript_packages, buildorder) 41 42 self.assertEqual(1, len(groups)) 43 self.assertEqual(typescript_packages, set(groups[0])) 44 45 def test_different_tags_create_different_groups(self): 46 original = TALER_PKG.config 47 packages = dict(original.packages) 48 packages["taler-wallet-cli"] = replace( 49 packages["taler-wallet-cli"], tag="v9.9.9" 50 ) 51 TALER_PKG.config = replace(original, packages=packages) 52 try: 53 selected = {"taler-wallet-cli", "taler-harness"} 54 groups = TALER_PKG.group_components( 55 selected, TALER_PKG.buildsort(TALER_PKG.components) 56 ) 57 finally: 58 TALER_PKG.config = original 59 60 self.assertEqual(2, len(groups)) 61 self.assertEqual(selected, {group[0] for group in groups}) 62 63 def test_generic_packages_remain_isolated(self): 64 selected = {"anastasis", "anastasis-gtk"} 65 66 groups = TALER_PKG.group_components( 67 selected, TALER_PKG.buildsort(TALER_PKG.components) 68 ) 69 70 self.assertEqual([["anastasis"], ["anastasis-gtk"]], groups) 71 72 def test_non_workspace_packages_remain_isolated(self): 73 original = TALER_PKG.config 74 TALER_PKG.config = parse_config( 75 { 76 "repositories": { 77 "overlay": { 78 "url": "git://example.test/overlay.git", 79 "builder": "debian-overlay", 80 } 81 }, 82 "packages": { 83 "overlay-one": {"repository": "overlay", "tag": "v1.0.0"}, 84 "overlay-two": {"repository": "overlay", "tag": "v1.0.0"}, 85 }, 86 } 87 ) 88 try: 89 selected = {"overlay-one", "overlay-two"} 90 groups = TALER_PKG.group_components( 91 selected, TALER_PKG.buildsort(sorted(selected)) 92 ) 93 finally: 94 TALER_PKG.config = original 95 96 self.assertEqual([["overlay-one"], ["overlay-two"]], groups) 97 98 def test_upgrade_queries_a_shared_repository_once(self): 99 arguments = SimpleNamespace( 100 components=["taler-wallet-cli", "taler-harness"], 101 dev=True, 102 dry=True, 103 ) 104 with ( 105 patch.object( 106 TALER_PKG, 107 "list_remote_tags", 108 return_value=["v1.6.33-dev.2", "v1.6.33-dev.3"], 109 ) as list_remote_tags, 110 patch("sys.stdout", new_callable=StringIO), 111 ): 112 TALER_PKG.upgrade(arguments) 113 114 list_remote_tags.assert_called_once() 115 116 def test_default_upgrade_skips_pinned_packages(self): 117 original = TALER_PKG.config 118 TALER_PKG.config = parse_config( 119 { 120 "repositories": {"repo": {"url": "git://example.test/repo.git"}}, 121 "packages": { 122 "pinned": { 123 "repository": "repo", 124 "tag": "v1.0.0", 125 "auto_upgrade": False, 126 } 127 }, 128 } 129 ) 130 arguments = SimpleNamespace(components=[], dev=False, dry=True) 131 try: 132 with ( 133 patch.object(TALER_PKG, "list_remote_tags") as list_remote_tags, 134 patch("sys.stdout", new_callable=StringIO) as stdout, 135 ): 136 TALER_PKG.upgrade(arguments) 137 finally: 138 TALER_PKG.config = original 139 140 list_remote_tags.assert_not_called() 141 self.assertIn("automatic upgrades disabled", stdout.getvalue()) 142 143 def test_explicit_upgrade_includes_pinned_packages(self): 144 original = TALER_PKG.config 145 TALER_PKG.config = parse_config( 146 { 147 "repositories": {"repo": {"url": "git://example.test/repo.git"}}, 148 "packages": { 149 "pinned": { 150 "repository": "repo", 151 "tag": "v1.0.0", 152 "auto_upgrade": False, 153 } 154 }, 155 } 156 ) 157 arguments = SimpleNamespace(components=["pinned"], dev=False, dry=True) 158 try: 159 with ( 160 patch.object( 161 TALER_PKG, "list_remote_tags", return_value=["v1.0.1"] 162 ) as list_remote_tags, 163 patch("sys.stdout", new_callable=StringIO) as stdout, 164 ): 165 TALER_PKG.upgrade(arguments) 166 finally: 167 TALER_PKG.config = original 168 169 list_remote_tags.assert_called_once() 170 self.assertIn("pinned v1.0.0 -> v1.0.1", stdout.getvalue()) 171 172 173 if __name__ == "__main__": 174 unittest.main()