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):

CrateTestsWas
warppool-config~24TOML-Schema, coinbase_splits, VarDiffSettings::validate
warppool-storage~75sqlx-roundtrips, migrations, alle 10 Tabellen, vardiff, audit_log, api_tokens, admin_2fa, pool_settings
warppool-api~80axum-handler-Tests gegen in-memory SQLite + mock-GitHub/SMTP-Server. Inkl. Phase 16-Tests (pool_metrics + notifier in /metrics)
warppool-stratum-v1~44 + 4 e2esession-state-machine, ratelimit, vardiff (17 isoliert), TLS-roundtrip
warppool-stratum-v2~71noise-handshake, codec-roundtrips, session-frames, TDP-foundation
warppool-translator~22extended-channel-state-machine, BIP-320-version-rolling, slushpool-prev-hash-reverse
warppool-share-validator~17sha256d-vectors, dedup, network/pool-target-checks
warppool-job-builder~32coinbase-construction, BIP-34-height-encoding, merkle-branches
warppool-bitcoin-rpc~14RPC-envelope-parsing, ZMQ-frame-parsing
warppool-notifier19render_text, EmailSink/SlackSink-construction, sink-skip-when-env-missing
warppool-autoupdate~25version-compare, asset-matching, download_verified, atomic_swap, cosign-subprocess
warppool-health~24RPC-call, bitcoin-conf-parser, snippet-generator, warnings-aggregation
warppool-telemetry~27vendor-probes (AxeOS/cgminer-mock), mDNS-discovery, PoolMetrics+histogram
warppool-profiles6profile-resolution, retention-monotonie
warppool-hwdetect6sysinfo-detection, container-env, recommendation
warppool-simulator~9sim-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:

TestCrateWas
e2e.rsstratum-v1TCP-Listener + ShareValidator + Sim-Miner-Roundtrip mit echtem subscribe/authorize/submit-Flow
e2e_regtest.rsbitcoin-rpc#[ignore] — gegen laufendes bitcoind regtest
update_apply_with_cosign_verify_but_no_env_returns_500apiaxum-mock-GitHub + mock-asset-server
metrics_renders_pool_counters_when_pool_metrics_setapi/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

SzenarioDauerStatusWas es prüft
solo-block-found30s✓ executableSim-Miner connectet, Block-Found-Event landet
connection-storm-defense60s✓ executableRate-Limit greift bei N parallelen Auth-Versuchen
enterprise-load-smoke5min✓ executableN parallele Miner gemischter Persona laufen sauber
small-24h-stability24hPlan-onlyKlein-Profil bleibt unter 200 MB, keine Panics
rpc-outage-recovery10minPlan-onlyPool ü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):

PersonaNominal HRateTLSAnmerkung
nerdminer-v250 GH/sneinPlain only
bitaxe-ultra2 TH/sjaSauberer Reconnect
nerd-octaxe4.5 TH/sjaNerdNOS-Quirks
avalon-q90 TH/sneinCGMiner-User-Agent
antminer-s23-pro580 TH/sjaASIC-Boost overt
adversaryBoshafte Inputs

Failure-Modes

dvb-warppool-sim failures <mode> injiziert Production-Probleme:

  • rpc-down — Bitcoin Core unreachable
  • zmq-disconnect — Block-Notify weg
  • tls-handshake-fail — abgelaufenes Cert
  • miner-hang — Connection hängt nach N Shares
  • network-latency — künstliche RTT
  • packet-loss — N% Paket-Loss
  • invalid-template — kaputte CB-Tx
  • reorg — Tip wird zurückgerollt
  • memory-pressure — Pool unter RAM-Druck
  • disk-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:

TestWas
regtest_blockchain_info_returns_regtest_chainchain == "regtest"
regtest_getblocktemplate_worksTemplate hat version + bits + prev-hash
regtest_submit_invalid_block_is_rejectedTrivially 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:

CrateBenchHot-Path
warppool-share-validatorvalidateper accepted+rejected share
warppool-job-builderbuild_jobper neuem Template
warppool-stratum-v1vardiffper 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 warnings
  • cargo test --workspace
  • cargo 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 + SBOM
  • repro.yml — Reproducible-Builds-Verify (zweimal bauen + sha256-diff)
  • docs.yml — mdBook → GitHub Pages
  • benches.yml — Criterion (manual-dispatch + tag-push, nicht-PR)