Visitar URL original
Build and test the full Bazel graph in CI by Evangelink · Pull Request #12470 · microsoft/testfx · GitHub
Skip to content

Build and test the full Bazel graph in CI - #12470

Open
Amaury Levé (Evangelink) wants to merge 4 commits into
mainfrom
dev/amauryleve/bazel-pipelines-build-test-all
Open

Amaury Levé (Evangelink) wants to merge 4 commits into
mainfrom
dev/amauryleve/bazel-pipelines-build-test-all

Conversation

@Evangelink

@Evangelink Amaury Levé (Evangelink) commented Nov 13, 2026 •

Copy link
Copy Markdown
Member

Pull request

Summary

The GitHub Bazel workflow previously built and tested only named aggregates such as //:portable_tests, leaving the analyzer, extension, and full MTP suites outside CI. eng/bazel/validate.ps1 now builds //... and runs every automatic test target uncached on Windows and Linux.

The validation gate requires all queried targets to report their expected outcomes, at least 35 automatic test targets, and an exact allowlist of six unreachable manual negative fixtures. MTP-based tests must produce a fresh, internally consistent TRX with at least one passing result and no failed or unknown outcomes. Twelve analysis/sample/console targets legitimately produce no TRX and are explicitly allowlisted; stale entries and unexpected reports fail validation. Intentional failures, zero-result exits, and mixed-module failure aggregation remain checked.

Making the full graph work required:

  • Retargeting the portable graph to net10.0/net11.0, matching MSBuild's supported frameworks, with per-TFM and Windows-TFM targets reached through their wrappers.
  • Matching native test-host metadata, child probes, OpenTelemetry setup, runtime-relative launches, and writable-output behavior to the MSBuild hosts.
  • Using TEST_TMPDIR as the working directory and short private MTP pipe directories on Unix.
  • Adding aot_publish_test on supported Linux/macOS hosts. Windows NativeAOT remains unsupported by the pinned rules_dotnet; Windows-only platform-services tests are skipped on Linux.
  • Fixing TelemetryManager to create the sentinel directory through its injected IFileSystem; preserving the assertions in impersonation tests while reporting Inconclusive when the host lacks the required privilege; and removing the obsolete CancelledTestNodeStateProperty arm from the sample.
  • Fixing two failures found on hosted runners: Bazel's case-sensitive environment inheritance now accepts both uppercase and mixed-case Windows ProgramFiles names; package validation now expects one self-contained publisher per supported framework rather than the obsolete count of four.

