96fd32796e
Lands the fake HTTP server, the patch fixture pipeline, and the first two scenarios that exercise the real FFI path end-to-end. Plus a test that would have caught the patch-to-release rollback bug (shorebirdtech/shorebird#3728). Architecture follows the principles surfaced in review: - Dart tests call the public `ShorebirdUpdater` API only — never the raw `Updater` FFI wrapper, never the engine API. - Engine API stays inside the `library_test_hooks` Rust crate. `shorebird_test_init` constructs `AppParameters` + stub `FileCallbacks` internally so Dart never sees those types. `shorebird_test_simulate_successful_launch` wraps the start/success protocol so the Dart layer never knows there's a protocol — it just knows "the engine reported a successful boot." - ffigen scans only the test_hooks header. The engine header (updater_engine.h) does not appear in the Dart bindings. - A `TestEngine` Dart helper concentrates engine-side simulation in one place; the test bodies stay focused on `ShorebirdUpdater`. Implementation choices worth flagging: - FFI calls run via `Isolate.run`. Synchronous run blocks the main isolate, deadlocking against the in-isolate shelf server. The test's IsolateRun callback re-opens the cdylib (cheap: dlopen is ref-counted) and resets `Updater.bindings` in the sub-isolate because Dart isolates do not share static fields. - `libapp_path` must be a real file on the desktop integration build: the non-Android non-iOS non-test `patch_base` reads it directly from disk. Tests that install a patch write the fixture's `base` bytes to `libapp.so` before init. - Fake server kept minimal: shelf, no Range support, no auth, no concurrency knobs. Stage 3+ scenarios (download cutoff, hash mismatch loop, etc.) extend it as needed. Three scenarios cover three reasons we wanted this suite: 1. `checkForUpdate returns upToDate when server has no patch` — baseline: confirms the harness boots cleanly and returns the expected enum. 2. `install a patch and boot from it` — golden path: check → update → simulateSuccessfulLaunch, then assert `readCurrentPatch` / `readNextPatch` / `checkForUpdate` transitions match the public API contract. 3. `checkForUpdate returns restartRequired after patch-to-release rollback` — regression for shorebirdtech/shorebird#3728. Pre-fix this returned `upToDate` and left no signal to prompt a restart. Verified locally: 232 Rust unit tests + 44 Dart tests (41 existing unit + 3 new integration) green; clippy/fmt/cspell clean.
101 lines
1.3 KiB
YAML
101 lines
1.3 KiB
YAML
$schema: https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json
|
|
version: "0.2"
|
|
ignorePaths:
|
|
- target
|
|
- build
|
|
- "**/*.g.dart"
|
|
# Flutter platform directories with per-platform build files
|
|
- windows
|
|
- macos
|
|
- linux
|
|
- ios
|
|
- android
|
|
words:
|
|
- aarch
|
|
- androideabi
|
|
- apks
|
|
- armeabi
|
|
- armv7
|
|
- autogen
|
|
- bidiff
|
|
- bipatch
|
|
- bootable
|
|
- buildlog
|
|
- buildroot
|
|
- bundletool
|
|
- carryforward
|
|
- cbindgen
|
|
- cdylib
|
|
- classpath
|
|
- clippy
|
|
- codegen
|
|
- comde
|
|
- compatch
|
|
- Condvar
|
|
- datadir
|
|
- debuginfo
|
|
- declspec
|
|
- Decompressor
|
|
- dllexport
|
|
- dlopen
|
|
- downloadables
|
|
- EDQUOT
|
|
- EACCES
|
|
- embedders
|
|
- EOCD
|
|
- endtemplate
|
|
- ENOSPC
|
|
- EROFS
|
|
- eseidel
|
|
- ffigen
|
|
- gclient
|
|
- hdpi
|
|
- ifdef
|
|
- libapp
|
|
- libc
|
|
- libflutter
|
|
- libupdater
|
|
- logcat
|
|
- malloc
|
|
- memmap
|
|
- mmap
|
|
- mockall
|
|
- mocktail
|
|
- msvc
|
|
- nscloud
|
|
- oslog
|
|
- pubspec
|
|
- repr
|
|
- reqwest
|
|
- rlib
|
|
- rsplit
|
|
- rollouts
|
|
- RTLD
|
|
- rustflags
|
|
- rustls
|
|
- rustup
|
|
- serde
|
|
- shorebirdtech
|
|
- SIGBUS
|
|
- sigstore
|
|
- staticlib
|
|
- subosito
|
|
- swiftpm
|
|
- symbolication
|
|
- ureq
|
|
- unbootable
|
|
- unbooted
|
|
- unreviewable
|
|
- unwritable
|
|
- usize
|
|
- Swatinem
|
|
- taiki
|
|
- Verdana
|
|
- vmcode
|
|
- withf
|
|
- xlink
|
|
- zstandard
|
|
- zstd
|
|
- xcodeproj
|
|
- pbxproj
|