armdb 0.14.2

sharded bitcask key-value storage optimized for NVMe
Documentation
use std::sync::LazyLock;

use super::{encode_err_frame, write_schema_bytes};

/// Bytes captured from the pre-thread-transport raw response encoder in
/// `3742fc9f`. These remain the cross-version evidence for the legacy wire
/// contract; dispatch-specific vectors below deliberately do not replace them.
pub(crate) static LEGACY_RAW_RESPONSE_VECTORS: LazyLock<Vec<(&str, Vec<u8>)>> = LazyLock::new(
    || {
        let truncated_message = "é".repeat(32_767);
        vec![
        ("empty", vec![0]),
        ("bool_true", vec![0, 1]),
        ("bool_false", vec![0, 0]),
        ("opt_data_none", vec![0, 0]),
        ("opt_data_some", vec![0, 1, 0, 0, 0, 2, 1, 2]),
        ("opt_len_none", vec![0, 0]),
        ("opt_len_some", vec![0, 1, 0, 0, 0, 5]),
        ("opt_kv_none", vec![0, 0]),
        ("opt_kv_some", vec![0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 2]),
        ("kv_empty", vec![0, 0, 0, 0, 0]),
        (
            "kv_two",
            vec![
                0, 0, 0, 0, 2, 0, 0, 0, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 1, 3, 0, 0, 0,
                2, 4, 5,
            ],
        ),
        (
            "keys_two",
            vec![0, 0, 0, 0, 2, 0, 0, 0, 1, 1, 0, 0, 0, 2, 2, 3],
        ),
        ("key", vec![0, 0, 0, 0, 2, 7, 7]),
        ("count", vec![0, 255, 255, 255, 255, 255, 255, 255, 255]),
        ("err_400", b"\x01\x01\x90\x00\x03bad".to_vec()),
        ("schema_bytes", b"\x00{\"name\":\"alpha\"}".to_vec()),
        (
            "collections_two",
            b"\x00\x00\x00\x00\x02\x00\x00\x00\x01a\x00\x00\x00\x01a\x01\x02\x03\x04\x05\x06\x07\x08\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x00\x00\x00\x00\x02bc\x00\x00\x00\x02bc\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x01".to_vec(),
        ),
        (
            "err_utf8_truncated",
            [b"\x01\x01\xf4\xff\xfe".as_slice(), truncated_message.as_bytes()].concat(),
        ),
    ]
    },
);

/// Response bytes exercised through `dispatch_into` after the rewrite.
///
/// `err_400`, `schema_bytes`, and `err_utf8_truncated` are intentionally
/// dispatch-derived: their legacy raw-encoder counterparts live in
/// [`LEGACY_RAW_RESPONSE_VECTORS`].
pub(crate) static RESPONSE_VECTORS: LazyLock<Vec<(&str, Vec<u8>)>> = LazyLock::new(|| {
    let truncated_client_message =
        [b"client error: ".as_slice(), "é".repeat(32_760).as_bytes()].concat();
    vec![
        ("empty", vec![0]),
        ("bool_true", vec![0, 1]),
        ("bool_false", vec![0, 0]),
        ("opt_data_none", vec![0, 0]),
        ("opt_data_some", vec![0, 1, 0, 0, 0, 2, 1, 2]),
        ("opt_len_none", vec![0, 0]),
        ("opt_len_some", vec![0, 1, 0, 0, 0, 5]),
        ("opt_kv_none", vec![0, 0]),
        ("opt_kv_some", vec![0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 2]),
        ("kv_empty", vec![0, 0, 0, 0, 0]),
        (
            "kv_two",
            vec![
                0, 0, 0, 0, 2, 0, 0, 0, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 1, 3, 0, 0, 0, 2, 4, 5,
            ],
        ),
        (
            "keys_two",
            vec![0, 0, 0, 0, 2, 0, 0, 0, 1, 1, 0, 0, 0, 2, 2, 3],
        ),
        ("key", vec![0, 0, 0, 0, 2, 7, 7]),
        ("count", vec![0, 255, 255, 255, 255, 255, 255, 255, 255]),
        ("err_400", b"\x01\x01\x90\x00\x11client error: bad".to_vec()),
        (
            "schema_bytes",
            b"\x00{\"name\":\"stub\",\"version\":1,\"typ\":{\"type\":\"U8\"},\"key_scheme\":{\"type\":\"Bytes\"}}".to_vec(),
        ),
        (
            "collections_two",
            b"\x00\x00\x00\x00\x02\x00\x00\x00\x01a\x00\x00\x00\x01a\x01\x02\x03\x04\x05\x06\x07\x08\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20\x21\x22\x00\x00\x00\x00\x02bc\x00\x00\x00\x02bc\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x01".to_vec(),
        ),
        (
            "err_utf8_truncated",
            [b"\x01\x01\x90\xff\xfe".as_slice(), truncated_client_message.as_slice()].concat(),
        ),
    ]
});

#[test]
fn golden_response_vectors_are_frozen() {
    assert_eq!(
        RESPONSE_VECTORS
            .iter()
            .find(|(name, _)| *name == "kv_two")
            .map(|(_, bytes)| bytes.as_slice()),
        Some(
            [
                0, 0, 0, 0, 2, 0, 0, 0, 1, 1, 0, 0, 0, 1, 2, 0, 0, 0, 1, 3, 0, 0, 0, 2, 4, 5,
            ]
            .as_slice()
        )
    );
}

#[test]
fn legacy_raw_error_vectors_remain_byte_exact() {
    let mut bad = Vec::new();
    encode_err_frame(&mut bad, 400, "bad", usize::MAX);
    assert_eq!(bad, legacy_vector("err_400"));

    let mut truncated = Vec::new();
    encode_err_frame(&mut truncated, 500, &"é".repeat(40_000), usize::MAX);
    assert_eq!(truncated, legacy_vector("err_utf8_truncated"));
}

#[test]
fn legacy_raw_schema_vector_remains_byte_exact() {
    let mut schema = Vec::new();
    write_schema_bytes(&mut schema, br#"{"name":"alpha"}"#);
    assert_eq!(schema, legacy_vector("schema_bytes"));
}

fn legacy_vector(name: &str) -> Vec<u8> {
    LEGACY_RAW_RESPONSE_VECTORS
        .iter()
        .find(|(candidate, _)| *candidate == name)
        .map(|(_, bytes)| bytes.clone())
        .expect("legacy response vector")
}