[package] name = "tidal-stress" version = "0.1.0" edition.workspace = true rust-version.workspace = true description = "Open-loop load generator + capacity ramp for tidalDB's HTTP surface (standalone + multi-process cluster), modeling a thepeach-style feed workload" license.workspace = true # ── tidal-crate lint posture (single source of truth) ────────────────────── # IDENTICAL block across tidaldb / tidal-net / tidal-server / tidalctl. These # crates deliberately DO NOT inherit `[workspace.lints]`; they hold the embedded # recommendation DB + its transport/server/CLI to a stricter correctness bar # (`unsafe_code = forbid`, `clippy::all = deny`, `unwrap_used = deny`). # `unwrap_used = "deny"` is kept per-crate rather than in `[workspace.lints]` # because the workspace also hosts the example/consumer crates under # `applications/` (not held to the engine's bar). Keep these four blocks BYTE-IDENTICAL. [lints.rust] unsafe_code = "forbid" [lints.clippy] all = { level = "deny", priority = -1 } pedantic = { level = "warn", priority = -1 } nursery = { level = "warn", priority = -1 } # Justified allows: latency/rate math is pervasive usize<->u64<->f64 casting (a # load generator is nothing but counters and durations), so the lossy-cast # pedantic family is allowed exactly as the engine's ranking math allows it. cast_possible_truncation = "allow" cast_possible_wrap = "allow" cast_precision_loss = "allow" cast_sign_loss = "allow" module_name_repetitions = "allow" # Advisory pedantic/nursery style lints that are noise for a CLI load tool (and # which the engine crates already run at warn, not deny): help-text URLs/flags # read fine bare; `out.push_str(&format!(..))` is the clearest way to assemble a # report table; constructors take their config by value; const-ness of trivial # accessors churns. Correctness lints (clippy::all) stay DENY. doc_markdown = "allow" format_push_string = "allow" needless_pass_by_value = "allow" missing_const_for_fn = "allow" map_unwrap_or = "allow" unwrap_used = "deny" [dependencies] clap = { version = "4.5", features = ["derive", "env"] } serde = { version = "1", features = ["derive"] } serde_json = "1" thiserror = "2" tokio = { version = "1", features = ["macros", "rt-multi-thread", "sync", "time", "signal"] } tracing = "0.1" tracing-subscriber = { version = "0.3", features = ["env-filter"] } rand = "0.9" # Async HTTP only (no blocking client): rustls posture matches tidal-server / # tidal-net — drops the OpenSSL/native-tls system dependency for a clean static # build. `json` for the typed request/response bodies. reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls"] } [dev-dependencies] # Honest before/after for the generator's OWN per-request cost (no server, no # network): bench workload.next() construction and the latency-histogram record # path in isolation. Matches the engine crate's criterion posture. criterion = { version = "0.5", features = ["html_reports"] } # Test-only: the summary module's JSON is hand-rolled (no serializer dep on the # hot path), but the round-trip unit test parses it with a real strict parser so # a malformed-JSON regression is caught. serde_json = "1" [[bench]] name = "hotpath" harness = false