test_buildlib.py (5819B)
1 #!/usr/bin/env python3 2 3 # This file is in the public domain. 4 5 import json 6 import sys 7 import tempfile 8 import unittest 9 from pathlib import Path 10 from unittest.mock import patch 11 12 BUILDSCRIPTS = Path(__file__).parents[1] / "buildscripts" 13 sys.path.insert(0, str(BUILDSCRIPTS)) 14 15 import buildlib # noqa: E402 16 from package_config import ConfigError, parse_config # noqa: E402 17 18 19 class BuildLibraryTests(unittest.TestCase): 20 def test_local_repository_keeps_packages_for_all_architectures(self): 21 with tempfile.TemporaryDirectory() as temporary_directory: 22 package_directory = Path(temporary_directory) 23 24 with ( 25 patch.object(buildlib, "PKGDIR", package_directory), 26 patch.object(buildlib.os, "chdir"), 27 patch.object(buildlib, "run_cmd") as run_cmd, 28 patch("builtins.open", unittest.mock.mock_open()), 29 ): 30 buildlib.scan_local_repository() 31 32 scan, update = run_cmd.call_args_list 33 self.assertIn("dpkg-scanpackages --multiversion", scan.args[0]) 34 self.assertTrue(scan.kwargs["shell"]) 35 self.assertEqual(["apt-get", "update"], update.args[0]) 36 37 def test_pnpm_workspace_is_installed_and_built_once(self): 38 with tempfile.TemporaryDirectory() as temporary_directory: 39 root = Path(temporary_directory) 40 package_paths = [root / "one", root / "two"] 41 for number, package_path in enumerate(package_paths, start=1): 42 package_path.mkdir() 43 (package_path / "package.json").write_text( 44 json.dumps({"name": f"@example/package-{number}"}) 45 ) 46 47 with patch.object(buildlib, "run_cmd") as run_cmd: 48 buildlib._prepare_pnpm_workspace(root, package_paths) 49 50 self.assertEqual(2, run_cmd.call_count) 51 install, build = run_cmd.call_args_list 52 self.assertEqual("install", install.args[0][1]) 53 self.assertEqual("run", build.args[0][1]) 54 self.assertEqual(2, install.args[0].count("--filter")) 55 self.assertEqual(2, build.args[0].count("--filter")) 56 57 def test_group_validation_requires_equal_revision_and_builder(self): 58 config = parse_config( 59 { 60 "repositories": { 61 "repo": { 62 "url": "git://example.test/repo.git", 63 "builder": "pnpm-workspace", 64 } 65 }, 66 "packages": { 67 "one": {"repository": "repo", "tag": "v1.0.0"}, 68 "two": {"repository": "repo", "tag": "v2.0.0"}, 69 }, 70 } 71 ) 72 73 with self.assertRaisesRegex(ConfigError, "same repository, tag, and builder"): 74 buildlib._validate_group(config, ["one", "two"], "pnpm-workspace") 75 76 def test_debian_overlay_is_copied_without_replacing_packaging(self): 77 config = parse_config( 78 { 79 "repositories": { 80 "repo": { 81 "url": "git://example.test/repo.git", 82 "builder": "debian-overlay", 83 } 84 }, 85 "packages": {"one": {"repository": "repo", "tag": "v1.0.0"}}, 86 } 87 ) 88 package = config.packages["one"] 89 90 with tempfile.TemporaryDirectory() as temporary_directory: 91 root = Path(temporary_directory) 92 overlay_root = root / "overlays" 93 overlay = overlay_root / "one" / "debian" 94 overlay.mkdir(parents=True) 95 (overlay / "control").write_text("Source: one\n") 96 source = root / "source" 97 source.mkdir() 98 99 with patch.object(buildlib, "OVERLAYDIR", overlay_root): 100 buildlib._apply_debian_overlay(package, source) 101 self.assertEqual("Source: one\n", (source / "debian/control").read_text()) 102 with self.assertRaisesRegex(ConfigError, "refusing to replace"): 103 buildlib._apply_debian_overlay(package, source) 104 105 def test_failed_validation_does_not_publish_artifacts_or_markers(self): 106 config = parse_config( 107 { 108 "repositories": {"repo": {"url": "git://example.test/repo.git"}}, 109 "packages": {"one": {"repository": "repo", "tag": "v1.0.0"}}, 110 } 111 ) 112 package = config.packages["one"] 113 114 with tempfile.TemporaryDirectory() as temporary_directory: 115 root = Path(temporary_directory) 116 package_path = root / "source" 117 output_dir = root 118 (package_path / "debian").mkdir(parents=True) 119 artifact = output_dir / "one_1.0.0_all.deb" 120 artifact.touch() 121 published = root / "published" 122 published.mkdir() 123 124 with ( 125 patch.object(buildlib, "PKGDIR", published), 126 patch.object(buildlib, "run_cmd"), 127 patch.object( 128 buildlib, 129 "_package_artifacts", 130 side_effect=[set(), {artifact.resolve()}], 131 ), 132 patch.object( 133 buildlib, 134 "_check_installed_binaries", 135 side_effect=RuntimeError("invalid binary"), 136 ), 137 ): 138 with self.assertRaisesRegex(RuntimeError, "invalid binary"): 139 buildlib._build_package( 140 package, 141 package_path, 142 "v1.0.0", 143 "trixie", 144 "amd64", 145 prebuilt=False, 146 ) 147 148 self.assertEqual([], list(published.iterdir())) 149 150 151 if __name__ == "__main__": 152 unittest.main()