Skip to content

Commit 3c98384

Browse files
committed
feat(test): wire --only-changes (shadow) and --build-coverage-map
1 parent 7581bb4 commit 3c98384

2 files changed

Lines changed: 51 additions & 0 deletions

File tree

toolchain/mfc/cli/commands.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,25 @@
464464
type=str,
465465
default=None,
466466
),
467+
Argument(
468+
name="build-coverage-map", dest="build_coverage_map", action=ArgAction.STORE_TRUE, default=False, help="Build the gcov coverage map (requires a prior --gcov build). Master-side only."
469+
),
470+
Argument(
471+
name="only-changes",
472+
dest="only_changes",
473+
action=ArgAction.STORE_TRUE,
474+
default=False,
475+
help="Select only tests whose covered files overlap changed files (shadow mode unless --select-enforce).",
476+
),
477+
Argument(
478+
name="select-enforce",
479+
dest="select_enforce",
480+
action=ArgAction.STORE_TRUE,
481+
default=False,
482+
help="With --only-changes, actually skip unselected tests (otherwise shadow: print selection, run all).",
483+
),
484+
Argument(name="changed-files", dest="changed_files", type=str, default=None, help="Newline- or comma-separated changed-file list (from CI paths-filter). Overrides git detection."),
485+
Argument(name="changes-branch", dest="changes_branch", type=str, default="master", help="Branch to diff against for --only-changes."),
467486
],
468487
mutually_exclusive=[
469488
MutuallyExclusiveGroup(

toolchain/mfc/test/test.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,25 @@ def is_uuid(term):
178178
if not cases:
179179
raise MFCException(f"--shard {ARG('shard')} matched zero test cases. Total cases before sharding may be less than shard count.")
180180

181+
if ARG("only_changes"):
182+
import datetime
183+
184+
from .. import common
185+
from .coverage import COVERAGE_MAP_PATH, format_summary, get_changed_files, load_map, select_tests
186+
187+
entries, meta = load_map(COVERAGE_MAP_PATH)
188+
if entries is None:
189+
cons.print("[yellow]Coverage selection: map missing/corrupt — running full suite.[/yellow]")
190+
else:
191+
changed = get_changed_files(common.MFC_ROOT_DIR, ARG("changes_branch"), explicit=ARG("changed_files"))
192+
to_run, to_skip, reason = select_tests(cases, entries, changed)
193+
cons.print(format_summary(ran=len(to_run), total=len(cases), reason=reason, meta=meta, now=datetime.datetime.now(datetime.timezone.utc).isoformat()))
194+
if ARG("select_enforce"):
195+
skipped_cases += to_skip
196+
cases = to_run
197+
else:
198+
cons.print("[dim](shadow mode: running full suite; pass --select-enforce to actually skip)[/dim]")
199+
181200
if ARG("percent") == 100:
182201
return cases, skipped_cases
183202

@@ -208,6 +227,19 @@ def test():
208227

209228
return
210229

230+
if ARG("build_coverage_map"):
231+
from .coverage_build import build_coverage_map
232+
233+
all_cases = [b.to_case() for b in cases]
234+
unique = set()
235+
for case, code in itertools.product(all_cases, [PRE_PROCESS, SIMULATION, POST_PROCESS]):
236+
slug = code.get_slug(case.to_input_file())
237+
if slug not in unique:
238+
build(code, case.to_input_file())
239+
unique.add(slug)
240+
build_coverage_map(common.MFC_ROOT_DIR, all_cases, n_jobs=int(ARG("jobs")))
241+
return
242+
211243
cases, skipped_cases = __filter(cases)
212244
cases = [_.to_case() for _ in cases]
213245
total_test_count = len(cases)

0 commit comments

Comments
 (0)