Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
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
147 changes: 147 additions & 0 deletions Lib/test/test_tools/test_compute_changes.py
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add this file to code owners too.

Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
"""Tests to cover the Tools/build/compite-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):
files = (
".github/workflows/reusable-docs.yml",
"Doc/library/datetime.rst",
"Doc/Makefile"
)
for f in files:
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 / "comhad"
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) / "comhad"})
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) / "comhad"})
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) / "comhad"})
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 / "comhad"})
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):
files = (
".github/workflows/reusable-windows-msi.yml",
"Tools/msi/build.bat",
)
for f in files:
with self.subTest(f=f):
result = process_changed_files({Path(f)})
self.assertTrue(result.run_windows_msi)

def test_all_run(self):
files = [
".github/workflows/some-new-workflow.yml",
".github/workflows/build.yml",
]
for f in files:
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/comhad")}
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 @@ -225,19 +225,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