"""Tests to cover the Tools/build/compute-changes.py script.""" import importlib import os import unittest from pathlib import Path from unittest.mock import patch from test.test_tools import skip_if_missing, imports_under_tool skip_if_missing("build") with patch.dict(os.environ, {"GITHUB_DEFAULT_BRANCH": "main"}): with imports_under_tool("build"): compute_changes = importlib.import_module("compute-changes") process_changed_files = compute_changes.process_changed_files Outputs = compute_changes.Outputs ANDROID_DIRS = compute_changes.ANDROID_DIRS IOS_DIRS = compute_changes.IOS_DIRS MACOS_DIRS = compute_changes.MACOS_DIRS WASI_DIRS = compute_changes.WASI_DIRS RUN_TESTS_IGNORE = compute_changes.RUN_TESTS_IGNORE UNIX_BUILD_SYSTEM_FILE_NAMES = compute_changes.UNIX_BUILD_SYSTEM_FILE_NAMES LIBRARY_FUZZER_PATHS = compute_changes.LIBRARY_FUZZER_PATHS class TestProcessChangedFiles(unittest.TestCase): def test_windows(self): f = {Path(".github/workflows/reusable-windows.yml")} result = process_changed_files(f) self.assertTrue(result.run_tests) self.assertTrue(result.run_windows_tests) def test_docs(self): for f in ( ".github/workflows/reusable-docs.yml", "Doc/library/datetime.rst", "Doc/Makefile", ): with self.subTest(f=f): result = process_changed_files({Path(f)}) self.assertTrue(result.run_docs) self.assertFalse(result.run_tests) def test_ci_fuzz_stdlib(self): for p in LIBRARY_FUZZER_PATHS: with self.subTest(p=p): if p.is_dir(): f = p / "file" elif p.is_file(): f = p else: continue result = process_changed_files({f}) self.assertTrue(result.run_ci_fuzz_stdlib) def test_android(self): for d in ANDROID_DIRS: with self.subTest(d=d): result = process_changed_files({Path(d) / "file"}) self.assertTrue(result.run_tests) self.assertTrue(result.run_android) self.assertFalse(result.run_windows_tests) def test_ios(self): for d in IOS_DIRS: with self.subTest(d=d): result = process_changed_files({Path(d) / "file"}) self.assertTrue(result.run_tests) self.assertTrue(result.run_ios) self.assertFalse(result.run_windows_tests) def test_macos(self): f = {Path(".github/workflows/reusable-macos.yml")} result = process_changed_files(f) self.assertTrue(result.run_tests) self.assertTrue(result.run_macos) for d in MACOS_DIRS: with self.subTest(d=d): result = process_changed_files({Path(d) / "file"}) self.assertTrue(result.run_tests) self.assertTrue(result.run_macos) self.assertFalse(result.run_windows_tests) def test_wasi(self): f = {Path(".github/workflows/reusable-wasi.yml")} result = process_changed_files(f) self.assertTrue(result.run_tests) self.assertTrue(result.run_wasi) for d in WASI_DIRS: with self.subTest(d=d): result = process_changed_files({d / "file"}) self.assertTrue(result.run_tests) self.assertTrue(result.run_wasi) self.assertFalse(result.run_windows_tests) def test_unix(self): for f in UNIX_BUILD_SYSTEM_FILE_NAMES: with self.subTest(f=f): result = process_changed_files({f}) self.assertTrue(result.run_tests) self.assertFalse(result.run_windows_tests) def test_msi(self): for f in ( ".github/workflows/reusable-windows-msi.yml", "Tools/msi/build.bat", ): with self.subTest(f=f): result = process_changed_files({Path(f)}) self.assertTrue(result.run_windows_msi) def test_all_run(self): for f in ( ".github/workflows/some-new-workflow.yml", ".github/workflows/build.yml", ): with self.subTest(f=f): result = process_changed_files({Path(f)}) self.assertTrue(result.run_tests) self.assertTrue(result.run_android) self.assertTrue(result.run_ios) self.assertTrue(result.run_macos) self.assertTrue(result.run_ubuntu) self.assertTrue(result.run_wasi) def test_all_ignored(self): for f in RUN_TESTS_IGNORE: with self.subTest(f=f): self.assertEqual(process_changed_files({Path(f)}), Outputs()) def test_wasi_and_android(self): f = {Path(".github/workflows/reusable-wasi.yml"), Path("Android/file")} result = process_changed_files(f) self.assertTrue(result.run_tests) self.assertTrue(result.run_wasi) if __name__ == "__main__": unittest.main()