The shipping Arcade pipeline is unchanged. The experimental Bazel workflow remains optional/non-required, watches samples/**, and has a 90-minute job timeout.

Design and decision record

The maintained Bazel decision record records the contract, failing baseline, alternatives, validation matrix, and hosted follow-up repairs. Usage documentation describes the gates and supported scope.

The manual-target query is intentionally unconfigured: it proves reachability across select() branches, not execution of every branch. Test applications run on net10.0; //:managed_all builds the product graph for net10.0 and net11.0. Host-incompatible targets are explicit rather than inferred. The Azure DevOps definition azure-pipelines-bazel.yml is still not registered in dnceng-public; registration requires an administrator and is outside this PR.

Demonstration

No UI/layout is changed. The successful hosted run and its bazel-windows-latest / bazel-ubuntu-latest artifacts provide executable evidence, validation manifests, logs, and reports rather than screenshots.

Validation and regression proof

Final hosted validation passed for head 624fed4b5ae70fb3810f93722c3e597ee83f5fa3. Run 43501140825 completed successfully on both Windows and Ubuntu. Its checkout was PR merge 994d6e938fc9a4bb05c2a3377f32583440fe40cf, whose parents were base 548d3bfc1567fe0aa3663d8dacbe78ab33cedf6e and that exact head. Both uploaded artifact sets were downloaded and their manifests inspected.

Toolchain: Bazel 9.1.1 and rules_dotnet SDK 11.0.100-rc.3.26522.148.

Requirement Command / evidence Result
Complete Windows graph ./eng/bazel/validate.ps1 Exit 0; 35 automatic targets accounted for: 34 passed, only //:aot_publish_test host-skipped. All 22 TRX reporting targets present: 126,991 passed, 40 not executed, no failures.
Complete Linux graph, including NativeAOT ./eng/bazel/validate.ps1 Exit 0; 35 automatic targets accounted for: 34 passed, only //:platform_services_tests host-skipped. All 22 TRX reporting targets present: 125,422 passed, 136 not executed, no failures. //:aot_publish_test passed.
Native package and self-contained consumers on both hosts ./eng/bazel/validate-packages.ps1 Exit 0 on both hosts. Three aligned 3.0.0-preview.bazel packages, net10.0/net11.0 consumers, and both self-contained runtime layouts validated. Pass/failure/empty selections returned 0/2/9 as required.
Expanded Windows/compatibility matrix ./eng/bazel/windows/validate.ps1 -ArtifactsDirectory "$env:GITHUB_WORKSPACE/artifacts/bazel-validation/windows-expanded" Exit 0; compatibility and Windows libraries, five consumers, and four additional unit suites passed.
Workflow contracts and action pins python .github/scripts/test_bazel_cache.py; python .github/scripts/check_action_pins.py Local exit 0 for both: 14 contract tests passed; 2,769 action references audited across 60 files.

Both full-graph manifests record the expected exits for all 14 steps: 0 for build/cached-build/queries/all-tests/discovery/reports/provenance; 2 for the failing-test probe; 9 for empty selection; 3 for mixed results; and 1 for each reference-alias negative.

Additional local confirmation for the final repair: pwsh -NoLogo -NoProfile -File eng/bazel/validate.ps1 -Jobs 4 -EvidenceRoot <dir> passed with mixed-case Windows installation-path variables, including all 3,050 passing analyzer cases and one conditional skip. The corresponding package and expanded-Windows validators also passed locally.

Historical validation at 63f0c0e7bd730bbd67ebce7b2c8bbebd1d2b006d, based on bb99b2c77543888679b8db19ae926d9f7962a0e8, is retained in the decision record: full local Windows/WSL graph runs passed; MSBuild compiled the affected projects; changed test classes passed with platform 114 passed/2 Inconclusive, extensions 74 passed, and generator continuation tests 10 passed/1 conditional skip. These earlier results are not presented as executions at the final head.

Remaining boundaries: macOS is not in the workflow matrix; Windows NativeAOT is unsupported upstream; expanded Windows library validation does not exercise app registration or XAML compilation. Required review and any still-running non-Bazel Azure checks remain separate merge gates. This PR has not been merged.

Test-value evidence

  • Product regression, earlier revision 63f0c0e7bd730bbd67ebce7b2c8bbebd1d2b006d: --filter FullyQualifiedName~TelemetryManagerTests on net10.0. Restoring Directory.CreateDirectory produced exit 2, 14/15 passed, with TelemetryManager_SentinelIsWrittenPerUserAndAvoidsShowingNoticeOnSubsequentRuns failing its expected IFileSystem.CreateDirectory invocation. Restoring the fix produced exit 0, 15/15 passed. This paired run was not repeated for later unrelated launcher changes; the full final-head platform suite passed in CI.
  • Workflow contract: python .github/scripts/test_bazel_cache.py with the base validator made test_validation_builds_and_tests_the_full_graph fail both build and test subtests (exit 1). The changed validator passed all 14 tests; the final-head contract run also passed. The full hosted graph provides execution evidence beyond this static wiring contract.
  • Windows launcher repair, parent bf07eed116fa73aace608716c59a54059e19a7b8 to final head: pwsh -NoLogo -NoProfile -File eng/bazel.ps1 test //:analyzer_tests --nocache_test_results --test_arg=--filter --test_arg=FullyQualifiedName~AssertionArgsShouldAvoidConditionalAccessAnalyzerTests --jobs=4 --noshow_progress. With mixed-case ProgramFiles/ProgramFiles(x86) variables, the old rule failed all 11 selected cases during NuGet initialization (Bazel exit 3). The repaired rule executed and passed all 11 (exit 0), and uppercase variables also passed all 11. This is launcher/setup failure-and-recovery evidence, not an analyzer behavioral red assertion. The full final-head analyzer suite also passed on both hosted platforms.
  • Publisher matrix repair: pre-fix run 43497565692 built the native publishers successfully, then failed the obsolete four-publisher assertion. The final-head package validator passed on both hosts, preserving the cardinality and unique-framework checks and executing each real staged runtime with 0/2/9 outcomes.
  • Host parity and impersonation: MSBuild behavior remains preserved except that unavailable impersonation privilege produces Inconclusive instead of a false failure. Assertions remain intact. No paired assertion-based red/green claim is made for that capability gate.

The GitHub Bazel workflow built and tested named aggregates, so analyzer,
extension and full Microsoft.Testing.Platform suites and any new test target
went unexercised. eng/bazel/validate.ps1 now builds //... and runs every
automatic test uncached on Windows and Linux, with guards against silent
coverage loss: per-target PASSED outcomes with explicit host skips, a test-count
floor, an exact allowlist of unreachable manual targets, strict TRX checks, and
asserted failures for the reference-alias negatives.

Making //... green required:
- Retargeting portable Bazel frameworks to net10.0/net11.0 to match MSBuild,
  and tagging per-TFM and Windows-TFM targets manual behind their wrappers.
- Native host parity with the MSBuild test projects (assembly configuration,
  child probes, OpenTelemetry/SDK version stamping, runtime-relative child
  launches, read-only output handling).
- Linux sandbox fixes: TEST_TMPDIR working directory and a short private MTP
  pipe directory.
- NativeAOT publish and a new aot_publish_test, limited to Linux/macOS.
- TelemetryManager now creates the sentinel directory through IFileSystem.
- Named-pipe impersonation tests report Inconclusive when the host lacks
  SeImpersonatePrivilege.
- Removing the obsolete CancelledTestNodeStateProperty arm from a sample.

Validated with eng/bazel/validate.ps1 on Windows and Linux; evidence is in
docs/decisions/bazel-build.md.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings November 13, 2026 19:39
@github-actions github-actions Bot added the state/needs-review Awaiting review from the team. label Nov 13, 2026

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧪 Test quality review — PR #12470

Compared merge base bb99b2c77543888679b8db19ae926d9f7962a0e8 with head 63f0c0e7bd730bbd67ebce7b2c8bbebd1d2b006d. Evidence applies to this head, not every intermediate commit. This review was static only; no code was built or run.

Test-value evidence

Contract Test / data case and decisive assertion Counterfactual Evidence
TelemetryManager creates the sentinel directory through the injected IFileSystem TelemetryManagerTests.TelemetryManager_SentinelIsWrittenPerUserAndAvoidsShowingNoticeOnSubsequentRuns: fileSystemMock.Verify(f => f.CreateDirectory(Path.GetDirectoryName(path)!), Times.Once) Reverting to Directory.CreateDirectory leaves the mock with 0 calls, so the verify fails Static prediction: would fail on the pre-fix code and pass with the fix. The PR description reports a red/green run (14 of 15 passed without the fix, 15 of 15 with it). That is an author claim, and no matching execution records were accessible to me.
Bazel version stamping (TestFx.NETCoreSdkVersion) BuildToolsTests.Metadata_UsesVersionTemplateAndBuildStamp: exact raw-string comparison of the generated metadata, including the new AssemblyMetadata line Dropping the new argument or attribute changes the generated text Static prediction: would fail without the change.
Bazel TFM retargeting to net10.0/net11.0 SdkPackageTests.Generate_MetaPackagePreservesDependencyAndAssetFlow: sequence assertions on dependency groups and lib/<tfm>/_._ files A generator that still emits net8.0/net9.0 fails the sequence checks Static prediction.
Sandbox-safe test infrastructure (temp directories, read-only copies, Bazel probing paths, --results-directory, WaitForStartAsync) CommandLineTests, AzureDevOpsHistoryServiceTests, SystemWrappersTests, GlobalConfigGeneratorContinuationTests, TestFxOpenTelemetryTests, MicrosoftExtensionsHostingExtensionsTests Behavior-preserving for MSBuild runs, so these tests should pass before and after Not applicable as a red-phase proof. The PR reports passing runs of the changed classes under MSBuild and Bazel, which I could not verify here.
Named-pipe impersonation tests report Inconclusive without SeImpersonatePrivilege NamedPipeServerSecurityTests (two tests) The assertions are unchanged; only the outcome on unprivileged hosts changes, from failed to Inconclusive Not applicable: the effect is host-dependent and has no executable counterfactual.
Bazel workflow, .bzl, PowerShell and Python files; sample CustomReportExtension .github/scripts/test_bazel_cache.py covers the workflow contract. The PR reports it failing against the base revision's validate.ps1. n/a Build and configuration changes. Not assessed beyond that script (unassessed: .bzl and .ps1 logic). The sample change removes a match on an obsolete property.

🧵 Parallel safety

The parallel-safety-reviewer specialist returned STATUS: CLEAN from source review only; the analyzer was not run.

Test assembly Scope Workers
Microsoft.Testing.Platform.UnitTests MethodLevel 0 (all cores)
Microsoft.Testing.Extensions.UnitTests MethodLevel 0 (all cores)
MSTest.Analyzers.UnitTests No assembly-level [Parallelize] found n/a
Bazel.BuildTools.UnitTests No assembly-level [Parallelize] found n/a
Bazel.SdkPackages.UnitTests No assembly-level [Parallelize] found n/a

Findings: 0 (Critical=0, High=0, Warning=0, Info=0). The changed tests either move to unique per-test paths or add no shared mutable state.

  • CommandLineTests now writes response files into a unique GUID temp directory per call.
  • AzureDevOpsHistoryServiceTests writes GUID-named quarantine files under the temp path.
  • TestFxOpenTelemetryTests points --results-directory at the per-test TestContext.TestTempDirectory.
  • TelemetryManagerTests uses a mocked file system.
  • The NamedPipeServerSecurityTests and SystemWrappersTests changes add no shared state.

Per-test assessment

Pseudo-mutation evidence below consists of static predictions, not executed mutation results. Production context for the grading rows was read from the diff, and I did not run the grade-tests or test-gap-analysis skills, so the grades are my own judgment against the repository conventions.

Result Quality Test Notes How to improve
Pass A (90–100) mod TelemetryManagerTests.TelemetryManager_SentinelIsWrittenPerUserAndAvoidsShowingNoticeOnSubsequentRuns The new verify pins the injected CreateDirectory call on the expected directory. None
Pass A (90–100) mod BuildToolsTests.Metadata_UsesVersionTemplateAndBuildStamp An exact raw-string comparison includes the new SDK-version metadata line. None
Pass B (80–89) mod SdkPackageTests.Generate_MetaPackagePreservesDependencyAndAssetFlow Sequence assertions cover the retargeted TFM groups and files. None
Pass B (80–89) mod CommandLineTests.ParserTests Behavior is unchanged; the response-file path rewriting adds helper complexity. None
Pass B (80–89) mod CommandLineTests.Parser_NestedResponseFiles_ProvidesExpandedArgumentsForProcessRelaunch Uses a temp directory and quoted @ references, and the assertion is unchanged. None
Pass B (80–89) mod CommandLineTests.Parser_RecursiveResponseFile_ReturnsError The recursion error is still asserted, now from an isolated directory. None
Pass B (80–89) mod AzureDevOpsHistoryServiceTests.QuarantineFile_IgnoresCommentsAndBlanksAndMatchesGlobsCaseSensitively Only the file location changed, and the assertions are unchanged. None
Pass B (80–89) mod AzureDevOpsHistoryServiceTests.Reporter_AnnotatesQuarantinedFailuresAndEmitsBuildTagOnceAsync Only the file location changed, and the assertions are unchanged. None
Pass B (80–89) mod MicrosoftExtensionsHostingExtensionsTests.RunTestingPlatformAsync_WhenCancellationTokenIsCancelled_Cancels... WaitForStartAsync surfaces an early run failure instead of hanging. None
Pass B (80–89) mod MicrosoftExtensionsHostingExtensionsTests.RunTestingPlatformAsync_WhenHostStops_CancelsActiveMtpRun Same start-wait guard. None
Pass B (80–89) mod TestFxOpenTelemetryTests.RepositoryTestHost_PreservesResultsAndPersistsOnlyWhenEnabled The child process is isolated through --results-directory, and the assertions are unchanged. None
Pass B (80–89) mod GlobalConfigGeneratorContinuationTests.ActualAnalyzerAssemblyProducesAllFourModeConfigurations The configuration-folder check is skipped under Bazel, and the other assertions are retained. None
Pass B (80–89) mod NamedPipeServerSecurityTests.CreateServerStream_AnUnauthorizedIdentityCannotConnect The Inconclusive guard only applies when impersonation is downgraded. None
Pass B (80–89) mod NamedPipeServerSecurityTests.CreateServerStream_AnAppContainerConnectsOnlyWhenItsOwnPackageIsAuthorized Downgraded candidates are skipped, and Inconclusive is reported only if all are downgraded. None

Other changed tests (SystemWrappersTests child-process helpers and the remaining GlobalConfigGeneratorContinuationTests helpers) were reviewed as helper changes rather than graded methods.

No inline comments were posted. I found no novel, verified, actionable defect, and no existing review threads needed deduplication.

<sub>This advisory review is heuristic and non-blocking.

Re-run the combined review with /review-tests, or only the parallel-safety specialist with /parallel-audit.</sub>

🤖 Automated content by GitHub Copilot. Generated by the Test Quality Review on PR (on open / sync) workflow. · copilot · auto · ~66 AIC · ⌖ ~1 AIC · ⊞ 8.1K

@microsoft-github-policy-service microsoft-github-policy-service Bot added state/needs-review Awaiting review from the team. and removed state/needs-review Awaiting review from the team. labels Nov 13, 2026
@github-actions github-actions Bot added state/needs-review Awaiting review from the team. and removed state/needs-review Awaiting review from the team. labels Nov 13, 2026

Copilot AI commented Nov 13, 2026

Copy link
Copy Markdown
Contributor

One or more custom setup steps configured for this repository failed during this Copilot code review run:

Build the repository

Setup steps run before each review. If the review above is missing context, or no review was posted at all, the failing step above may be the cause. See the workflow run for failure details, fix your setup steps configuration, and re-request a review.

Note

You can configure setup steps for Copilot code review separately from Copilot cloud agent with a copilot-code-review.yml file. Read the docs for details.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🟡 Changes recommended

Critical validation gaps allow malformed or missing TRX reports to pass and count unselected framework targets as built, undermining the strict validation gate.

3 open issues
What changed in this PR

This PR expands the optional Bazel CI workflow from named test subsets to the full automatic graph for MSTest and Microsoft.Testing.Platform. The shipping Arcade pipeline remains unchanged.

Changes:

  • Builds and tests //..., adding target-count, outcome, manual-target and report-validation guards.
  • Aligns Bazel with .NET 10/11 and fixes test-host metadata, child processes and sandbox compatibility.
  • Adds NativeAOT execution coverage on supported hosts, fixes telemetry filesystem abstraction use, and updates documentation.

Test-value evidence: For revision 63f0c0e7bd730bbd67ebce7b2c8bbebd1d2b006d, the PR reports Windows/Linux validation and red/green checks for telemetry and workflow selection. Static inspection supports those tests’ intended sensitivity; execution was not independently verified. GitHub-hosted and macOS validation remain gaps.

File Description
test/​UnitTests/​MSTest.Analyzers.UnitTests/​GlobalConfigGeneratorContinuationTests.cs Supports Bazel’s generator location and read-only outputs.
test/​UnitTests/​Microsoft.Testing.Platform.UnitTests/​Telemetry/​TelemetryManagerTests.cs Verifies directory creation through the injected filesystem.
test/​UnitTests/​Microsoft.Testing.Platform.UnitTests/​IPC/​NamedPipeServerSecurityTests.cs Reports unusable impersonation as Inconclusive.
test/​UnitTests/​Microsoft.Testing.Platform.UnitTests/​Helpers/​SystemWrappersTests.cs Uses runtime-relative child launches and forwards dependency probes.
test/​UnitTests/​Microsoft.Testing.Platform.UnitTests/​CommandLine/​CommandLineTests.cs Isolates response files in temporary directories.
test/​UnitTests/​Microsoft.Testing.Extensions.UnitTests/​TestFxOpenTelemetryTests.cs Adjusts child working and results directories for Bazel.
test/​UnitTests/​Microsoft.Testing.Extensions.UnitTests/​MicrosoftExtensionsHostingExtensionsTests.cs Surfaces early host failures while awaiting startup.
test/​UnitTests/​Microsoft.Testing.Extensions.UnitTests/​AzureDevOpsHistoryServiceTests.cs Moves quarantine fixtures to temporary storage.
test/​UnitTests/​Bazel.SdkPackages.UnitTests/​SdkPackageTests.cs Updates package expectations to .NET 10/11.
test/​UnitTests/​Bazel.BuildTools.UnitTests/​BuildToolsTests.cs Checks SDK-version metadata generation.
src/​Platform/​Microsoft.Testing.Platform/​Telemetry/​TelemetryManager.cs Creates the sentinel directory through IFileSystem.
samples/​public/​mstest-runner/​CustomReportExtension/​CustomReportExtension/​TestResultConsoleReporter.cs Removes the cancellation-state match retired by #12322.
MODULE.bazel.lock Removes the unused Windows SDK package hash.
eng/​bazel/​windows/​windows.MODULE.bazel Drops the obsolete SDK repository import.
eng/​bazel/​windows/​validate.ps1 Updates Windows consumer framework expectations.
eng/​bazel/​windows/​validate-app-model.ps1 Selects .NET 10/11 controllers.
eng/​bazel/​windows/​targeting_tests.bzl Pins Windows analysis probes to win-x64.
eng/​bazel/​windows/​paket.lock Removes the obsolete Windows SDK dependency group.
eng/​bazel/​windows/​paket.dependencies Removes the corresponding SDK declaration.
eng/​bazel/​windows.bzl Updates Windows frameworks and tags configuration-specific targets.
eng/​bazel/​verify-engineering-sdk.ps1 Restricts verification to .NET 10/11.
eng/​bazel/​validate.ps1 Adds full-graph execution and validation guards.
eng/​bazel/​validate-sdk-packages.ps1 Updates the SDK-package framework matrix.
eng/​bazel/​validate-packages.ps1 Updates the MTP-package framework matrix.
eng/​bazel/​validate-mstest-packages.ps1 Updates the MSTest-package framework matrix.
eng/​bazel/​tests.bzl Aligns unit-test hosts, metadata and linked helpers.
eng/​bazel/​TestMain.cs Enables MTP child-process probes.
eng/​bazel/​test-engineering-sdk-verifier.ps1 Adjusts verifier fixtures for two frameworks.
eng/​bazel/​test-assets.bzl Passes tool paths and shared launcher setup to published tests.
eng/​bazel/​server-client.bzl Retargets the modern client validation assembly.
eng/​bazel/​SdkPackageTool.cs Updates experimental package scope text.
eng/​bazel/​samples.bzl Retargets samples and adds the NativeAOT test.
eng/​bazel/​RuntimeProvenance.cs Removes obsolete runtime expectations.
eng/​bazel/​reference-alias-tests.bzl Retargets reference-alias fixtures to .NET 10.
eng/​bazel/​PortableTestFrameworkMetadata.cs Updates framework metadata and stamps assembly configuration.
eng/​bazel/​packages.bzl Routes configuration-specific publishes through their wrapper.
eng/​bazel/​NativeUnitTestMain.cs Adds analyzer probes and repository OpenTelemetry setup.
eng/​bazel/​mstest-packages.bzl Uses the .NET 10-and-later transitive build asset.
eng/​bazel/​extra-tests.bzl Marks per-framework server-client publishes manual.
eng/​bazel/​extension-tests.bzl Enables repository telemetry and SDK metadata.
eng/​bazel/​defs.bzl Updates frameworks, metadata, tag propagation and launchers.
eng/​bazel/​compatibility.bzl Retargets compatibility consumers to .NET 10.
eng/​bazel/​BuildTools.cs Generates optional SDK-version assembly metadata.
eng/​bazel/​analyzer-tests.bzl Configures child probes and the published generator tool.
docs/​decisions/​bazel-build.md Records full-graph decisions, validation and limitations.
docs/​bazel.md Documents the revised graph and CI behavior.
.github/​workflows/​bazel.yml Broadens sample triggers and increases the timeout.
.github/​scripts/​test_bazel_cache.py Checks full-graph commands and uncached test execution.

Review effort: Balanced

Comment thread eng/bazel/validate.ps1 Resolved
Comment thread eng/bazel/validate.ps1 Resolved
Comment thread eng/bazel/validate.ps1 Resolved
@microsoft-github-policy-service microsoft-github-policy-service Bot added state/needs-review Awaiting review from the team. and removed state/needs-review Awaiting review from the team. labels Nov 13, 2026
@github-actions github-actions Bot added needs/merge-conflict-resolution PR has merge conflicts that must be resolved. and removed state/needs-review Awaiting review from the team. labels Nov 13, 2026
@microsoft-github-policy-service microsoft-github-policy-service Bot added the state/needs-review Awaiting review from the team. label Nov 13, 2026
@github-actions github-actions Bot added needs/merge-conflict-resolution PR has merge conflicts that must be resolved. and removed needs/merge-conflict-resolution PR has merge conflicts that must be resolved. state/needs-review Awaiting review from the team. labels Nov 13, 2026
…pipelines-build-test-all

# Conflicts:
#	eng/bazel/test-engineering-sdk-verifier.ps1
- Require a fresh tests.trx for every expected non-skipped test, with an
  explicit allowlist for tests that do not produce TRX (Starlark analysis
  tests and samples with their own entry point). Reject allowlisted tests
  that unexpectedly write a TRX and stale allowlist entries.
- Accept a TRX only when every result is Passed or NotExecuted, at least
  one test passed, and the summary counters match the results.
- Clarify that the unconfigured reachability query does not imply every
  framework-selected test app is built.
- Fix IDE0046 in NamedPipeServerSecurityTests for Release builds.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings November 13, 2026 20:00
@github-actions github-actions Bot added state/needs-review Awaiting review from the team. and removed needs/merge-conflict-resolution PR has merge conflicts that must be resolved. labels Nov 13, 2026
@microsoft-github-policy-service microsoft-github-policy-service Bot added state/needs-review Awaiting review from the team. and removed state/needs-review Awaiting review from the team. labels Nov 13, 2026
@github-actions github-actions Bot added state/needs-review Awaiting review from the team. and removed state/needs-review Awaiting review from the team. labels Nov 13, 2026
@microsoft-github-policy-service microsoft-github-policy-service Bot added the state/needs-review Awaiting review from the team. label Nov 13, 2026
@github-actions github-actions Bot added state/needs-review Awaiting review from the team. and removed state/needs-review Awaiting review from the team. labels Nov 13, 2026
@microsoft-github-policy-service microsoft-github-policy-service Bot added state/needs-review Awaiting review from the team. and removed state/needs-review Awaiting review from the team. labels Nov 13, 2026
@github-actions github-actions Bot added state/needs-review Awaiting review from the team. and removed state/needs-review Awaiting review from the team. labels Nov 13, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔵 Needs a closer look

The expanded cross-platform CI graph and native launcher changes lack hosted-run artifacts matching the final changes, so a maintainer must verify both Windows and Linux jobs.

No open issues 🎉

3 resolved since last review

Review effort: Balanced

Preserve Windows ProgramFiles environment spelling for analyzer tests and validate one publisher per supported framework.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Copilot AI balanced review requested due to automatic review settings November 13, 2026 20:23
@github-actions github-actions Bot added state/needs-review Awaiting review from the team. and removed state/needs-review Awaiting review from the team. labels Nov 13, 2026

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧪 Test quality review — PR #12470

Compared merge base 548d3bfc1567fe0aa3663d8dacbe78ab33cedf6e with head 624fed4b5ae70fb3810f93722c3e597ee83f5fa3. Evidence applies to this head, not every intermediate commit. Static analysis only; no code was built or run. Existing-review lookup was unavailable, so earlier reports were not deduplicated.

Test-value evidence

Contract Test / data case and decisive assertion Counterfactual Evidence
TelemetryManager creates the sentinel directory via injected IFileSystem TelemetryManagerTests.TelemetryManager_SentinelIsWrittenPerUserAndAvoidsShowingNoticeOnSubsequentRuns: fileSystemMock.Verify(f => f.CreateDirectory(Path.GetDirectoryName(path)!), Times.Once) Reverting to Directory.CreateDirectory leaves the mock with 0 invocations, so the new Verify fails Static prediction: killed. The PR description reports a red/green run, which this workflow could not confirm.
Bazel metadata stamps TestFx.NETCoreSdkVersion BuildToolsTests.Metadata_UsesVersionTemplateAndBuildStamp: exact raw-string comparison of generated output Omitting the new attribute would change the exact output Static prediction: killed
Portable TFMs are narrowed to net10.0/net11.0 SdkPackageTests.Generate_MetaPackagePreservesDependencyAndAssetFlow: AreSequenceEqual on dependency groups and files Wrong TFM set in the generator would fail Static prediction: killed
Test-infrastructure changes (temp directories, probing paths, read-only copies, Inconclusive on hosts without SeImpersonatePrivilege, start-wait helper) CommandLineTests, SystemWrappersTests, NamedPipeServerSecurityTests, MicrosoftExtensionsHostingExtensionsTests, AzureDevOpsHistoryServiceTests, TestFxOpenTelemetryTests, GlobalConfigGeneratorContinuationTests Behavior-preserving. Assertions are unchanged and the tests are expected to pass before and after. Not applicable for red/green. Unverified; there are no accessible execution records for these revisions.
Bazel workflow, .bzl and .ps1 validators, docs, sample reporter .github/scripts/test_bazel_cache.py (not a C# test) Not assessed Unassessed. The PR reports the Python test red before and 14 OK after, but this review has no execution record.

🧵 Parallel safety

Status: CLEAN. No findings (Critical=0, High=0, Warning=0, Info=0).

Test assembly Scope Workers Analyzer coverage
Microsoft.Testing.Platform.UnitTests Changed tests only; no config change Not determined Not run (read-only)
Microsoft.Testing.Extensions.UnitTests Changed tests only Not determined Not run
MSTest.Analyzers.UnitTests Changed tests only Not determined Not run
Bazel.BuildTools.UnitTests, Bazel.SdkPackages.UnitTests Changed tests only Not determined Not run

The moves to unique Path.GetTempPath() and per-test GUID directories and to TestContext.TestTempDirectory remove shared working-directory paths. Impersonation is reverted in finally, and the pipe names are GUIDs.

Per-test assessment

Pseudo-mutation evidence below consists of static predictions, not executed mutation results.

Result Quality Test Notes How to improve
Pass A (90–100) mod TelemetryManagerTests.TelemetryManager_SentinelIsWrittenPerUserAndAvoidsShowingNoticeOnSubsequentRuns The new Verify pins the injected CreateDirectory call with an exact path. None
Pass A (90–100) mod BuildToolsTests.Metadata_UsesVersionTemplateAndBuildStamp An exact raw-string comparison covers the new SDK version attribute. None
Pass B (80–89) mod SdkPackageTests.Generate_MetaPackagePreservesDependencyAndAssetFlow Sequence assertions cover the new TFM set; the rest is unchanged. None
Pass B (80–89) mod CommandLineTests.ParserTests Per-test temp directory with an exact result comparison; the helper adds some indirection. None
Pass B (80–89) mod CommandLineTests.Parser_NestedResponseFiles_ProvidesExpandedArgumentsForProcessRelaunch The isolated directory keeps the existing expanded-argument assertions meaningful. None
Pass B (80–89) mod CommandLineTests.Parser_RecursiveResponseFile_ReturnsError The isolated directory is cleaned up; the error assertion is unchanged. None
Pass B (80–89) mod AzureDevOpsHistoryServiceTests.QuarantineFile_IgnoresCommentsAndBlanksAndMatchesGlobsCaseSensitively Only the file location changed; the behavior assertions are intact. None
Pass B (80–89) mod AzureDevOpsHistoryServiceTests.Reporter_AnnotatesQuarantinedFailuresAndEmitsBuildTagOnceAsync Only the file location changed. None
Pass B (80–89) mod MicrosoftExtensionsHostingExtensionsTests.RunTestingPlatformAsync_WhenCancellationTokenIsCancelled_Cancels... and ...WhenHostStops_CancelsActiveMtpRun The new helper fails fast instead of hanging; the cancellation assertions are unchanged. None
Pass B (80–89) mod TestFxOpenTelemetryTests.RepositoryTestHost_PreservesResultsAndPersistsOnlyWhenEnabled The working directory and results directory are made deterministic. None
Pass B (80–89) mod GlobalConfigGeneratorContinuationTests.ActualAnalyzerAssemblyProducesAllFourModeConfigurations The configuration check is skipped for the Bazel tool, but the output assertions remain. None
Pass B (80–89) mod NamedPipeServerSecurityTests.CreateServerStream_AnUnauthorizedIdentityCannotConnect Inconclusive is raised only when impersonation is downgraded, and the assertion is unchanged. None
Pass B (80–89) mod NamedPipeServerSecurityTests.CreateServerStream_AnAppContainerConnectsOnlyWhenItsOwnPackageIsAuthorized... Downgraded candidates are skipped, and Inconclusive is raised only when all of them are downgraded. None

No inline comments were published. The only residual risk is that the two Inconclusive paths could mask a real regression on unprivileged hosts, which the PR documents as intentional.

<sub>This advisory review is heuristic and non-blocking.

Re-run the combined review with /review-tests, or only the parallel-safety specialist with /parallel-audit.</sub>

🤖 Automated content by GitHub Copilot. Generated by the Test Quality Review on PR (on open / sync) workflow. · copilot · auto · ~61 AIC · ⌖ ~1 AIC · ⊞ 8.1K

@microsoft-github-policy-service microsoft-github-policy-service Bot added state/needs-review Awaiting review from the team. and removed state/needs-review Awaiting review from the team. labels Nov 13, 2026
@github-actions github-actions Bot added state/needs-review Awaiting review from the team. and removed state/needs-review Awaiting review from the team. labels Nov 13, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔵 Needs a closer look

The cross-host launcher and packaging repairs still lack completed hosted Windows/Linux Bazel validation, including expanded Windows checks, after earlier host-specific failures.

No open issues 🎉

Review effort: Balanced

@microsoft-github-policy-service microsoft-github-policy-service Bot added state/needs-review Awaiting review from the team. and removed state/needs-review Awaiting review from the team. labels Nov 13, 2026
@github-actions github-actions Bot added state/needs-review Awaiting review from the team. and removed state/needs-review Awaiting review from the team. labels Nov 13, 2026
@microsoft-github-policy-service microsoft-github-policy-service Bot added state/needs-review Awaiting review from the team. and removed state/needs-review Awaiting review from the team. labels Nov 13, 2026
@github-actions github-actions Bot added state/approved Proposal approved; ready for implementation. and removed state/needs-review Awaiting review from the team. labels Nov 13, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Final test-triage resolution — Azure Pipelines build 1680475

Build 1680475 (check microsoft.testfx, result: succeeded) was analyzed in full mode.

Failed records (6, all in the Windows_App_Model_Diagnostics_Attempt1 artifact):

  • NativeTests.Outcome: 4 records with the message "expected host failure".
  • WinUIMtpPackagedApp.UnitTest1.RetryFailsFirstAttempt: the first retry attempt fails on purpose.
  • PackagedWinUI.PackagedWinUITestCases.RetryTestMethod_PassesOnSecondAppContainerHost: the first AppContainer host fails on purpose.

All 6 are in acceptance-test probe assets that exercise failure and retry behavior, and the build still succeeded. I treat them as expected outcomes, not product defects. No test was flagged flaky, and there were no crash or hang diagnostics, timeline signals or slow-test regressions.

Confidence: medium-high that nothing here needs action.

Inconclusive: evidence collection was incomplete (evidenceIncomplete=true). One artifact download failed and the download budget was exhausted, so I can't say the remaining tests are clean.

Next step: none, unless a different leg fails. If a required leg shows a real failure, rerun the build.

No issue was created, because nothing met the durable-issue thresholds.

🤖 Automated content by GitHub Copilot. Generated by the Pipeline Test Triage workflow. · copilot · auto · ~27 AIC · ⌖ ~1 AIC · ⊞ 10.1K

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

state/approved Proposal approved; ready for implementation.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants