use std::sync::LazyLock;
use super::{encode_err_frame, write_schema_bytes};
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(),
),
]
},
);
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")
}