Repository navigation
Remove crates/xmtp_sdk/conformance - #4458
Merged
Merged
Conversation
Move the durable platform proofs to their owners and delete the directory. - Bridge runtime unit tests, codec policy and projection tests move to apps/xmtp_sdk_bindgen/runtime-tests/ts (`just sdk test-bridge`). - Chromium, real WASM, storage, package, logging, attachment, decode-once, stream-opening, pure codec and panic proofs and the object-store relay move to sdks/browser/test/platform (`just sdk test-browser`). - Swift reader and listener seam proofs become XCTest cases that use the runtime fakes and @testable import. Delete inject_reader_gate.py and inject_event_start_hook.py, the Swift staging and the Swift CI job. - Swift and Kotlin negative consumers and the missing-bundle check get `just ios check-consumer` and `just android check-consumers`. - Remove the CI double runs, the conformance recipes and drivers, and the conformance exports and cfg arms that lost their last caller. - Wait for an idle worker state in package.chromium.mts instead of a termination count that a late worker could pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- test-android.yml runs `just android check-consumers` after the unit tests. The old `just sdk conformance kotlin` step was the only CI run of the Kotlin negative consumers. - ReaderTeardownTests puts a limit on every wait and reports a timeout: the first delivery, the awaits after a gate release, the end and failure reads, and each cancelled task. - The Swift consumer executable exits 1 on an unexpected error instead of throwing at top level. - The PROC-041 waiver names ReaderTeardownTests instead of the deleted conformance files. - After the rebase onto #4425: format the merged imports, and say in the bindgen README that the runtime tests import the generated runtime. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#4438 made SDKClient.conversations a property and replaced SDKClient.conversationStream with Conversations.stream(options:). Use the new forms, and say in the doc comment that the public message streams resolve their owner through ClientRegistry before they call makeSDKMessageStream. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#4438 committed the generated copy with // where the generator source has ///, so every just ios check rewrote it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
ApprovabilityVerdict: Skipped Macroscope did not run approvability analysis for this PR. This PR modifies 1 file matched by one or more of your You can add or adjust custom eligibility rules. Learn more. |
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## self-hosted #4458 +/- ##
===============================================
- Coverage 87.87% 87.86% -0.01%
===============================================
Files 539 539
Lines 102659 102659
===============================================
- Hits 90207 90204 -3
- Misses 12452 12455 +3 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
The conformance removal moved the Swift seam proofs and both consumer checks into test-ios and test-android, which do not gate merge. Before, the Swift job and the Kotlin JVM conformance step ran them in test-sdk, which gates the aggregate Test check. - test-sdk.yml: restore the run_swift input and the macOS Swift job. It runs `just ios test-seams` (ReaderTeardownTests, ListenerGateTests) through `just backend ci`, then `just ios check-consumer`. The Android staging job runs `just android check-consumers`. - test.yml: restore the sdk_swift filter and the run_swift wiring. The sdk and sdk_swift filters also list the moved proof and consumer paths under sdks/, which crates/** used to cover. - test-ios.yml runs `just ios test skip-seams` and drops its consumer step; test-android.yml drops its consumer step. No CI run does the same check twice. - ios.just: `test-seams` and `test skip-seams` share one pattern. A recipe test checks that they select and skip the same tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… changes Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The ported test only called onEvent after stopListener returned. It did not hold a call that had started before stop. The generated trampoline starts an unstructured task for each native onEvent call, so the started-but-not-run window is a pending task. A test-only TaskExecutor now holds that task before the runtime's onEvent runs. The test calls stopListener (and, for a second held call, Client.end) while the call is held, releases it, and checks that the callback did not run and that each call returned. The shipped runtime is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
crates/xmtp_sdk/conformanceno longer exists. Every durable proof moved and runs from a new recipe. A proof was rewritten only where it used an injected seam.apps/xmtp_sdk_bindgen/runtime-tests/ts(just sdk test-bridge).sdks/browser/test/platform(just sdk test-browser).ReaderTeardownTests, one newListenerGateTestscase). They use@testable importand the existing fakes. The two Python injectors are deleted, so Swift CI no longer runs patched FFI glue.sdks/ios/Tests/Consumer(just ios check-consumer).sdks/android/library/src/test/negative(just android check-consumers).sdk_conformance_*exports without a caller are deleted, with theconformancefeature arms that only they used.Targets
self-hosted.Changes
bridge-*.tsfiles,bridge.test.ts,codec-policy.test.ts,public-projection.test.ts,public-objects.test.ts,reader-consumer.test.ts,vitest.config.mtsandlogging-wait.tsgo toapps/xmtp_sdk_bindgen/runtime-tests/ts/.browser/*files,ts/logging-contract.tsandts/transfer-control.mtsgo tosdks/browser/test/platform/.sdks/browser/test/platform/object-store/.sdks/ios/Tests/Consumer/Negative/. Kotlin negative consumers go tosdks/android/library/src/test/negative/.sdk.just: theconformance*recipes are removed. New recipes:test-bridge,test-browser,test-browser-storage,test-browser-package.conformance-browser,conformance-kotlin,conformance-swift,conformance-generate,stage-conformance-swift(.py),run-conformance-swift-app,check-swift-entrypoint,inject_reader_gate.py,inject_event_start_hook.py.just ios check-consumerandjust android check-consumers. Both build against the repo with no patched copy. The Gradle check adds one negative file at a time to the unit test sources through thexmtpNegativeConsumerproperty and never writes to the tree.test-sdk.yml: keeps therun_swiftinput and macOSswiftjob, which now runsjust ios test-seamsandjust ios check-consumer.just android check-consumersruns in theandroid-stagejob. The Kotlin JVM conformance step is removed. The other steps are renamed to "Bridge runtime unit tests" and "Browser platform proofs".test.yml: keeps thesdk_swiftfilter andrun_swiftwiring. Thesdkandsdk_swiftfilters list the movedsdks/paths.sdks/browser/test/platform/**is added to thesdkfilter.test-ios.ymlrunsjust ios test skip-seamsso the seam proofs run once, intest-sdk.yml.test-ios.ymlandtest-android.ymlno longer run the consumer checks.test-sdk-artifacts.py(ran in two jobs);test-pure-wasm.mjs(ran in lint and package-scripts);bridge.real.mtsandbridge.values.real.mts(ran again outside the generated test).sdks/browser/tsconfig.jsonexcludestest/platform, and.oxlintrc.jsonignores it. These proofs need fixture builds undertarget/that the JS lint job does not build.oxfmt --checkcovers them now.src/client/event_conformance.rs,conformance_queue_countsand thexmtp_eventsconformancefeature. Droppedfeature = "conformance"from thexmtp_mlsbuilder.rsandserver_configuration.rscfgs. Deleted the native arms ofsdk_conformance_emitandsdk_conformance_sink_error_count. The wasm32 arms and the decode-once and standard-sample exports stay, because moved proofs call them.package.chromium.ts: a newwaitForIdle()replaces a racyterminated === countwait ("worker termination missing: expected 8, got 9").StreamMethods.swifthas two comment lines changed from//to///. This is thedev/bindingsoutput and matches its generator source. The drift came from feat(sdk): unify conversation and message stream methods #4438.crates/xmtp_sdk/AGENTS.md,sdks/{browser,ios,android}/AGENTS.md,.github/workflows/AGENTS.md,apps/xmtp_sdk_bindgen/README.md,docs/specs/waivers.toml(PROC-041 waiver),docs/self-hosted/sdk-migration/handoff.md.Deleted tests and their coverage
checkReaderAppError(PROC-052, PROC-031, PROC-041)ReaderTeardownTests.testAppErrorEndsTheReaderWithoutAcknowledgingTheItemcheckCooperativeReaderOpeningCancellation(PROC-041)ReaderTeardownTests.testCancellationReachesACooperativeOpencheckLateReaderOpeningCleanup(PROC-041)ReaderTeardownTests.testCloseWaitsForALateOpenToEndItsReadercheckReaderReleasedBeforeIterationEndsReaderTeardownTests.testIterationEndsAfterTheReaderIsReleasedcheckConversationReaderOpensBeforeDeliveryReaderTeardownTests.testConversationStreamDeliversAGroupCreatedAfterItsReaderOpenscheckConnectionStateMonitor(PROC-044)ReaderTeardownTests.testStateMonitorStopsAtClosedAndReportsTheOpeningStatecheckDelayedListenerStop(EVENT-053)ListenerGateTests.testCallbackHeldAtItsStartDoesNotRunAfterStop--missing-bundleand 3 negative consumerssdks/ios/Tests/Consumerviajust ios check-consumerjust android check-consumersEach Swift port was shown to fail when its behavior was broken (for example,
SDKReaderIterator.deinit {}fails the app-error test).Spec backlinks moved:
ReaderLoopExit.swiftReaderTeardownTests.testAppErrorEndsTheReaderWithoutAcknowledgingTheItemReaderOpeningCancellation.swifttestCancellationReachesACooperativeOpen,testCloseWaitsForALateOpenToEndItsReaderReaderSeams.swifttestStateMonitorStopsAtClosedAndReportsTheOpeningStateReaderSeams.swiftListenerGateTests.testCallbackHeldAtItsStartDoesNotRunAfterStopjust spec-checkis unchanged from the base: 0 errors, 34 warnings, 467 requirements with evidence.Plan claims that proved wrong
sdks/browser/test/platform/object-store.main()and two negative consumers.CallerCancellationwas already handled by PR 2.sdk_conformance_watch_text_decodeandtext_decode_countare not deleted. The decode-once proof needs them.sdk.just. They need the Rust-shell fixture builds incrates/xmtp_sdk/dev.Reviewer checks
makeSDKMessageStreamdirectly.StreamOwnerTestscovers the owner lookup they skip.test-iosandtest-androiddo not gate merge. The Swift seam proofs and both consumer checks run only there.sdk-artifacts.pygenerator hash covers all ofapps/xmtp_sdk_bindgen/, so a change to these tests asks forjust sdk buildbeforejust sdk render.nix/package/ios.nixline 1 still says "as conformance" in a comment. It is left to avoid a source-hash change.Local verification
All passed at
a6d57f74bc5bb545c0099ffc122614b32376904f:cargo check -p xmtp_events -p xmtp_mls -p xmtp_sdk --testscargo check -p xmtp_sdk --features conformanceandcargo check -p xmtp_mls --features conformancecargo clippy -p xmtp_sdk -p xmtp_events -p xmtp_mls --features xmtp_sdk/conformance --no-deps -- -Dwarningscargo test -p xmtp-sdk-bindgen conformance_methods(2 passed)just sdk build node,browser,just sdk generate node,browser,just sdk test-bridge(6 files, 761 tests)NIX_DEVSHELL=js just sdk test-browser(all real-WASM and Chromium proofs, Playwright 9/9)lint-generatedtsc line for the three platform filesjust ios build, thenswift test --filter "XmtpSdkTests.(ReaderTeardownTests|ListenerGateTests)"(10 passed)just ios check-consumerjust android build, thenjust android check-consumersjust spec-check,just lint-markdown,just lint-configswiftformat --lintinsdks/ios;oxfmt --checkon the moved TypeScript and.oxlintrc.json;oxlint .insdks/browsertest-sdk-packaging.py -k test_bridge_fixture_builds_use_rust_shellNot run locally: full
just lint,just sdk lint,just test crate xmtp_sdk, and the full iOS, Android and JS suites. CI runs them.🤖 Generated with Claude Code
Note
Remove
crates/xmtp_sdk/conformanceand relocate its tests into per-SDK suitesapps/xmtp_sdk_bindgen/runtime-tests/ts, browser proofs move tosdks/browser/test/platform, and Swift/Kotlin negative consumers move into the iOS and Android SDK test sources.just sdk conformance*recipes withtest-bridge,test-browser,test-browser-storage, andtest-browser-packagein sdk.just. Adds new runnersrun-bridge-testsandrun-browser-platform-testsundercrates/xmtp_sdk/dev.just ios check-consumer,test-seams) and Android consumer checks (just android check-consumers), including new listener-gate and reader-teardown Swift tests.test-sdkruns the new bridge/browser recipes and moves Swift seam proofs to the Swift job;test-iosskips seam proofs now run by the SDK workflow.conformancefeature lose some exports —xmtp_eventsno longer declaresconformance,Subscription::conformance_queue_countsandxmtp_sdknon-WASMsdk_conformance_emit/sdk_conformance_sink_error_countexports are removed, andClientBuilder/ServerConfigurationHandle.with_application_componentsgates dropconformance(see Cargo.toml, bus.rs, logging.rs).Macroscope summarized d536a0b.