diff --git a/Cargo.lock b/Cargo.lock
index 7857da51..1044e0e3 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -406,7 +406,7 @@ dependencies = [
"cap-std",
"chutoro-bench-datasets",
"chutoro-test-support",
- "mockall",
+ "mockall 0.13.1",
"proptest",
"rstest",
"rstest-bdd",
@@ -430,6 +430,7 @@ dependencies = [
"chutoro-providers-dense",
"criterion",
"flate2",
+ "mockable",
"proptest",
"rand 0.8.7",
"rstest",
@@ -451,6 +452,7 @@ dependencies = [
"chutoro-providers-text",
"chutoro-test-support",
"clap",
+ "mockable",
"parquet",
"rstest",
"tempfile",
@@ -469,6 +471,7 @@ dependencies = [
"lru",
"metrics",
"metrics-util",
+ "mockable",
"num-traits",
"proptest",
"rand 0.8.7",
@@ -494,6 +497,7 @@ dependencies = [
"bytes",
"chutoro-core",
"chutoro-test-support",
+ "mockable",
"parquet",
"proptest",
"rstest",
@@ -516,6 +520,7 @@ dependencies = [
name = "chutoro-test-support"
version = "0.1.0"
dependencies = [
+ "mockable",
"rstest",
"tracing",
"tracing-subscriber",
@@ -784,6 +789,12 @@ dependencies = [
"syn 2.0.119",
]
+[[package]]
+name = "difflib"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8"
+
[[package]]
name = "digest"
version = "0.11.3"
@@ -882,6 +893,15 @@ dependencies = [
"zlib-rs",
]
+[[package]]
+name = "float-cmp"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4"
+dependencies = [
+ "num-traits",
+]
+
[[package]]
name = "fluent"
version = "0.17.0"
@@ -1467,6 +1487,31 @@ dependencies = [
"simd-adler32",
]
+[[package]]
+name = "mockable"
+version = "3.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "696033a748f67c97f2169b29b428fbab0d12317707cede1ca62fcb786e80b7fe"
+dependencies = [
+ "mockall 0.11.4",
+ "tracing",
+]
+
+[[package]]
+name = "mockall"
+version = "0.11.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4c84490118f2ee2d74570d114f3d0493cbf02790df303d2707606c3e14e07c96"
+dependencies = [
+ "cfg-if",
+ "downcast",
+ "fragile",
+ "lazy_static",
+ "mockall_derive 0.11.4",
+ "predicates 2.1.5",
+ "predicates-tree",
+]
+
[[package]]
name = "mockall"
version = "0.13.1"
@@ -1476,11 +1521,23 @@ dependencies = [
"cfg-if",
"downcast",
"fragile",
- "mockall_derive",
- "predicates",
+ "mockall_derive 0.13.1",
+ "predicates 3.1.4",
"predicates-tree",
]
+[[package]]
+name = "mockall_derive"
+version = "0.11.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22ce75669015c4f47b289fd4d4f56e894e4c96003ffdf3ac51313126f94c6cbb"
+dependencies = [
+ "cfg-if",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
[[package]]
name = "mockall_derive"
version = "0.13.1"
@@ -1508,6 +1565,12 @@ dependencies = [
"smallvec",
]
+[[package]]
+name = "normalize-line-endings"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be"
+
[[package]]
name = "nu-ansi-term"
version = "0.50.3"
@@ -1724,6 +1787,20 @@ dependencies = [
"zerocopy",
]
+[[package]]
+name = "predicates"
+version = "2.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59230a63c37f3e18569bdb90e4a89cbf5bf8b06fea0b84e65ea10cc4df47addd"
+dependencies = [
+ "difflib",
+ "float-cmp",
+ "itertools",
+ "normalize-line-endings",
+ "predicates-core",
+ "regex",
+]
+
[[package]]
name = "predicates"
version = "3.1.4"
@@ -2464,6 +2541,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
dependencies = [
"proc-macro2",
+ "quote",
"unicode-ident",
]
diff --git a/Cargo.toml b/Cargo.toml
index f86d3476..7f056d40 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -22,9 +22,11 @@ arrow-array = "59.2.0"
arrow-schema = "59.2.0"
num-traits = "0.2.19"
parquet = "59.2.0"
+mockable = "3.0.0"
[workspace.lints.clippy]
pedantic = { level = "warn", priority = -1 }
+disallowed_methods = "deny"
# 1. hygiene
allow_attributes = "deny"
diff --git a/chutoro-benches/Cargo.toml b/chutoro-benches/Cargo.toml
index 1796eb9f..eb8a0995 100644
--- a/chutoro-benches/Cargo.toml
+++ b/chutoro-benches/Cargo.toml
@@ -13,6 +13,7 @@ chutoro-core = { path = "../chutoro-core" }
chutoro-providers-dense = { path = "../chutoro-providers/dense" }
criterion = { version = "0.5.1", features = ["html_reports"] }
flate2 = "1.1.9"
+mockable = { workspace = true }
rand = { version = "0.8.5", features = ["small_rng"] }
strsim = "0.11.1"
thiserror = "2.0.17"
@@ -59,6 +60,7 @@ harness = false
# and updated to stay in sync.
[lints.clippy]
pedantic = { level = "warn", priority = -1 }
+disallowed_methods = "deny"
# 1. hygiene
allow_attributes = "deny"
diff --git a/chutoro-benches/benches/hnsw.rs b/chutoro-benches/benches/hnsw.rs
index f144e532..2cbd5f77 100644
--- a/chutoro-benches/benches/hnsw.rs
+++ b/chutoro-benches/benches/hnsw.rs
@@ -9,6 +9,7 @@ use criterion::{
BatchSize, BenchmarkGroup, BenchmarkId, Criterion, black_box, criterion_main,
measurement::WallTime,
};
+use mockable::{DefaultEnv, Env};
use chutoro_benches::{
criterion_support::{
@@ -257,8 +258,8 @@ fn hnsw_build(c: &mut Criterion) {
}
}
-fn should_collect_memory_profile() -> bool {
- if let Ok(value) = std::env::var("CHUTORO_BENCH_HNSW_MEMORY_PROFILE") {
+fn should_collect_memory_profile_with_env(env: &dyn Env) -> bool {
+ if let Some(value) = env.string("CHUTORO_BENCH_HNSW_MEMORY_PROFILE") {
let normalized = value.trim().to_ascii_lowercase();
if matches!(normalized.as_str(), "0" | "false" | "off") {
return false;
@@ -270,17 +271,21 @@ fn should_collect_memory_profile() -> bool {
!is_benchmark_discovery() && !is_exact_benchmark_probe()
}
-fn memory_report_path() -> PathBuf {
- std::env::var_os("CHUTORO_BENCH_HNSW_MEMORY_REPORT_PATH")
+fn memory_report_path_with_env(env: &dyn Env) -> PathBuf {
+ env.os_string("CHUTORO_BENCH_HNSW_MEMORY_REPORT_PATH")
.map_or_else(|| PathBuf::from(MEMORY_REPORT_PATH), PathBuf::from)
}
fn profile_hnsw_memory_impl() -> Result