makepad/libs/asset/store/tests/budgets.rs
Admin 8436f955d6 Land the Asset Server protocol stack from rik2.
data, client, store, and chat — the contract Asset UI and VJ speak.
2026-08-18 14:23:59 +02:00

118 lines
3.9 KiB
Rust

//! Budget validation: invalid budgets refuse `open` before anything touches
//! disk, so every later integer-domain cast (c_int binds, i64 columns) is
//! backed by an enforced invariant instead of a hope.
mod common;
use common::*;
use makepad_asset_store::{budget::MAX_IO_CHUNK_BYTES, AssetServerCore, Budgets, ServerError};
fn refuse(name: &str, budgets: Budgets, expect_what: &'static str) {
let root = test_root(name);
let err = match AssetServerCore::open(&root, budgets) {
Ok(_) => panic!("{name}: invalid budget accepted"),
Err(e) => e,
};
match err {
ServerError::InvalidInput { what } => assert_eq!(what, expect_what, "{name}"),
other => panic!("{name}: expected InvalidInput, got {other}"),
}
assert!(!root.exists(), "{name}: refused open must not create the root");
}
#[test]
fn invalid_budgets_refuse_open_before_touching_disk() {
let d = Budgets::default_v1;
refuse("chunk0", Budgets { io_chunk_bytes: 0, ..d() }, "budget io_chunk_bytes");
refuse(
"chunkbig",
Budgets { io_chunk_bytes: MAX_IO_CHUNK_BYTES + 1, ..d() },
"budget io_chunk_bytes",
);
refuse("blob0", Budgets { max_blob_bytes: 0, ..d() }, "budget max_blob_bytes");
refuse(
"blobbig",
Budgets { max_blob_bytes: i64::MAX as u64 + 1, ..d() },
"budget max_blob_bytes",
);
refuse("manifest0", Budgets { max_manifest_bytes: 0, ..d() }, "budget max_manifest_bytes");
refuse(
"manifestbig",
Budgets { max_manifest_bytes: i32::MAX as u64 + 1, ..d() },
"budget max_manifest_bytes",
);
refuse(
"payloadbig",
Budgets { max_job_payload_bytes: i32::MAX as u64 + 1, ..d() },
"budget max_job_payload_bytes",
);
refuse("lease0", Budgets { max_lease_ms: 0, ..d() }, "budget max_lease_ms");
refuse(
"leasebig",
Budgets { max_lease_ms: i64::MAX as u64 + 1, ..d() },
"budget max_lease_ms",
);
refuse(
"retrybig",
Budgets { max_retry_delay_ms: i64::MAX as u64 + 1, ..d() },
"budget max_retry_delay_ms",
);
refuse(
"busybig",
Budgets { db_busy_timeout_ms: i32::MAX as u32 + 1, ..d() },
"budget db_busy_timeout_ms",
);
refuse("attempts0", Budgets { max_attempts: 0, ..d() }, "budget max_attempts");
// Search budgets: zero and beyond-domain both refuse for all five.
refuse(
"search_qbytes0",
Budgets { max_search_query_bytes: 0, ..d() },
"budget max_search_query_bytes",
);
refuse(
"search_qbytes_big",
Budgets { max_search_query_bytes: i32::MAX as u32 + 1, ..d() },
"budget max_search_query_bytes",
);
refuse(
"search_terms0",
Budgets { max_search_query_terms: 0, ..d() },
"budget max_search_query_terms",
);
refuse(
"search_terms_big",
Budgets { max_search_query_terms: 257, ..d() },
"budget max_search_query_terms",
);
refuse(
"search_results0",
Budgets { max_search_results: 0, ..d() },
"budget max_search_results",
);
refuse(
"search_results_big",
Budgets { max_search_results: 10_001, ..d() },
"budget max_search_results",
);
refuse(
"search_index0",
Budgets { max_search_index_terms: 0, ..d() },
"budget max_search_index_terms",
);
refuse(
"search_index_big",
Budgets { max_search_index_terms: 65_537, ..d() },
"budget max_search_index_terms",
);
refuse(
"search_snippet0",
Budgets { max_search_snippet_bytes: 0, ..d() },
"budget max_search_snippet_bytes",
);
refuse(
"search_snippet_big",
Budgets { max_search_snippet_bytes: 16 * 1024 + 1, ..d() },
"budget max_search_snippet_bytes",
);
// The frozen v1 defaults themselves are valid.
let (_root, _core) = open_core("valid_defaults");
}