224 lines
7.2 KiB
Python
224 lines
7.2 KiB
Python
#!/usr/bin/env python3
|
|
"""Tests for deterministic external CI runner allocation."""
|
|
|
|
import importlib.util
|
|
from pathlib import Path
|
|
import unittest
|
|
|
|
|
|
SCRIPT = Path(__file__).with_name("runner-plan.py")
|
|
SPEC = importlib.util.spec_from_file_location("runner_plan", SCRIPT)
|
|
assert SPEC is not None and SPEC.loader is not None
|
|
runner_plan = importlib.util.module_from_spec(SPEC)
|
|
SPEC.loader.exec_module(runner_plan)
|
|
|
|
E2E_FAMILIES = [
|
|
{"name": "changes", "tier": "light"},
|
|
{
|
|
"name": "e2e",
|
|
"tier": "standard",
|
|
"instances": [{"shard": shard} for shard in range(1, 15)],
|
|
},
|
|
{"name": "e2e_gate", "tier": "light"},
|
|
]
|
|
FRONTEND_FAMILIES = [
|
|
{"name": "frontend", "tier": "standard"},
|
|
{"name": "frontend_gate", "tier": "light"},
|
|
]
|
|
BACKEND_MATRIX_FAMILY = [
|
|
{
|
|
"name": "backend_test",
|
|
"tier": "standard",
|
|
"instances": [{"shard": 1, "index": 0}, {"shard": 2, "index": 1}],
|
|
}
|
|
]
|
|
|
|
|
|
class RunnerPlanTest(unittest.TestCase):
|
|
def test_missing_percentage_defaults_to_github(self) -> None:
|
|
plan = runner_plan.build_plan(
|
|
workflow="e2e",
|
|
run_id="100",
|
|
families=E2E_FAMILIES,
|
|
burst="true",
|
|
percent=None,
|
|
light_label="light-runner",
|
|
standard_label="standard-runner",
|
|
)
|
|
|
|
self.assertEqual(plan.plan["changes_runner"], "ubuntu-latest")
|
|
self.assertFalse(plan.warnings)
|
|
|
|
def test_burst_off_ignores_percentage(self) -> None:
|
|
plan = runner_plan.build_plan(
|
|
workflow="frontend",
|
|
run_id="101",
|
|
families=FRONTEND_FAMILIES,
|
|
burst="false",
|
|
percent="100",
|
|
light_label="light-runner",
|
|
standard_label="standard-runner",
|
|
)
|
|
|
|
self.assertEqual(plan.plan["frontend_runner"], "ubuntu-latest")
|
|
self.assertEqual(plan.plan["frontend_gate_runner"], "ubuntu-latest")
|
|
|
|
def test_matrix_percentage_uses_floor_and_is_stable(self) -> None:
|
|
first = runner_plan.build_plan(
|
|
workflow="e2e",
|
|
run_id="102",
|
|
families=E2E_FAMILIES,
|
|
burst="true",
|
|
percent="50",
|
|
light_label="light-runner",
|
|
standard_label="standard-runner",
|
|
)
|
|
second = runner_plan.build_plan(
|
|
workflow="e2e",
|
|
run_id="102",
|
|
families=E2E_FAMILIES,
|
|
burst="true",
|
|
percent="50",
|
|
light_label="light-runner",
|
|
standard_label="standard-runner",
|
|
)
|
|
|
|
first_matrix = first.plan["e2e_matrix"]["include"]
|
|
second_matrix = second.plan["e2e_matrix"]["include"]
|
|
self.assertEqual(first_matrix, second_matrix)
|
|
self.assertEqual(
|
|
sum(item["runner"] == "standard-runner" for item in first_matrix), 7
|
|
)
|
|
|
|
def test_backend_matrix_percentage_uses_floor(self) -> None:
|
|
plan = runner_plan.build_plan(
|
|
workflow="backend",
|
|
run_id="103",
|
|
families=BACKEND_MATRIX_FAMILY,
|
|
burst="true",
|
|
percent="50",
|
|
light_label="light-runner",
|
|
standard_label="standard-runner",
|
|
)
|
|
|
|
matrix = plan.plan["backend_test_matrix"]["include"]
|
|
self.assertEqual(
|
|
sum(item["runner"] == "standard-runner" for item in matrix), 1
|
|
)
|
|
self.assertEqual(
|
|
[(item["shard"], item["index"]) for item in matrix],
|
|
[(1, 0), (2, 1)],
|
|
)
|
|
|
|
def test_workflow_owned_family_names_need_no_python_change(self) -> None:
|
|
plan = runner_plan.build_plan(
|
|
workflow="new-workflow",
|
|
run_id="109",
|
|
families=[{"name": "new_job", "tier": "standard"}],
|
|
burst="true",
|
|
percent="100",
|
|
light_label="light-runner",
|
|
standard_label="standard-runner",
|
|
)
|
|
|
|
self.assertEqual(plan.plan, {"new_job_runner": "standard-runner"})
|
|
|
|
def test_invalid_family_definition_is_rejected(self) -> None:
|
|
with self.assertRaisesRegex(ValueError, "duplicate family name"):
|
|
runner_plan.build_plan(
|
|
workflow="frontend",
|
|
run_id="110",
|
|
families=[
|
|
{"name": "same", "tier": "light"},
|
|
{"name": "same", "tier": "standard"},
|
|
],
|
|
burst="true",
|
|
percent="50",
|
|
light_label="light-runner",
|
|
standard_label="standard-runner",
|
|
)
|
|
|
|
def test_singleton_allocation_is_stable_for_reruns(self) -> None:
|
|
first = runner_plan.build_plan(
|
|
workflow="frontend",
|
|
run_id="104",
|
|
families=FRONTEND_FAMILIES,
|
|
burst="true",
|
|
percent="50",
|
|
light_label="light-runner",
|
|
standard_label="standard-runner",
|
|
)
|
|
second = runner_plan.build_plan(
|
|
workflow="frontend",
|
|
run_id="104",
|
|
families=FRONTEND_FAMILIES,
|
|
burst="true",
|
|
percent="50",
|
|
light_label="light-runner",
|
|
standard_label="standard-runner",
|
|
)
|
|
self.assertEqual(first.plan, second.plan)
|
|
|
|
def test_empty_tier_label_falls_back_to_github(self) -> None:
|
|
plan = runner_plan.build_plan(
|
|
workflow="frontend",
|
|
run_id="105",
|
|
families=FRONTEND_FAMILIES,
|
|
burst="true",
|
|
percent="100",
|
|
light_label="",
|
|
standard_label="",
|
|
)
|
|
|
|
self.assertEqual(plan.plan["frontend_runner"], "ubuntu-latest")
|
|
|
|
def test_invalid_percentage_fails_closed_with_warning(self) -> None:
|
|
plan = runner_plan.build_plan(
|
|
workflow="e2e",
|
|
run_id="106",
|
|
families=E2E_FAMILIES,
|
|
burst="true",
|
|
percent="101",
|
|
light_label="light-runner",
|
|
standard_label="standard-runner",
|
|
)
|
|
|
|
self.assertTrue(plan.warnings)
|
|
self.assertEqual(plan.plan["changes_runner"], "ubuntu-latest")
|
|
matrix = plan.plan["e2e_matrix"]["include"]
|
|
self.assertTrue(all(item["runner"] == "ubuntu-latest" for item in matrix))
|
|
|
|
def test_unicode_digits_fail_closed_with_warning(self) -> None:
|
|
plan = runner_plan.build_plan(
|
|
workflow="e2e",
|
|
run_id="108",
|
|
families=E2E_FAMILIES,
|
|
burst="true",
|
|
percent="²",
|
|
light_label="light-runner",
|
|
standard_label="standard-runner",
|
|
)
|
|
|
|
self.assertTrue(plan.warnings)
|
|
self.assertEqual(plan.plan["changes_runner"], "ubuntu-latest")
|
|
matrix = plan.plan["e2e_matrix"]["include"]
|
|
self.assertTrue(all(item["runner"] == "ubuntu-latest" for item in matrix))
|
|
|
|
def test_full_percentage_uses_external_for_non_empty_tier(self) -> None:
|
|
plan = runner_plan.build_plan(
|
|
workflow="frontend",
|
|
run_id="107",
|
|
families=FRONTEND_FAMILIES,
|
|
burst="true",
|
|
percent="100",
|
|
light_label="light-runner",
|
|
standard_label="standard-runner",
|
|
)
|
|
|
|
self.assertEqual(plan.plan["frontend_runner"], "standard-runner")
|
|
self.assertEqual(plan.plan["frontend_gate_runner"], "light-runner")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|