From 4cff9e324831697d4570916f15936d2a8069368d Mon Sep 17 00:00:00 2001 From: Dylan Frankland Date: Tue, 18 Aug 2026 11:49:17 -0700 Subject: [PATCH] test(xcresult): real bundles reproducing dependency misattribution The file sources have only synthesized-JSON unit tests behind them, and the one real SnapshotTesting bundle does not reproduce the bug: `assertSnapshot` defaults `filePath` to `#filePath` at the call site, so its `fileName` already points at the test's own source and the fixture passes with or without the fix. `tests/fixture-src/` holds five SwiftPM packages, one per shape, plus the script that captures and checks them. Each bundle is verified to exhibit its shape before it is packaged, since a fixture that stops reproducing keeps passing while guarding nothing. Each test names the `FileSource` it exercises: - `dependency-raises-failure` every source but `TestFrame` is under `SourcePackages/checkouts/` - `in-repo-helper-raises-failure` `TestFrame` versus `RaisedFrom` with nothing to separate them by path - `crash-in-dependency` two tests that never reach their own frame: one `fatalError`s inside the dependency, one is failed by the dependency's `TestScoping` trait after its body returned - `objc-xctest` `TestIdentity::is_named_by` against real `-[Suite testCase]` symbolication - `toplevel-swift-testing` a suiteless `@Test func`, matched by bare name Reverting the fix fails seven of the ten new cases, on exactly the paths it was written to stop reporting. The experimental and legacy cases expect different JUnit, which is the honest result rather than a shared snapshot: only the experimental path reads the failure summary, so it is the only one that can produce a `TestFrame` candidate. Bundles are pruned before packaging. Xcode 26 writes ~95MB of unreferenced dyld shared-cache symbolication data into every result bundle, which would have made these 96MB apiece; `prune-bundle.py` keeps only what the object graph reaches (9-11 objects out of ~1570 files) and regeneration fails if either xcresulttool API we call returns anything different afterwards. Co-Authored-By: Claude Opus 5 --- .../data/test-crash-in-dependency.junit.xml | 13 ++ .../test-crash-in-dependency.xcresult.tar.gz | Bin 0 -> 47055 bytes .../test-dependency-raises-failure.junit.xml | 8 + ...dependency-raises-failure.legacy.junit.xml | 8 + ...-dependency-raises-failure.xcresult.tar.gz | Bin 0 -> 30491 bytes ...st-in-repo-helper-raises-failure.junit.xml | 8 + ...epo-helper-raises-failure.legacy.junit.xml | 8 + ...repo-helper-raises-failure.xcresult.tar.gz | Bin 0 -> 27686 bytes .../tests/data/test-objc-xctest.junit.xml | 8 + .../data/test-objc-xctest.legacy.junit.xml | 8 + .../data/test-objc-xctest.xcresult.tar.gz | Bin 0 -> 29488 bytes .../test-toplevel-swift-testing.junit.xml | 8 + ...st-toplevel-swift-testing.legacy.junit.xml | 8 + ...est-toplevel-swift-testing.xcresult.tar.gz | Bin 0 -> 27586 bytes xcresult/tests/fixture-src/.gitignore | 7 + xcresult/tests/fixture-src/README.md | 94 +++++++++ .../Dependency/Package.swift | 13 ++ .../Sources/FixtureSupport/Crash.swift | 4 + .../FixtureSupport/TeardownFailureTrait.swift | 28 +++ .../crash-in-dependency/Package.swift | 18 ++ .../CrashInDependencyTests.swift | 11 + .../TeardownFailureTests.swift | 12 ++ .../Dependency/Package.swift | 13 ++ .../FixtureSupport/FixtureSupport.swift | 19 ++ .../dependency-raises-failure/Package.swift | 20 ++ .../DependencyRaisesFailureTests.swift | 14 ++ .../fixture-src/dump-failure-summaries.py | 148 +++++++++++++ .../Package.swift | 10 + .../FailureHelper.swift | 15 ++ .../InRepoHelperRaisesFailureTests.swift | 11 + .../fixture-src/objc-xctest/Package.swift | 10 + .../Tests/ObjcXCTestTests/FailureHelper.m | 11 + .../Tests/ObjcXCTestTests/ObjcXCTestTests.m | 14 ++ .../ObjcXCTestTests/include/FailureHelper.h | 5 + xcresult/tests/fixture-src/prune-bundle.py | 136 ++++++++++++ xcresult/tests/fixture-src/regenerate.sh | 141 +++++++++++++ .../toplevel-swift-testing/Package.swift | 10 + .../FailureHelper.swift | 13 ++ .../ToplevelSwiftTestingTests.swift | 8 + .../fixture-src/verify-failure-summaries.py | 195 ++++++++++++++++++ xcresult/tests/xcresult.rs | 166 +++++++++++++++ 41 files changed, 1223 insertions(+) create mode 100644 xcresult/tests/data/test-crash-in-dependency.junit.xml create mode 100644 xcresult/tests/data/test-crash-in-dependency.xcresult.tar.gz create mode 100644 xcresult/tests/data/test-dependency-raises-failure.junit.xml create mode 100644 xcresult/tests/data/test-dependency-raises-failure.legacy.junit.xml create mode 100644 xcresult/tests/data/test-dependency-raises-failure.xcresult.tar.gz create mode 100644 xcresult/tests/data/test-in-repo-helper-raises-failure.junit.xml create mode 100644 xcresult/tests/data/test-in-repo-helper-raises-failure.legacy.junit.xml create mode 100644 xcresult/tests/data/test-in-repo-helper-raises-failure.xcresult.tar.gz create mode 100644 xcresult/tests/data/test-objc-xctest.junit.xml create mode 100644 xcresult/tests/data/test-objc-xctest.legacy.junit.xml create mode 100644 xcresult/tests/data/test-objc-xctest.xcresult.tar.gz create mode 100644 xcresult/tests/data/test-toplevel-swift-testing.junit.xml create mode 100644 xcresult/tests/data/test-toplevel-swift-testing.legacy.junit.xml create mode 100644 xcresult/tests/data/test-toplevel-swift-testing.xcresult.tar.gz create mode 100644 xcresult/tests/fixture-src/.gitignore create mode 100644 xcresult/tests/fixture-src/README.md create mode 100644 xcresult/tests/fixture-src/crash-in-dependency/Dependency/Package.swift create mode 100644 xcresult/tests/fixture-src/crash-in-dependency/Dependency/Sources/FixtureSupport/Crash.swift create mode 100644 xcresult/tests/fixture-src/crash-in-dependency/Dependency/Sources/FixtureSupport/TeardownFailureTrait.swift create mode 100644 xcresult/tests/fixture-src/crash-in-dependency/Package.swift create mode 100644 xcresult/tests/fixture-src/crash-in-dependency/Tests/CrashInDependencyTests/CrashInDependencyTests.swift create mode 100644 xcresult/tests/fixture-src/crash-in-dependency/Tests/CrashInDependencyTests/TeardownFailureTests.swift create mode 100644 xcresult/tests/fixture-src/dependency-raises-failure/Dependency/Package.swift create mode 100644 xcresult/tests/fixture-src/dependency-raises-failure/Dependency/Sources/FixtureSupport/FixtureSupport.swift create mode 100644 xcresult/tests/fixture-src/dependency-raises-failure/Package.swift create mode 100644 xcresult/tests/fixture-src/dependency-raises-failure/Tests/DependencyRaisesFailureTests/DependencyRaisesFailureTests.swift create mode 100755 xcresult/tests/fixture-src/dump-failure-summaries.py create mode 100644 xcresult/tests/fixture-src/in-repo-helper-raises-failure/Package.swift create mode 100644 xcresult/tests/fixture-src/in-repo-helper-raises-failure/Tests/InRepoHelperRaisesFailureTests/FailureHelper.swift create mode 100644 xcresult/tests/fixture-src/in-repo-helper-raises-failure/Tests/InRepoHelperRaisesFailureTests/InRepoHelperRaisesFailureTests.swift create mode 100644 xcresult/tests/fixture-src/objc-xctest/Package.swift create mode 100644 xcresult/tests/fixture-src/objc-xctest/Tests/ObjcXCTestTests/FailureHelper.m create mode 100644 xcresult/tests/fixture-src/objc-xctest/Tests/ObjcXCTestTests/ObjcXCTestTests.m create mode 100644 xcresult/tests/fixture-src/objc-xctest/Tests/ObjcXCTestTests/include/FailureHelper.h create mode 100755 xcresult/tests/fixture-src/prune-bundle.py create mode 100755 xcresult/tests/fixture-src/regenerate.sh create mode 100644 xcresult/tests/fixture-src/toplevel-swift-testing/Package.swift create mode 100644 xcresult/tests/fixture-src/toplevel-swift-testing/Tests/ToplevelSwiftTestingTests/FailureHelper.swift create mode 100644 xcresult/tests/fixture-src/toplevel-swift-testing/Tests/ToplevelSwiftTestingTests/ToplevelSwiftTestingTests.swift create mode 100755 xcresult/tests/fixture-src/verify-failure-summaries.py diff --git a/xcresult/tests/data/test-crash-in-dependency.junit.xml b/xcresult/tests/data/test-crash-in-dependency.junit.xml new file mode 100644 index 00000000..97db712b --- /dev/null +++ b/xcresult/tests/data/test-crash-in-dependency.junit.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/xcresult/tests/data/test-crash-in-dependency.xcresult.tar.gz b/xcresult/tests/data/test-crash-in-dependency.xcresult.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..1acc63c68898d2efeb01e037bdeb84f26d80dfc8 GIT binary patch literal 47055 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 + + + + + + + diff --git a/xcresult/tests/data/test-dependency-raises-failure.legacy.junit.xml b/xcresult/tests/data/test-dependency-raises-failure.legacy.junit.xml new file mode 100644 index 00000000..76c97bc8 --- /dev/null +++ b/xcresult/tests/data/test-dependency-raises-failure.legacy.junit.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/xcresult/tests/data/test-dependency-raises-failure.xcresult.tar.gz b/xcresult/tests/data/test-dependency-raises-failure.xcresult.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..eeb7fc9e72a49fc613bd6dd26ece35aa750ec65e GIT binary patch literal 30491 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 U7yre7@t?x~0_fundH`eu0CgK7J^%m! literal 0 HcmV?d00001 diff --git a/xcresult/tests/data/test-in-repo-helper-raises-failure.junit.xml b/xcresult/tests/data/test-in-repo-helper-raises-failure.junit.xml new file mode 100644 index 00000000..49b60781 --- /dev/null +++ b/xcresult/tests/data/test-in-repo-helper-raises-failure.junit.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/xcresult/tests/data/test-in-repo-helper-raises-failure.legacy.junit.xml b/xcresult/tests/data/test-in-repo-helper-raises-failure.legacy.junit.xml new file mode 100644 index 00000000..2f0d31a2 --- /dev/null +++ b/xcresult/tests/data/test-in-repo-helper-raises-failure.legacy.junit.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/xcresult/tests/data/test-in-repo-helper-raises-failure.xcresult.tar.gz b/xcresult/tests/data/test-in-repo-helper-raises-failure.xcresult.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..e45beab9520123368ca2d08913a224be374a54e3 GIT binary patch literal 27686 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 literal 0 HcmV?d00001 diff --git a/xcresult/tests/data/test-objc-xctest.junit.xml b/xcresult/tests/data/test-objc-xctest.junit.xml new file mode 100644 index 00000000..ca8fe9fa --- /dev/null +++ b/xcresult/tests/data/test-objc-xctest.junit.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/xcresult/tests/data/test-objc-xctest.legacy.junit.xml b/xcresult/tests/data/test-objc-xctest.legacy.junit.xml new file mode 100644 index 00000000..849a0bc7 --- /dev/null +++ b/xcresult/tests/data/test-objc-xctest.legacy.junit.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/xcresult/tests/data/test-objc-xctest.xcresult.tar.gz b/xcresult/tests/data/test-objc-xctest.xcresult.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..2288cef705372eefcd9f7e8c89707791a05ba985 GIT binary patch literal 29488 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 T&2N75Kb`*r2=RzZ09*tBW2U2Q literal 0 HcmV?d00001 diff --git a/xcresult/tests/data/test-toplevel-swift-testing.junit.xml b/xcresult/tests/data/test-toplevel-swift-testing.junit.xml new file mode 100644 index 00000000..ced884f2 --- /dev/null +++ b/xcresult/tests/data/test-toplevel-swift-testing.junit.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/xcresult/tests/data/test-toplevel-swift-testing.legacy.junit.xml b/xcresult/tests/data/test-toplevel-swift-testing.legacy.junit.xml new file mode 100644 index 00000000..89b64233 --- /dev/null +++ b/xcresult/tests/data/test-toplevel-swift-testing.legacy.junit.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/xcresult/tests/data/test-toplevel-swift-testing.xcresult.tar.gz b/xcresult/tests/data/test-toplevel-swift-testing.xcresult.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..51f3e0923c32008b610f4b1920ed1520547d296a GIT binary patch literal 27586 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 dlx(M>O@8+-Package -destination 'platform=macOS' \ + -derivedDataPath DerivedData -resultBundlePath .xcresult +``` + +(nonzero exit is the expected outcome — these tests are meant to fail), strips the +bundle with `prune-bundle.py`, dumps the failure summaries with +`dump-failure-summaries.py`, checks them with `verify-failure-summaries.py`, and +only then packages the bundle into `../data/test-.xcresult.tar.gz`. + +Pruning is not an optimization; without it these are unshippable. Xcode 26 writes +about 95MB of dyld shared-cache symbolication data into every result bundle, none +of it referenced from the invocation record — a scenario whose actual test data is +under 100KB produces a 96MB bundle. `prune-bundle.py` walks the object graph from +the root (whose own id lives in `Info.plist`, not in any object) and deletes the +`Data/` entries nothing reached; for these scenarios that is 9-11 objects kept out +of ~1570 files. `regenerate.sh` captures both `xcresulttool` outputs the crate +reads — `get object --legacy` and `get test-results tests` — before and after, and +fails if pruning changed either, so the saving is verified rather than assumed. + +Three details that are easy to get wrong: + +- **The dependency has to be a git repository.** A `.package(path:)` dependency is + built in place; only a git URL is checked out into + `DerivedData/SourcePackages/checkouts/`, and that path _is_ the shape being + reproduced. `regenerate.sh` creates the repository in the working copy so the + checked-in sources stay a plain directory. +- **Absolute paths are baked into a bundle at capture time** and end up in the + expected JUnit XML, which is why capture happens in a fixed directory. Set + `FIXTURE_WORK_DIR` to move it, and expect every `file` attribute to change. +- **Recapturing changes the timestamps** in the expected JUnit XML even when + nothing else moves. Diff with timestamps normalized to confirm that is all that + changed before saving. + +The expected JUnit XML is _not_ regenerated automatically. After recapturing, run +`cargo test -p xcresult`, read the diff, check each `file` attribute against the +table below, and only then save the new output over `../data/test-*.junit.xml`. A +`file` that lands on a dependency path is a bug to report, not output to snapshot. + +## What each scenario must exhibit + +`verify-failure-summaries.py` enforces the "captured shape" column and fails the +regeneration if a bundle stops reproducing it. + +| Scenario | Captured shape | Expected `file` (experimental) | Expected `file` (legacy) | +| ------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------ | ------------------------ | +| `dependency-raises-failure` | A swift-testing test calls a dependency helper that records the issue at its own `#filePath`. `fileName`, the source code context's location and the innermost frame are all under `SourcePackages/checkouts/`; only the test's own frame names the test file. | the test's own file | _(none)_ | +| `in-repo-helper-raises-failure` | Same, with the helper in the test target. Nothing rejects the helper's path, so the test's own frame has to win on its own merits. | the test's own file | the helper's file | +| `crash-in-dependency` | Two tests that never reach their own frame: one `fatalError`s inside the dependency (Xcode records a summary with no file at all), and one is failed by the dependency's `TestScoping` trait after its body returned (every file source is a checkout path). | _(none)_ | _(none)_ | +| `objc-xctest` | An Objective-C `XCTestCase` whose failure is raised by `XCTFail` in a shared category in another file, so the frame is symbolicated as `-[ObjcXCTestTests testFailsInsideSharedHelper]`. | the test's own file | _(none)_ | +| `toplevel-swift-testing` | A top-level `@Test func` with no suite, failed by a helper in another file, so the frame is the bare function name. | the test's own file | the helper's file | + +The two columns differ because only the experimental path reads the failure +summary's call stack, which is the only source that can identify the test's own +file. The legacy path sees just the workspace document location — the file the +failure was _raised_ from — so where that is a dependency it now reports no file, +and where it is an in-repo helper it still reports the helper. `objc-xctest` has no +legacy file for an unrelated reason: the fallback is keyed by test-case name and +Xcode spells the Objective-C one `-[Suite testCase]`, which never matches the +`Suite.testCase` key the lookup builds. + +To read what a captured bundle actually contains, run `dump-failure-summaries.py` +against it — the dump is derived from the bundle, so it is not checked in. + +## Why not the older SnapshotTesting fixture + +`../data/test-swift-snapshot-testing.xcresult.tar.gz` looks like it covers the +first scenario and does not: `assertSnapshot` takes `filePath: StaticString = +#filePath`, which is evaluated at the _call site_, so its `fileName` already points +at the test's own source. It passes with or without the fix. A helper that wants to +report its own location — which is what a trait or a page object does — has to build +the `SourceLocation` inside its body, which is what these fixtures do. diff --git a/xcresult/tests/fixture-src/crash-in-dependency/Dependency/Package.swift b/xcresult/tests/fixture-src/crash-in-dependency/Dependency/Package.swift new file mode 100644 index 00000000..4b45832a --- /dev/null +++ b/xcresult/tests/fixture-src/crash-in-dependency/Dependency/Package.swift @@ -0,0 +1,13 @@ +// swift-tools-version: 6.0 +import PackageDescription + +let package = Package( + name: "FixtureSupport", + platforms: [.macOS(.v13)], + products: [ + .library(name: "FixtureSupport", targets: ["FixtureSupport"]) + ], + targets: [ + .target(name: "FixtureSupport") + ] +) diff --git a/xcresult/tests/fixture-src/crash-in-dependency/Dependency/Sources/FixtureSupport/Crash.swift b/xcresult/tests/fixture-src/crash-in-dependency/Dependency/Sources/FixtureSupport/Crash.swift new file mode 100644 index 00000000..62be6b71 --- /dev/null +++ b/xcresult/tests/fixture-src/crash-in-dependency/Dependency/Sources/FixtureSupport/Crash.swift @@ -0,0 +1,4 @@ +/// Kills the test process from inside the dependency. +public func crashInsideDependency() -> Never { + fatalError("the dependency crashed the test process") +} diff --git a/xcresult/tests/fixture-src/crash-in-dependency/Dependency/Sources/FixtureSupport/TeardownFailureTrait.swift b/xcresult/tests/fixture-src/crash-in-dependency/Dependency/Sources/FixtureSupport/TeardownFailureTrait.swift new file mode 100644 index 00000000..ed60e3b8 --- /dev/null +++ b/xcresult/tests/fixture-src/crash-in-dependency/Dependency/Sources/FixtureSupport/TeardownFailureTrait.swift @@ -0,0 +1,28 @@ +import Testing + +/// A trait that fails the test *after* its body has returned, so the test's own +/// frame is already off the stack when the issue is recorded — the shape of a +/// snapshot-verification or screenshot-diffing trait that checks its work in +/// teardown. Every file the failure summary offers is then the dependency's. +public struct TeardownFailureTrait: TestTrait, TestScoping { + public func provideScope( + for test: Test, + testCase: Test.Case?, + performing function: () async throws -> Void + ) async throws { + try await function() + Issue.record( + Comment(rawValue: "the dependency's trait failed the test after its body returned"), + sourceLocation: SourceLocation( + fileID: #fileID, + filePath: #filePath, + line: #line, + column: #column + ) + ) + } +} + +extension Trait where Self == TeardownFailureTrait { + public static var teardownFailure: Self { .init() } +} diff --git a/xcresult/tests/fixture-src/crash-in-dependency/Package.swift b/xcresult/tests/fixture-src/crash-in-dependency/Package.swift new file mode 100644 index 00000000..8ab2898b --- /dev/null +++ b/xcresult/tests/fixture-src/crash-in-dependency/Package.swift @@ -0,0 +1,18 @@ +// swift-tools-version: 6.0 +import PackageDescription + +// See `dependency-raises-failure/Package.swift` for why the dependency is a git +// URL rather than a path. +let package = Package( + name: "CrashInDependency", + platforms: [.macOS(.v13)], + dependencies: [ + .package(url: "./Dependency", branch: "main") + ], + targets: [ + .testTarget( + name: "CrashInDependencyTests", + dependencies: [.product(name: "FixtureSupport", package: "Dependency")] + ) + ] +) diff --git a/xcresult/tests/fixture-src/crash-in-dependency/Tests/CrashInDependencyTests/CrashInDependencyTests.swift b/xcresult/tests/fixture-src/crash-in-dependency/Tests/CrashInDependencyTests/CrashInDependencyTests.swift new file mode 100644 index 00000000..287fb0d1 --- /dev/null +++ b/xcresult/tests/fixture-src/crash-in-dependency/Tests/CrashInDependencyTests/CrashInDependencyTests.swift @@ -0,0 +1,11 @@ +import XCTest + +import FixtureSupport + +final class CrashInDependencyTests: XCTestCase { + /// The process dies inside the dependency, so the failure summary Xcode + /// records has no file at all — not even a wrong one. + func testCrashesInsideDependency() { + crashInsideDependency() + } +} diff --git a/xcresult/tests/fixture-src/crash-in-dependency/Tests/CrashInDependencyTests/TeardownFailureTests.swift b/xcresult/tests/fixture-src/crash-in-dependency/Tests/CrashInDependencyTests/TeardownFailureTests.swift new file mode 100644 index 00000000..fded6ec8 --- /dev/null +++ b/xcresult/tests/fixture-src/crash-in-dependency/Tests/CrashInDependencyTests/TeardownFailureTests.swift @@ -0,0 +1,12 @@ +import Testing + +import FixtureSupport + +@Suite +struct TeardownFailureTests { + /// The test body succeeds and the dependency's trait fails it afterwards, so + /// the test's own frame is gone by the time the failure is recorded: every + /// file source is a dependency path and none of them may be reported. + @Test(.teardownFailure) + func failsAfterItsOwnFrameIsGone() {} +} diff --git a/xcresult/tests/fixture-src/dependency-raises-failure/Dependency/Package.swift b/xcresult/tests/fixture-src/dependency-raises-failure/Dependency/Package.swift new file mode 100644 index 00000000..4b45832a --- /dev/null +++ b/xcresult/tests/fixture-src/dependency-raises-failure/Dependency/Package.swift @@ -0,0 +1,13 @@ +// swift-tools-version: 6.0 +import PackageDescription + +let package = Package( + name: "FixtureSupport", + platforms: [.macOS(.v13)], + products: [ + .library(name: "FixtureSupport", targets: ["FixtureSupport"]) + ], + targets: [ + .target(name: "FixtureSupport") + ] +) diff --git a/xcresult/tests/fixture-src/dependency-raises-failure/Dependency/Sources/FixtureSupport/FixtureSupport.swift b/xcresult/tests/fixture-src/dependency-raises-failure/Dependency/Sources/FixtureSupport/FixtureSupport.swift new file mode 100644 index 00000000..e822ef7a --- /dev/null +++ b/xcresult/tests/fixture-src/dependency-raises-failure/Dependency/Sources/FixtureSupport/FixtureSupport.swift @@ -0,0 +1,19 @@ +import Testing + +/// Records a failure against whatever test is running, attributed to *this* file. +/// +/// `#filePath` in a function body is the file the function is defined in, so the +/// issue is raised from the dependency's source rather than from the caller's — +/// the same shape as a snapshot-testing assertion helper, a mocking framework, or +/// a page object that reports the failure at its own location. +public func recordIssueFromDependency(_ message: String) { + Issue.record( + Comment(rawValue: message), + sourceLocation: SourceLocation( + fileID: #fileID, + filePath: #filePath, + line: #line, + column: #column + ) + ) +} diff --git a/xcresult/tests/fixture-src/dependency-raises-failure/Package.swift b/xcresult/tests/fixture-src/dependency-raises-failure/Package.swift new file mode 100644 index 00000000..d5ea00fa --- /dev/null +++ b/xcresult/tests/fixture-src/dependency-raises-failure/Package.swift @@ -0,0 +1,20 @@ +// swift-tools-version: 6.0 +import PackageDescription + +// `Dependency` is referenced by git URL rather than by path so SPM checks it out +// into `DerivedData/SourcePackages/checkouts/Dependency` — the vendored location +// whose paths the fixture exists to reproduce. `regenerate.sh` turns the checked-in +// `Dependency` directory into a git repository before building. +let package = Package( + name: "DependencyRaisesFailure", + platforms: [.macOS(.v13)], + dependencies: [ + .package(url: "./Dependency", branch: "main") + ], + targets: [ + .testTarget( + name: "DependencyRaisesFailureTests", + dependencies: [.product(name: "FixtureSupport", package: "Dependency")] + ) + ] +) diff --git a/xcresult/tests/fixture-src/dependency-raises-failure/Tests/DependencyRaisesFailureTests/DependencyRaisesFailureTests.swift b/xcresult/tests/fixture-src/dependency-raises-failure/Tests/DependencyRaisesFailureTests/DependencyRaisesFailureTests.swift new file mode 100644 index 00000000..1966d563 --- /dev/null +++ b/xcresult/tests/fixture-src/dependency-raises-failure/Tests/DependencyRaisesFailureTests/DependencyRaisesFailureTests.swift @@ -0,0 +1,14 @@ +import Testing + +import FixtureSupport + +@Suite +struct DependencyRaisesFailureTests { + /// Every file the failure summary offers — `fileName`, the source code + /// context's location, and the innermost call-stack frame — points into the + /// dependency's checkout. Only the test's own call-stack frame names this file. + @Test + func failsInsideDependency() { + recordIssueFromDependency("recorded from the dependency's own source") + } +} diff --git a/xcresult/tests/fixture-src/dump-failure-summaries.py b/xcresult/tests/fixture-src/dump-failure-summaries.py new file mode 100755 index 00000000..64542400 --- /dev/null +++ b/xcresult/tests/fixture-src/dump-failure-summaries.py @@ -0,0 +1,148 @@ +#!/usr/bin/env python3 +"""Dump the per-test failure summaries out of an .xcresult bundle. + +`xcrun xcresulttool get object --legacy` returns one object at a time and the +failure summaries hang several references deep, so walking to them takes a +handful of calls. This prints a JSON array — one entry per test that has +failure summaries — with the pieces the Rust attribution logic reads: +`fileName`, `sourceCodeContext.location.filePath`, and the call stack's +symbol names and file paths. + + ./dump-failure-summaries.py .xcresult > .failure-summaries.json +""" + +import json +import subprocess +import sys + + +def get_object(path, object_id=None): + cmd = [ + "xcrun", + "xcresulttool", + "get", + "object", + "--path", + path, + "--format", + "json", + "--legacy", + ] + if object_id: + cmd += ["--id", object_id] + return json.loads(subprocess.run(cmd, check=True, capture_output=True).stdout) + + +def value(node): + """Unwrap the legacy schema's `{"_value": ...}` boxes.""" + if isinstance(node, dict): + return node.get("_value") + return None + + +def values(node): + if isinstance(node, dict): + return node.get("_values", []) + return [] + + +def walk_tests(node, ancestors): + """Yield every (name-path, summaryRef id, status) leaf under a test node.""" + name = value(node.get("name")) + subtests = node.get("subtests") + if subtests is not None: + for subtest in values(subtests): + yield from walk_tests(subtest, ancestors + [name]) + return + summary_ref = node.get("summaryRef") + if summary_ref is not None: + yield ( + ancestors + [name], + value(summary_ref.get("id")), + value(node.get("testStatus")), + value(node.get("identifier")), + ) + + +def source_code_context(context): + if context is None: + return None + location = context.get("location") or {} + return { + "location.filePath": value(location.get("filePath")), + "location.lineNumber": value(location.get("lineNumber")), + "callStack": [ + { + "symbolName": value((frame.get("symbolInfo") or {}).get("symbolName")), + "filePath": value( + (((frame.get("symbolInfo") or {}).get("location")) or {}).get( + "filePath" + ) + ), + "imageName": value((frame.get("symbolInfo") or {}).get("imageName")), + } + for frame in values(context.get("callStack")) + ], + } + + +def main(): + path = sys.argv[1] + root = get_object(path) + + out = [] + for action in values(root.get("actions")): + action_result = action.get("actionResult") or {} + + for issue in values( + (action_result.get("issues") or {}).get("testFailureSummaries") + ): + document_location = issue.get("documentLocationInCreatingWorkspace") or {} + out.append( + { + "kind": "actionResult.issues.testFailureSummaries", + "testCaseName": value(issue.get("testCaseName")), + "producingTarget": value(issue.get("producingTarget")), + "documentLocationInCreatingWorkspace.url": value( + document_location.get("url") + ), + } + ) + + tests_ref = action_result.get("testsRef") + if tests_ref is None: + continue + plan = get_object(path, value(tests_ref.get("id"))) + for plan_summary in values(plan.get("summaries")): + for testable in values(plan_summary.get("testableSummaries")): + for test in values(testable.get("tests")): + for names, summary_id, status, identifier in walk_tests(test, []): + if status == "Success": + continue + summary = get_object(path, summary_id) + for failure in values(summary.get("failureSummaries")): + out.append( + { + "kind": "test.failureSummaries", + "testBundle": value(testable.get("name")), + "namePath": names, + "identifier": identifier, + "testStatus": status, + "message": value(failure.get("message")), + "fileName": value(failure.get("fileName")), + "lineNumber": value(failure.get("lineNumber")), + "isPerformanceFailure": value( + failure.get("isPerformanceFailure") + ), + "sourceCodeContext": source_code_context( + failure.get("sourceCodeContext") + ), + } + ) + + json.dump(out, sys.stdout, indent=2) + sys.stdout.write("\n") + + +if __name__ == "__main__": + main() diff --git a/xcresult/tests/fixture-src/in-repo-helper-raises-failure/Package.swift b/xcresult/tests/fixture-src/in-repo-helper-raises-failure/Package.swift new file mode 100644 index 00000000..4ab83ad3 --- /dev/null +++ b/xcresult/tests/fixture-src/in-repo-helper-raises-failure/Package.swift @@ -0,0 +1,10 @@ +// swift-tools-version: 6.0 +import PackageDescription + +let package = Package( + name: "InRepoHelperRaisesFailure", + platforms: [.macOS(.v13)], + targets: [ + .testTarget(name: "InRepoHelperRaisesFailureTests") + ] +) diff --git a/xcresult/tests/fixture-src/in-repo-helper-raises-failure/Tests/InRepoHelperRaisesFailureTests/FailureHelper.swift b/xcresult/tests/fixture-src/in-repo-helper-raises-failure/Tests/InRepoHelperRaisesFailureTests/FailureHelper.swift new file mode 100644 index 00000000..7dbd11b4 --- /dev/null +++ b/xcresult/tests/fixture-src/in-repo-helper-raises-failure/Tests/InRepoHelperRaisesFailureTests/FailureHelper.swift @@ -0,0 +1,15 @@ +import Testing + +/// The same shape as the dependency helper, but living in the test target itself: +/// the issue is raised at this file, not at the caller's. +func recordIssueFromHelper(_ message: String) { + Issue.record( + Comment(rawValue: message), + sourceLocation: SourceLocation( + fileID: #fileID, + filePath: #filePath, + line: #line, + column: #column + ) + ) +} diff --git a/xcresult/tests/fixture-src/in-repo-helper-raises-failure/Tests/InRepoHelperRaisesFailureTests/InRepoHelperRaisesFailureTests.swift b/xcresult/tests/fixture-src/in-repo-helper-raises-failure/Tests/InRepoHelperRaisesFailureTests/InRepoHelperRaisesFailureTests.swift new file mode 100644 index 00000000..b0371891 --- /dev/null +++ b/xcresult/tests/fixture-src/in-repo-helper-raises-failure/Tests/InRepoHelperRaisesFailureTests/InRepoHelperRaisesFailureTests.swift @@ -0,0 +1,11 @@ +import Testing + +@Suite +struct InRepoHelperRaisesFailureTests { + /// The helper's file is in the repo, so nothing rejects it — the test's own + /// call-stack frame has to win on its own merits for this file to be reported. + @Test + func failsInsideHelper() { + recordIssueFromHelper("recorded from a helper in the test target") + } +} diff --git a/xcresult/tests/fixture-src/objc-xctest/Package.swift b/xcresult/tests/fixture-src/objc-xctest/Package.swift new file mode 100644 index 00000000..c41d7dff --- /dev/null +++ b/xcresult/tests/fixture-src/objc-xctest/Package.swift @@ -0,0 +1,10 @@ +// swift-tools-version: 6.0 +import PackageDescription + +let package = Package( + name: "ObjcXCTest", + platforms: [.macOS(.v13)], + targets: [ + .testTarget(name: "ObjcXCTestTests") + ] +) diff --git a/xcresult/tests/fixture-src/objc-xctest/Tests/ObjcXCTestTests/FailureHelper.m b/xcresult/tests/fixture-src/objc-xctest/Tests/ObjcXCTestTests/FailureHelper.m new file mode 100644 index 00000000..c53e5ab4 --- /dev/null +++ b/xcresult/tests/fixture-src/objc-xctest/Tests/ObjcXCTestTests/FailureHelper.m @@ -0,0 +1,11 @@ +#import "FailureHelper.h" + +@implementation XCTestCase (FixtureFailureHelper) + +// `XCTFail` expands with this file's `__FILE__`, so the failure is raised here +// rather than at the call site. +- (void)fixtureFailWithMessage:(NSString *)message { + XCTFail(@"%@", message); +} + +@end diff --git a/xcresult/tests/fixture-src/objc-xctest/Tests/ObjcXCTestTests/ObjcXCTestTests.m b/xcresult/tests/fixture-src/objc-xctest/Tests/ObjcXCTestTests/ObjcXCTestTests.m new file mode 100644 index 00000000..67f39841 --- /dev/null +++ b/xcresult/tests/fixture-src/objc-xctest/Tests/ObjcXCTestTests/ObjcXCTestTests.m @@ -0,0 +1,14 @@ +#import "FailureHelper.h" + +@interface ObjcXCTestTests : XCTestCase +@end + +@implementation ObjcXCTestTests + +// Symbolicates as `-[ObjcXCTestTests testFailsInsideSharedHelper]`, which is the +// Objective-C spelling the frame matching has to recognize. +- (void)testFailsInsideSharedHelper { + [self fixtureFailWithMessage:@"raised from the shared Objective-C helper"]; +} + +@end diff --git a/xcresult/tests/fixture-src/objc-xctest/Tests/ObjcXCTestTests/include/FailureHelper.h b/xcresult/tests/fixture-src/objc-xctest/Tests/ObjcXCTestTests/include/FailureHelper.h new file mode 100644 index 00000000..04ec2c47 --- /dev/null +++ b/xcresult/tests/fixture-src/objc-xctest/Tests/ObjcXCTestTests/include/FailureHelper.h @@ -0,0 +1,5 @@ +#import + +@interface XCTestCase (FixtureFailureHelper) +- (void)fixtureFailWithMessage:(NSString *)message; +@end diff --git a/xcresult/tests/fixture-src/prune-bundle.py b/xcresult/tests/fixture-src/prune-bundle.py new file mode 100755 index 00000000..d7c2d197 --- /dev/null +++ b/xcresult/tests/fixture-src/prune-bundle.py @@ -0,0 +1,136 @@ +#!/usr/bin/env python3 +"""Drop the objects in an .xcresult bundle that nothing in it references. + +Xcode 26 writes ~140MB of dyld shared-cache symbolication data plus a payload per +loaded image into every result bundle, none of it reachable from the invocation +record. That is fine for a bundle you throw away and not fine for one checked into +git — it is ~95MB of the ~96MB a scenario produces. + +This walks the object graph from the root, following every reference id, and +deletes the `Data/` entries nothing reached. `regenerate.sh` re-dumps the failure +summaries afterwards and fails if pruning changed them. + + ./prune-bundle.py .xcresult +""" + +import json +import os +import re +import subprocess +import sys + +# Object ids are content-addressed and are also the `Data/` file names, e.g. +# `data.0~aBc.../refs.0~aBc...`. +OBJECT_ID = re.compile(r"^0~[A-Za-z0-9_\-+/=]+$") + + +def get_object(path, object_id=None): + cmd = [ + "xcrun", + "xcresulttool", + "get", + "object", + "--path", + path, + "--format", + "json", + "--legacy", + ] + if object_id: + cmd += ["--id", object_id] + result = subprocess.run(cmd, capture_output=True) + if result.returncode != 0: + return None + try: + return json.loads(result.stdout) + except json.JSONDecodeError: + return None + + +def object_ids_in(node): + """Every value anywhere in an object that is shaped like an object id.""" + if isinstance(node, dict): + for key, child in node.items(): + if key == "_value" and isinstance(child, str) and OBJECT_ID.match(child): + yield child + else: + yield from object_ids_in(child) + elif isinstance(node, list): + for child in node: + yield from object_ids_in(child) + + +def root_id(path): + """The invocation record's own id, which lives in Info.plist rather than in + any object, so nothing in the graph points at it.""" + # Info.plist holds a date, which `plutil -convert json` refuses to write, so + # the one field is extracted rather than the whole file converted. + info = subprocess.run( + [ + "plutil", + "-extract", + "rootId.hash", + "raw", + "-o", + "-", + os.path.join(path, "Info.plist"), + ], + check=True, + capture_output=True, + ) + return info.stdout.decode().strip() + + +def reachable_ids(path): + root = get_object(path) + if root is None: + raise SystemExit(f"{path}: could not read the invocation record") + + seen = {root_id(path)} + queue = list(object_ids_in(root)) + while queue: + object_id = queue.pop() + if object_id in seen: + continue + seen.add(object_id) + child = get_object(path, object_id) + if child is not None: + queue.extend(object_ids_in(child)) + return seen + + +def main(): + path = sys.argv[1] + data_dir = os.path.join(path, "Data") + + keep = reachable_ids(path) + before = sum( + os.path.getsize(os.path.join(data_dir, name)) for name in os.listdir(data_dir) + ) + + removed = 0 + for name in os.listdir(data_dir): + prefix, _, object_id = name.partition(".") + if prefix not in ("data", "refs"): + continue + if object_id in keep: + continue + file_path = os.path.join(data_dir, name) + removed += os.path.getsize(file_path) + os.remove(file_path) + + # Built lazily by xcresulttool and rebuilt on demand, so it is noise in a + # checked-in fixture. + index = os.path.join(path, "database.sqlite3") + if os.path.exists(index): + os.remove(index) + + print( + f" pruned {removed / 1e6:.0f}MB of unreferenced objects " + f"({before / 1e6:.0f}MB -> {(before - removed) / 1e6:.0f}MB), " + f"kept {len(keep)}" + ) + + +if __name__ == "__main__": + main() diff --git a/xcresult/tests/fixture-src/regenerate.sh b/xcresult/tests/fixture-src/regenerate.sh new file mode 100755 index 00000000..b7a24583 --- /dev/null +++ b/xcresult/tests/fixture-src/regenerate.sh @@ -0,0 +1,141 @@ +#!/usr/bin/env bash +# +# Capture the .xcresult fixtures in `xcresult/tests/data/` from the scenario +# packages next to this script. Requires macOS and Xcode. +# +# ./regenerate.sh # every scenario +# ./regenerate.sh objc-xctest # just one +# FIXTURE_WORK_DIR=/tmp/elsewhere ./regenerate.sh +# +# Absolute paths are baked into a bundle at capture time and end up in the +# expected JUnit XML, so the scenarios are copied to a fixed working directory +# (`/tmp/xcresult-fixtures` by default) and built there. Regenerating from a +# different directory rewrites every path in the expected output — see README.md. + +set -euo pipefail + +FIXTURE_SRC_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +DATA_DIR="$(cd "${FIXTURE_SRC_DIR}/../data" && pwd)" +WORK_DIR="${FIXTURE_WORK_DIR:-/tmp/xcresult-fixtures}" + +ALL_SCENARIOS=( + dependency-raises-failure + in-repo-helper-raises-failure + crash-in-dependency + objc-xctest + toplevel-swift-testing +) + +# scenario -> the package name, which is both the xcodebuild scheme prefix and the +# name of the captured bundle. +package_name() { + case "$1" in + dependency-raises-failure) echo DependencyRaisesFailure ;; + in-repo-helper-raises-failure) echo InRepoHelperRaisesFailure ;; + crash-in-dependency) echo CrashInDependency ;; + objc-xctest) echo ObjcXCTest ;; + toplevel-swift-testing) echo ToplevelSwiftTesting ;; + *) + echo "unknown scenario: $1" >&2 + exit 1 + ;; + esac +} + +regenerate() { + local scenario="$1" + local package + package="$(package_name "${scenario}")" + local scenario_work_dir="${WORK_DIR}/${scenario}" + local bundle="${scenario_work_dir}/${package}.xcresult" + + echo "==> ${scenario}" + + rm -rf "${scenario_work_dir}" + mkdir -p "${WORK_DIR}" + cp -R "${FIXTURE_SRC_DIR}/${scenario}" "${scenario_work_dir}" + + # A `.package(url: "./Dependency", ...)` is only checked out into + # `SourcePackages/checkouts` if it is a git repository, and the fixture is + # pointless unless it is: that checkout path is the whole shape being + # reproduced. The repository is created in the working copy so the checked-in + # sources stay a plain directory. + if [[ -d "${scenario_work_dir}/Dependency" ]]; then + git -C "${scenario_work_dir}/Dependency" init -q + git -C "${scenario_work_dir}/Dependency" add -A + git -C "${scenario_work_dir}/Dependency" \ + -c user.email=fixtures@trunk.io -c user.name=fixtures \ + commit -qm "xcresult fixture dependency" + git -C "${scenario_work_dir}/Dependency" branch -qM main + fi + + # Tests are meant to fail here, so xcodebuild exits nonzero on a good run. + ( + cd "${scenario_work_dir}" + xcodebuild test \ + -scheme "${package}-Package" \ + -destination 'platform=macOS' \ + -derivedDataPath DerivedData \ + -resultBundlePath "${package}.xcresult" \ + >xcodebuild.log 2>&1 + ) || true + + if [[ ! -d ${bundle} ]]; then + echo " no bundle at ${bundle}; see ${scenario_work_dir}/xcodebuild.log" >&2 + return 1 + fi + + # Xcode 26 writes ~95MB of unreferenced symbolication data into every bundle, + # so pruning is what makes these checkable into git at all. Both xcresulttool + # APIs the crate calls are compared before and after to prove the prune is + # invisible to consumers. + local before_legacy="${scenario_work_dir}/before-legacy.json" + local before_modern="${scenario_work_dir}/before-modern.json" + "${FIXTURE_SRC_DIR}/dump-failure-summaries.py" "${bundle}" >"${before_legacy}" + xcrun xcresulttool get test-results tests --path "${bundle}" --format json \ + >"${before_modern}" + + "${FIXTURE_SRC_DIR}/prune-bundle.py" "${bundle}" + + # Derived from the bundle, so it is written to the working directory rather + # than checked in; `dump-failure-summaries.py` regenerates it on demand. + local dump="${scenario_work_dir}/${scenario}.failure-summaries.json" + "${FIXTURE_SRC_DIR}/dump-failure-summaries.py" "${bundle}" >"${dump}" + diff -q "${before_legacy}" "${dump}" >/dev/null || + { + echo " pruning changed the legacy failure summaries" >&2 + return 1 + } + xcrun xcresulttool get test-results tests --path "${bundle}" --format json | + diff -q "${before_modern}" - >/dev/null || + { + echo " pruning changed the test-results output" >&2 + return 1 + } + + "${FIXTURE_SRC_DIR}/verify-failure-summaries.py" "${scenario}" "${dump}" + + tar -czf "${DATA_DIR}/test-${scenario}.xcresult.tar.gz" \ + -C "${scenario_work_dir}" "${package}.xcresult" + echo " wrote ${DATA_DIR}/test-${scenario}.xcresult.tar.gz" +} + +scenarios=("${@-}") +if [[ -z ${scenarios[0]} ]]; then + scenarios=("${ALL_SCENARIOS[@]}") +fi + +for scenario in "${scenarios[@]}"; do + regenerate "${scenario}" +done + +cat <<'EOF' + +Bundles regenerated. The expected JUnit XML in `xcresult/tests/data/` still has +the old absolute paths baked in; update it with + + cargo test -p xcresult + +and check every `file` attribute by hand before saving the new output — see +README.md for what each scenario must report. +EOF diff --git a/xcresult/tests/fixture-src/toplevel-swift-testing/Package.swift b/xcresult/tests/fixture-src/toplevel-swift-testing/Package.swift new file mode 100644 index 00000000..d5eca214 --- /dev/null +++ b/xcresult/tests/fixture-src/toplevel-swift-testing/Package.swift @@ -0,0 +1,10 @@ +// swift-tools-version: 6.0 +import PackageDescription + +let package = Package( + name: "ToplevelSwiftTesting", + platforms: [.macOS(.v13)], + targets: [ + .testTarget(name: "ToplevelSwiftTestingTests") + ] +) diff --git a/xcresult/tests/fixture-src/toplevel-swift-testing/Tests/ToplevelSwiftTestingTests/FailureHelper.swift b/xcresult/tests/fixture-src/toplevel-swift-testing/Tests/ToplevelSwiftTestingTests/FailureHelper.swift new file mode 100644 index 00000000..8b85ffca --- /dev/null +++ b/xcresult/tests/fixture-src/toplevel-swift-testing/Tests/ToplevelSwiftTestingTests/FailureHelper.swift @@ -0,0 +1,13 @@ +import Testing + +func recordIssueFromHelper(_ message: String) { + Issue.record( + Comment(rawValue: message), + sourceLocation: SourceLocation( + fileID: #fileID, + filePath: #filePath, + line: #line, + column: #column + ) + ) +} diff --git a/xcresult/tests/fixture-src/toplevel-swift-testing/Tests/ToplevelSwiftTestingTests/ToplevelSwiftTestingTests.swift b/xcresult/tests/fixture-src/toplevel-swift-testing/Tests/ToplevelSwiftTestingTests/ToplevelSwiftTestingTests.swift new file mode 100644 index 00000000..8bf2224c --- /dev/null +++ b/xcresult/tests/fixture-src/toplevel-swift-testing/Tests/ToplevelSwiftTestingTests/ToplevelSwiftTestingTests.swift @@ -0,0 +1,8 @@ +import Testing + +/// Declared at the top level rather than in a `@Suite`, so it symbolicates as the +/// bare function `failsInsideHelperWithoutASuite()` with no suite to qualify it. +@Test +func failsInsideHelperWithoutASuite() { + recordIssueFromHelper("raised from the in-repo helper") +} diff --git a/xcresult/tests/fixture-src/verify-failure-summaries.py b/xcresult/tests/fixture-src/verify-failure-summaries.py new file mode 100755 index 00000000..45ade9d0 --- /dev/null +++ b/xcresult/tests/fixture-src/verify-failure-summaries.py @@ -0,0 +1,195 @@ +#!/usr/bin/env python3 +"""Assert that a captured .xcresult actually exhibits the shape it was captured for. + +A fixture that no longer reproduces its shape is worse than no fixture — it keeps +passing while guarding nothing (which is what happened to the older +`test-swift-snapshot-testing` bundle, whose `fileName` points at the test's own +source). `regenerate.sh` runs this before packaging anything, and refuses to +package a bundle that fails. + + ./verify-failure-summaries.py .failure-summaries.json +""" + +import json +import sys + +# Directory segments that mark vendored dependency sources. Kept in sync with +# `DEPENDENCY_PATH_SEGMENTS` in `xcresult/src/xcresult_legacy.rs`. +DEPENDENCY_PATH_SEGMENTS = ["/.build/", "/checkouts/", "/DerivedData/"] + +# One entry per failure the scenario must produce, keyed by the test's identifier. +# +# raised_from: where `fileName` / the source code context's location must point +# - "dependency": a vendored path, which is what makes the fixture a regression +# test — every non-call-stack source is unusable +# - "in_repo_helper": a real path that is *not* the test's own file +# - "absent": the failure carries no file at all +# test_frame_symbol: the call-stack symbol that names the test itself, which is +# the only thing that can identify the test's file. `None` means the stack must +# *not* reach the test — the crash and teardown shapes, where no file may be +# reported at all. +# other_frames: whether the stack must also contain frames that are not the +# test's, i.e. whether picking the last frame instead of the test's would land +# somewhere else. +SCENARIOS = { + "dependency-raises-failure": [ + { + "identifier": "DependencyRaisesFailureTests/failsInsideDependency()", + "raised_from": "dependency", + "test_frame_symbol": "DependencyRaisesFailureTests.failsInsideDependency()", + "other_frames": True, + }, + ], + "in-repo-helper-raises-failure": [ + { + "identifier": "InRepoHelperRaisesFailureTests/failsInsideHelper()", + "raised_from": "in_repo_helper", + "test_frame_symbol": "InRepoHelperRaisesFailureTests.failsInsideHelper()", + "other_frames": True, + }, + ], + "crash-in-dependency": [ + { + "identifier": "CrashInDependencyTests/testCrashesInsideDependency()", + "raised_from": "absent", + "test_frame_symbol": None, + "other_frames": False, + }, + { + "identifier": "TeardownFailureTests/failsAfterItsOwnFrameIsGone()", + "raised_from": "dependency", + "test_frame_symbol": None, + "other_frames": True, + }, + ], + "objc-xctest": [ + { + "identifier": "ObjcXCTestTests/testFailsInsideSharedHelper", + "raised_from": "in_repo_helper", + "test_frame_symbol": "-[ObjcXCTestTests testFailsInsideSharedHelper]", + "other_frames": True, + }, + ], + "toplevel-swift-testing": [ + { + "identifier": "failsInsideHelperWithoutASuite()", + "raised_from": "in_repo_helper", + "test_frame_symbol": "failsInsideHelperWithoutASuite()", + "other_frames": True, + }, + ], +} + + +def is_dependency_path(path): + return path is not None and any(seg in path for seg in DEPENDENCY_PATH_SEGMENTS) + + +class Failures(list): + def check(self, condition, message): + if not condition: + self.append(message) + + +def check_summary(failures, expectation, summary): + identifier = expectation["identifier"] + context = summary["sourceCodeContext"] or {} + frames = context.get("callStack", []) + raised_from = [summary["fileName"], context.get("location.filePath")] + named = [ + frame + for frame in frames + if expectation["test_frame_symbol"] is not None + and frame["symbolName"] == expectation["test_frame_symbol"] + ] + + if expectation["raised_from"] == "dependency": + for source in raised_from: + failures.check( + is_dependency_path(source), + f"{identifier}: expected the failure to be raised from a dependency " + f"path, got {source!r}", + ) + elif expectation["raised_from"] == "absent": + for source in raised_from: + failures.check( + source is None, + f"{identifier}: expected no file source at all, got {source!r}", + ) + else: + for source in raised_from: + failures.check( + source is not None and not is_dependency_path(source), + f"{identifier}: expected the failure to be raised from an in-repo " + f"helper, got {source!r}", + ) + + if expectation["test_frame_symbol"] is None: + failures.check( + not any( + frame["filePath"] and not is_dependency_path(frame["filePath"]) + for frame in frames + ), + f"{identifier}: expected the stack never to reach the test, but it has " + f"a frame outside the dependency", + ) + else: + failures.check( + len(named) == 1, + f"{identifier}: expected exactly one frame named " + f"{expectation['test_frame_symbol']!r}, found {len(named)}", + ) + for frame in named: + failures.check( + frame["filePath"] is not None + and not is_dependency_path(frame["filePath"]), + f"{identifier}: the test's own frame must carry a non-dependency " + f"file path, got {frame['filePath']!r}", + ) + failures.check( + frame["filePath"] not in raised_from, + f"{identifier}: the test's own frame points at the same file the " + f"failure was raised from ({frame['filePath']!r}), so the fixture " + f"would pass without the fix", + ) + + if expectation["other_frames"]: + symbolicated = [frame for frame in frames if frame["symbolName"]] + failures.check( + len(symbolicated) > len(named), + f"{identifier}: expected at least one frame besides the test's own", + ) + + +def main(): + scenario, dump_path = sys.argv[1], sys.argv[2] + expectations = SCENARIOS[scenario] + dump = json.load(open(dump_path)) + summaries = { + entry["identifier"]: entry + for entry in dump + if entry["kind"] == "test.failureSummaries" + } + + failures = Failures() + for expectation in expectations: + summary = summaries.get(expectation["identifier"]) + if summary is None: + failures.append( + f"{expectation['identifier']}: no failure summary in the bundle " + f"(found {sorted(summaries)})" + ) + continue + check_summary(failures, expectation, summary) + + if failures: + print(f"{scenario}: bundle does not exhibit its shape", file=sys.stderr) + for failure in failures: + print(f" - {failure}", file=sys.stderr) + sys.exit(1) + + print(f"{scenario}: verified {len(expectations)} failure summary shape(s)") + + +if __name__ == "__main__": + main() diff --git a/xcresult/tests/xcresult.rs b/xcresult/tests/xcresult.rs index 7514ed83..35397b5d 100644 --- a/xcresult/tests/xcresult.rs +++ b/xcresult/tests/xcresult.rs @@ -34,6 +34,16 @@ lazy_static! { unpack_archive_to_temp_dir("tests/data/test-swift-mix.xcresult.tar.gz"); static ref TEMP_DIR_TEST_SWIFT_SNAPSHOT_TESTING: TempDir = unpack_archive_to_temp_dir("tests/data/test-swift-snapshot-testing.xcresult.tar.gz"); + static ref TEMP_DIR_TEST_DEPENDENCY_RAISES_FAILURE: TempDir = + unpack_archive_to_temp_dir("tests/data/test-dependency-raises-failure.xcresult.tar.gz"); + static ref TEMP_DIR_TEST_IN_REPO_HELPER_RAISES_FAILURE: TempDir = + unpack_archive_to_temp_dir("tests/data/test-in-repo-helper-raises-failure.xcresult.tar.gz"); + static ref TEMP_DIR_TEST_CRASH_IN_DEPENDENCY: TempDir = + unpack_archive_to_temp_dir("tests/data/test-crash-in-dependency.xcresult.tar.gz"); + static ref TEMP_DIR_TEST_OBJC_XCTEST: TempDir = + unpack_archive_to_temp_dir("tests/data/test-objc-xctest.xcresult.tar.gz"); + static ref TEMP_DIR_TEST_TOPLEVEL_SWIFT_TESTING: TempDir = + unpack_archive_to_temp_dir("tests/data/test-toplevel-swift-testing.xcresult.tar.gz"); static ref TEMP_DIR_TEST_TIMESTAMP: TempDir = unpack_archive_to_temp_dir("tests/data/test-timestamp.xcresult.tar.gz"); static ref TEMP_DIR_TEST_VARIANT: TempDir = @@ -245,6 +255,162 @@ fn test_swift_snapshot_testing_trait_failure_uses_assertion_file( ); } +// Real bundles for the file sources in `xcresult::file_attribution`, one per shape +// that used to attribute a failed test to a vendored dependency. Each test below +// names the source it exercises; `tests/fixture-src/README.md` covers what each +// bundle must exhibit and how to regenerate it. +// +// The two cases expect different JUnit because they have different sources +// available: only the experimental path reads the per-test failure summary, and so +// the call stack, so it is the only one that can produce a `FileSource::TestFrame`. +// The legacy path sees `FileSource::DocumentLocation` alone. +#[cfg(target_os = "macos")] +fn assert_junit>( + bundle_path: T, + use_experimental_failure_summary: bool, + expected_junit_xml: &str, +) { + let path_str = bundle_path.as_ref().to_str().unwrap(); + let xcresult = XCResult::new( + path_str, + ORG_URL_SLUG.clone(), + REPO_FULL_NAME.clone(), + use_experimental_failure_summary, + ); + assert!(xcresult.is_ok()); + + let mut junits = xcresult.unwrap().generate_junits(); + assert_eq!(junits.len(), 1); + let junit = junits.pop().unwrap(); + let mut junit_writer: Vec = Vec::new(); + junit.serialize(&mut junit_writer).unwrap(); + pretty_assertions::assert_eq!(String::from_utf8(junit_writer).unwrap(), expected_junit_xml); +} + +// `FileSource::TestFrame` is the only usable source. The failure is recorded inside +// the dependency, so `RaisedFrom`, `SourceCodeLocation` and the innermost +// `LastStackFrame` all point into `DerivedData/SourcePackages/checkouts/` and are +// rejected as vendored. The legacy path has only `DocumentLocation`, which points +// there too, so it reports nothing at all. +#[cfg(target_os = "macos")] +#[rstest] +#[case::experimental_failure_summary( + true, + include_str!("data/test-dependency-raises-failure.junit.xml") +)] +#[case::legacy_fallback( + false, + include_str!("data/test-dependency-raises-failure.legacy.junit.xml") +)] +fn test_dependency_raised_failure_uses_the_tests_own_file( + #[case] use_experimental_failure_summary: bool, + #[case] expected_junit_xml: &str, +) { + assert_junit( + TEMP_DIR_TEST_DEPENDENCY_RAISES_FAILURE + .as_ref() + .join("DependencyRaisesFailure.xcresult"), + use_experimental_failure_summary, + expected_junit_xml, + ); +} + +// `FileSource::TestFrame` versus `RaisedFrom` with nothing to separate them by path. +// The helper is in the test target, so `is_vendored_dependency` says nothing useful +// and the ordering of the sources is what decides. The legacy path, having only +// `DocumentLocation`, still lands on the helper. +#[cfg(target_os = "macos")] +#[rstest] +#[case::experimental_failure_summary( + true, + include_str!("data/test-in-repo-helper-raises-failure.junit.xml") +)] +#[case::legacy_fallback( + false, + include_str!("data/test-in-repo-helper-raises-failure.legacy.junit.xml") +)] +fn test_in_repo_helper_raised_failure_uses_the_tests_own_file( + #[case] use_experimental_failure_summary: bool, + #[case] expected_junit_xml: &str, +) { + assert_junit( + TEMP_DIR_TEST_IN_REPO_HELPER_RAISES_FAILURE + .as_ref() + .join("InRepoHelperRaisesFailure.xcresult"), + use_experimental_failure_summary, + expected_junit_xml, + ); +} + +// No source survives vetting. Neither test reaches its own frame — one crashes +// inside the dependency, the other is failed by the dependency's trait after its +// body returned — so there is no `TestFrame`, and every remaining candidate is +// either absent or vendored. Both cases must come out with no `file` attribute at +// all rather than the dependency's. +#[cfg(target_os = "macos")] +#[rstest] +#[case::experimental_failure_summary(true, include_str!("data/test-crash-in-dependency.junit.xml"))] +#[case::legacy_fallback(false, include_str!("data/test-crash-in-dependency.junit.xml"))] +fn test_crash_in_dependency_reports_no_file( + #[case] use_experimental_failure_summary: bool, + #[case] expected_junit_xml: &str, +) { + assert_junit( + TEMP_DIR_TEST_CRASH_IN_DEPENDENCY + .as_ref() + .join("CrashInDependency.xcresult"), + use_experimental_failure_summary, + expected_junit_xml, + ); +} + +// `TestIdentity::is_named_by` against real symbolication: Xcode spells the frame +// `-[ObjcXCTestTests testFailsInsideSharedHelper]`, not `Suite.testCase()`. The +// legacy path reports nothing here for an unrelated reason — the `DocumentLocation` +// candidates are keyed by test case name, and Xcode's Objective-C spelling never +// matches the `Suite.testCase` key the lookup builds. +#[cfg(target_os = "macos")] +#[rstest] +#[case::experimental_failure_summary(true, include_str!("data/test-objc-xctest.junit.xml"))] +#[case::legacy_fallback(false, include_str!("data/test-objc-xctest.legacy.junit.xml"))] +fn test_objc_xctest_helper_failure_uses_the_tests_own_file( + #[case] use_experimental_failure_summary: bool, + #[case] expected_junit_xml: &str, +) { + assert_junit( + TEMP_DIR_TEST_OBJC_XCTEST + .as_ref() + .join("ObjcXCTest.xcresult"), + use_experimental_failure_summary, + expected_junit_xml, + ); +} + +// `TestIdentity` with no suite: a top-level swift-testing `@Test func` symbolicates +// as the bare function, so there is nothing to qualify the match with. +#[cfg(target_os = "macos")] +#[rstest] +#[case::experimental_failure_summary( + true, + include_str!("data/test-toplevel-swift-testing.junit.xml") +)] +#[case::legacy_fallback( + false, + include_str!("data/test-toplevel-swift-testing.legacy.junit.xml") +)] +fn test_toplevel_swift_testing_helper_failure_uses_the_tests_own_file( + #[case] use_experimental_failure_summary: bool, + #[case] expected_junit_xml: &str, +) { + assert_junit( + TEMP_DIR_TEST_TOPLEVEL_SWIFT_TESTING + .as_ref() + .join("ToplevelSwiftTesting.xcresult"), + use_experimental_failure_summary, + expected_junit_xml, + ); +} + #[cfg(target_os = "macos")] #[test] fn test_expected_failures_xcresult_with_valid_path() {