mirror of
https://github.com/priyanshujain/sanderling.git
synced 2026-10-02 11:07:10 +00:00
* fix(runner): surface non-deadline WaitForIdle errors Previously the WaitForIdle return value was discarded entirely, hiding real driver failures (gRPC transport errors, sidecar crashes) behind the expected deadline-exceeded case. Log non-deadline errors so they are visible without changing control flow. * chore(sample-app): drop unused uptime_millis extractor Registered in SampleApplication but never consumed by spec.ts. * fix(sample-app): drop trivial appIsRunning property app_state was hardcoded to 'running' so the property was a tautology that could never fail. Removing both the extractor and the property is the simplest fix; demo-grade properties that can fail land next. * feat(sample-app): add Reset button that zeroes clickCount Pairs with the next commit's tap-reset action so the fuzzer can violate clickCountNeverDecreases and demonstrate uatu actually finding a property violation. * feat(sample-app): add tap-reset action to exercise Reset button Weighted at 10/122, fuzzer reaches it within a short run. Pairs with the Reset button to demonstrate uatu detecting the clickCountNeverDecreases violation. * fix(runner): filter WaitForIdle errors via context state, not errors.Is errors.Is(err, context.DeadlineExceeded) misses gRPC's wrapped status.DeadlineExceeded, so every step under the maestro driver logged a spurious warning. Check idleCtx.Err() instead — captures both deadline-fired and parent-canceled cases regardless of how the driver wraps them. * chore(sample-app): tune action weights so demo violates in ~30s Prior weights left tap-reset rare enough that short demo runs missed the violation by chance. Bumped to 30/107, with typeUsername reduced since username noise doesn't help exercise clickCount. * refactor(runner): route warnings through slog Adds Options.Logger (defaults to slog.Default()) and converts the three warning sites that were using fmt.Printf. Progress line stays on Printf since it's user-facing UI, not a log. Makes the warnings testable via a capturing handler. * test(runner): assert WaitForIdle driver errors are logged Captures slog output via TextHandler into a buffer and asserts the warning message + injected error text appear when the mock driver returns a non-context error from WaitForIdle. Guards against a regression of the silent-error swallow.
uatu sample app
Tiny Android app wired to the uatu SDK, plus a TypeScript spec that drives it. Use it as a reference for integrating uatu into your own app.
Prerequisites
uatuCLI onPATH(see getting started)- Android SDK installed (uatu auto-discovers
adbandemulatorunder$ANDROID_HOME,~/Library/Android/sdk, or the Homebrew cask; nothing to export if you use a standard install) justtask runner
Install the app
just install
Run a test
just test
If no device is connected, uatu boots the single AVD it finds. With multiple AVDs, pick one:
just AVD=Pixel_7 test
Persistent settings can live in .env alongside the justfile:
AVD=Pixel_7
DURATION=5m
Traces land in ./runs/<timestamp>/.
How the pieces connect
android/build.gradle.ktsdepends onio.github.priyanshujain:sdk-androidfrom Maven Centralandroid/src/main/kotlin/.../SampleApplication.ktcallsUatu.start(this)and registers snapshot extractors (app_state,click_count)spec.tsimports@uatu/spec(seepackage.json), reads those snapshots, asserts properties on them, and weights the actions the fuzzer picks fromjust testinvokesuatu testagainst the installed APK on the connected device (or the AVD named viaAVD=)