Testing & Simulation
Vier Test-Ebenen, alle pre-release verifiziert. Stand: 520 Rust-Tests grün + 3 ignored (regtest opt-in), 298 Svelte-Check-Files / 0 errors.
1. Unit-Tests
Pro Crate, reine Logik. cargo test --workspace läuft alle 16 Library-
Crates + 5 Binaries.
Wichtige Test-Counts (Stand Phase 19):
| Crate | Tests | Was |
|---|---|---|
warppool-config | ~24 | TOML-Schema, coinbase_splits, VarDiffSettings::validate |
warppool-storage | ~75 | sqlx-roundtrips, migrations, alle 10 Tabellen, vardiff, audit_log, api_tokens, admin_2fa, pool_settings |
warppool-api | ~80 | axum-handler-Tests gegen in-memory SQLite + mock-GitHub/SMTP-Server. Inkl. Phase 16-Tests (pool_metrics + notifier in /metrics) |
warppool-stratum-v1 | ~44 + 4 e2e | session-state-machine, ratelimit, vardiff (17 isoliert), TLS-roundtrip |
warppool-stratum-v2 | ~71 | noise-handshake, codec-roundtrips, session-frames, TDP-foundation |
warppool-translator | ~22 | extended-channel-state-machine, BIP-320-version-rolling, slushpool-prev-hash-reverse |
warppool-share-validator | ~17 | sha256d-vectors, dedup, network/pool-target-checks |
warppool-job-builder | ~32 | coinbase-construction, BIP-34-height-encoding, merkle-branches |
warppool-bitcoin-rpc | ~14 | RPC-envelope-parsing, ZMQ-frame-parsing |
warppool-notifier | 19 | render_text, EmailSink/SlackSink-construction, sink-skip-when-env-missing |
warppool-autoupdate | ~25 | version-compare, asset-matching, download_verified, atomic_swap, cosign-subprocess |
warppool-health | ~24 | RPC-call, bitcoin-conf-parser, snippet-generator, warnings-aggregation |
warppool-telemetry | ~27 | vendor-probes (AxeOS/cgminer-mock), mDNS-discovery, PoolMetrics+histogram |
warppool-profiles | 6 | profile-resolution, retention-monotonie |
warppool-hwdetect | 6 | sysinfo-detection, container-env, recommendation |
warppool-simulator | ~9 | sim-miner-personas, scenarios |
# Alles
cargo test --workspace
# Ein bestimmter Crate
cargo test -p warppool-share-validator
# Mit output
cargo test -p warppool-stratum-v2 -- --nocapture
2. Integration-Tests
Mehrere Crates in-process, axum-mock-server für externe Dienste. Pro Crate
unter tests/.
Typische Cases:
| Test | Crate | Was |
|---|---|---|
e2e.rs | stratum-v1 | TCP-Listener + ShareValidator + Sim-Miner-Roundtrip mit echtem subscribe/authorize/submit-Flow |
e2e_regtest.rs | bitcoin-rpc | #[ignore] — gegen laufendes bitcoind regtest |
update_apply_with_cosign_verify_but_no_env_returns_500 | api | axum-mock-GitHub + mock-asset-server |
metrics_renders_pool_counters_when_pool_metrics_set | api | /metrics-output gegen Prometheus-Format |
3. Simulation (dvb-warppool-sim)
Gegen den echten Daemon-Prozess (oder in-process spawned). Szenarien sind End-to-End-Stories.
Eingebaute Szenarien
| Szenario | Dauer | Status | Was es prüft |
|---|---|---|---|
solo-block-found | 30s | ✓ executable | Sim-Miner connectet, Block-Found-Event landet |
connection-storm-defense | 60s | ✓ executable | Rate-Limit greift bei N parallelen Auth-Versuchen |
enterprise-load-smoke | 5min | ✓ executable | N parallele Miner gemischter Persona laufen sauber |
small-24h-stability | 24h | Plan-only | Klein-Profil bleibt unter 200 MB, keine Panics |
rpc-outage-recovery | 10min | Plan-only | Pool übersteht 5-Minuten-RPC-Outage |
Aufruf
solo-block-found läuft self-contained — spawnt einen Stratum-V1-Server
in-process mit network_target=[0xff;32] (jeder valid Share wird BlockFound)
und einen JsonStratumMiner (Persona BitaxeUltra). Kein Bitcoin Core nötig:
dvb-warppool-sim scenario solo-block-found --duration 10
# → Result: BLOCK FOUND after 55 ms (worker=bc1qsim-bitaxe, job_id=sim-job-1)
dvb-warppool-sim scenario connection-storm-defense --duration 15 --attackers 200
# → Success: 10, RateLimit: 190, OtherErr: 0
# → OK: rate-limit hat 190x gegriffen (burst war 10)
dvb-warppool-sim scenario enterprise-load-smoke --duration 15 --miners 200
# → Accepted: 57400 (~3826 shares/s), Rejected: 0, Disconnects: 200
Personas
Sim-Miner ahmen reale Hardware nach (Hashrate, User-Agent, TLS-Support, Reconnect-Pattern):
| Persona | Nominal HRate | TLS | Anmerkung |
|---|---|---|---|
nerdminer-v2 | 50 GH/s | nein | Plain only |
bitaxe-ultra | 2 TH/s | ja | Sauberer Reconnect |
nerd-octaxe | 4.5 TH/s | ja | NerdNOS-Quirks |
avalon-q | 90 TH/s | nein | CGMiner-User-Agent |
antminer-s23-pro | 580 TH/s | ja | ASIC-Boost overt |
adversary | — | — | Boshafte Inputs |
Failure-Modes
dvb-warppool-sim failures <mode> injiziert Production-Probleme:
rpc-down— Bitcoin Core unreachablezmq-disconnect— Block-Notify wegtls-handshake-fail— abgelaufenes Certminer-hang— Connection hängt nach N Sharesnetwork-latency— künstliche RTTpacket-loss— N% Paket-Lossinvalid-template— kaputte CB-Txreorg— Tip wird zurückgerolltmemory-pressure— Pool unter RAM-Druckdisk-full— SQLite-Write-Fail
Security-Suite
dvb-warppool-sim security fährt adversarielle Inputs (Line-Flood, Connection-Storm,
Slowloris, Auth-Flood, Weak-Cipher, ...).
Correct outcome: jede Connection sauber abgelehnt, kein Panic, kein OOM.
4. Regtest E2E (Phase 15b — opt-in)
Für volles E2E mit echtem bitcoind regtest:
eval "$(scripts/regtest-up.sh)" # startet bitcoind regtest + setzt env-vars
cargo test -p warppool-bitcoin-rpc --test regtest_e2e -- --ignored --nocapture
scripts/regtest-down.sh --purge # cleanup
Drei #[ignore]-Tests gegen das laufende regtest:
| Test | Was |
|---|---|
regtest_blockchain_info_returns_regtest_chain | chain == "regtest" |
regtest_getblocktemplate_works | Template hat version + bits + prev-hash |
regtest_submit_invalid_block_is_rejected | Trivially invalid hex → Rejected (nicht Accepted, nicht Error) |
CI führt sie nicht aus (kein bitcoind im Runner-Image). Lokal sind sie sehr nützlich vor Release-Tags. Siehe Configuration Reference → WARPPOOL_E2E_REGTEST_*.
5. Performance Benchmarks (Phase 19 — opt-in)
Criterion-Suites für Hot-Paths:
| Crate | Bench | Hot-Path |
|---|---|---|
warppool-share-validator | validate | per accepted+rejected share |
warppool-job-builder | build_job | per neuem Template |
warppool-stratum-v1 | vardiff | per accepted share |
cargo bench --workspace
# oder
cargo bench -p warppool-share-validator --bench validate
Siehe Performance Benchmarks für Baseline-Zahlen und Interpretation.
6. UI-Side (svelte-check)
cd ui
pnpm install
pnpm svelte-check
# → 294 files / 0 errors / 1 pre-existing warning
Pre-existing warning: Unused CSS selector "th.num" in blocks/+page.svelte
— historisches Artefakt aus Phase 4, kein Funktionsproblem.
CI
.github/workflows/ci.yml Matrix:
cargo fmt --check(no diff)cargo clippy --workspace --all-targets -- -D warningscargo test --workspacecargo deny check(license + advisories)cargo audit- UI-Job:
pnpm install+pnpm svelte-check+pnpm build
Separate Workflows (siehe Architecture):
release.yml— Tag-Triggered: Multi-arch Docker + native binaries + SLSA-3 + SBOMrepro.yml— Reproducible-Builds-Verify (zweimal bauen + sha256-diff)docs.yml— mdBook → GitHub Pagesbenches.yml— Criterion (manual-dispatch + tag-push, nicht-PR)