Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion .github/CODEOWNERS
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,11 @@

# GitHub
.github/** @ezio-melotti @hugovk @webknjaz
Tools/build/compute-changes.py @AA-Turner @hugovk @webknjaz
Lib/test/test_tools/test_compute_changes.py @AA-Turner @hugovk @webknjaz

# pre-commit
.pre-commit-config.yaml @hugovk
pre-commit-config.yaml @hugovk
Comment thread
StanFromIreland marked this conversation as resolved.
Outdated
.ruff.toml @hugovk @AlexWaygood

# Build system
Expand Down
144 changes: 144 additions & 0 deletions Lib/test/test_tools/test_compute_changes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
"""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()
12 changes: 10 additions & 2 deletions Tools/build/compute-changes.py
Original file line number Diff line number Diff line change
Expand Up @@ -220,19 +220,27 @@ def process_changed_files(changed_files: Set[Path]) -> Outputs:

if file.parent == GITHUB_WORKFLOWS_PATH:
if file.name in ("build.yml", "reusable-cifuzz.yml"):
run_tests = run_ci_fuzz = run_ci_fuzz_stdlib = True
run_tests = run_ci_fuzz = run_ci_fuzz_stdlib = run_windows_tests = True
has_platform_specific_change = False
continue
if file.name == "reusable-docs.yml":
run_docs = True
continue
if file.name == "reusable-windows.yml":
run_tests = True
run_windows_tests = True
continue
if file.name == "reusable-windows-msi.yml":
run_windows_msi = True
continue
if file.name == "reusable-macos.yml":
run_tests = True
platforms_changed.add("macos")
continue
if file.name == "reusable-wasi.yml":
run_tests = True
platforms_changed.add("wasi")
continue
continue

if not doc_file and file not in RUN_TESTS_IGNORE:
run_tests = True
Expand Down
Loading