Real app journeys
The tests operate the iPhone app in a simulator: create and recover a wallet, receive and send, pay a person, coordinate shared savings, and use advanced signing or fee replacement.
A disposable Bitcoin test network supplies real blocks and transactions. Assertions check what appears on screen and what the node sees. Screenshots capture selected moments along the way.
App scenarios · Journey inventory · Results and captures
App state & protected actions
Smaller app tests isolate decisions that are difficult to exhaust through taps: changing a recipient after review, reopening saved state, separating networks, handling damaged files, and requiring device authentication.
They also check how wallet state becomes something understandable on screen, such as keeping a replaced payment beside its replacement.
App tests · App result bundles
Wallet & network rules
These checks exercise balances, fees, coin selection, backups, transaction relay, block headers, and compact filters. Controlled peers and damaged inputs test disagreement, disconnects, reorganization, and recovery.
Wallet and networking live together in WalletCore. Focused tests make failures in their shared rules easier to reproduce.
Wallet rules · Network cases · Job logs
Cryptography & data formats
Known-answer examples, including published Bitcoin test vectors, check keys, signatures, descriptors, and encodings. Invalid inputs and boundary cases check that malformed data is rejected.
A known-answer test compares with an expected result established outside the code being tested. It helps catch two pieces of our own code agreeing on the same mistake.
Primitive tests and vectors · Package results
Comparison with Bitcoin Core
“Differential” tests ask another implementation to judge our work. Bitcoin Core checks transactions, replacement fees, signing envelopes, and co-signing, while our wallet discovers and confirms payments through its peer protocol.
The fixture starts with its own fresh test chain. Passing shows agreement for the exercised cases and Core version.
Core comparisons · Isolated-node setup · Node evidence
Fuzzing & sanitizer runs
Fuzzing feeds many generated inputs into nine parsers, including transactions, network messages, and wallet imports. A fixed input sequence runs in routine CI; longer weekly runs rotate the sequence to explore further.
Address Sanitizer looks for memory errors. Thread Sanitizer looks for data races. A saved seed identifies the input sequence so a finding can be replayed and kept as a regression test.
Longer fuzz runs · Harness and replay guide · Seeds and reproducers
Debugging tools & live-network runs
Tool tests check command behavior and known fuzz regressions. Operators can also collect simulator logs or run a longer “soak” against public signet to observe peer connections, sync progress, and resource use over time.
These live observations depend on the network and machine used. A command’s help check does not exercise a live network run.
Tool tests · Diagnostics and soak guide · Field evidence
Release & website checks
Build checks verify dependency resolution, compiler warnings, and exclusion of test-only controls from the release app. Complexity and size reports make growth visible.
Website checks verify local links and images, and connect public feature descriptions to real app scenarios. They catch documentation drift; the scenario’s result still comes from its test run.
Build checks · Size reports · Website checks
When do these checks run?
Routine CI runs package and app checks, release-build checks, and the fixed fuzz corpus for pull requests and main. The full node and app-journey suites run for relevant code changes from this repository, on main, and on their nightly or explicitly dispatched runs. Fork pull requests do not use the dedicated node runner. Documentation-only changes can skip those node jobs.
The longer sanitizer workflow runs weekly or on request. Live-network soaks and device exercises are separate observations. A release invokes CI and node checks again. Read the node workflow, fuzz schedule, and release workflow for the exact conditions.