use oxcache::infra::serialization::{JsonSerializer, Serializer};
#[test]
fn test_json_serializer_round_trip() {
let serializer = JsonSerializer::new();
let original_data = b"hello world this is test data";
let serialized = serializer.serialize("test", original_data).unwrap();
let deserialized = serializer.deserialize("test", &serialized).unwrap();
assert_eq!(original_data.as_slice(), deserialized.as_slice());
}
#[test]
fn test_json_serializer_with_compression() {
let serializer = JsonSerializer::with_compression();
#[derive(serde::Serialize, serde::Deserialize, Clone, Debug, PartialEq)]
struct TestData {
content: String,
}
let test_data = TestData {
content: "aaaaaaabbbbbbbbccccccccddddddddeeeeeeeeffffffffgggggggghhhhhhhh".repeat(5),
};
let original_bytes = serde_json::to_vec(&test_data).unwrap();
let serialized = serializer.serialize("test", &original_bytes).unwrap();
let deserialized = serializer.deserialize("test", &serialized).unwrap();
let deserialized_data: TestData = serde_json::from_slice(&deserialized).unwrap();
assert_eq!(test_data, deserialized_data);
}
#[test]
fn test_json_serializer_large_payload_round_trip() {
let serializer = JsonSerializer::new();
let mut original_data = Vec::with_capacity(5 * 1024 * 1024);
let seed: u64 = 0x9E3779B97F4A7C15;
let mut x = seed;
for _ in 0..(5 * 1024 * 1024) {
x ^= x << 13;
x ^= x >> 7;
x ^= x << 17;
original_data.push((x & 0xFF) as u8);
}
let serialized = serializer.serialize("large", &original_data).unwrap();
let deserialized = serializer.deserialize("large", &serialized).unwrap();
assert_eq!(
deserialized, original_data,
"大对象 round-trip 数据必须逐字节一致"
);
}
#[test]
fn test_json_serializer_special_keys_and_corrupt_data() {
let serializer = JsonSerializer::new();
let payload = b"edge case payload";
let long_key = "k".repeat(4096);
let special_keys: [&str; 3] = ["", long_key.as_str(), "key\r\nwith\x00control"];
for name in special_keys {
let serialized = serializer.serialize(name, payload).unwrap();
let deserialized = serializer.deserialize(name, &serialized).unwrap();
assert_eq!(deserialized, payload, "type_name={name:?} round-trip 失败");
}
let serialized = serializer.serialize("empty", b"").unwrap();
let deserialized = serializer.deserialize("empty", &serialized).unwrap();
assert!(deserialized.is_empty());
let oversized = vec![0u8; 5 * 1024 * 1024 + 1];
assert!(serializer.deserialize("oversized", &oversized).is_err());
let passthrough = b"not-json-at-all!!";
assert_eq!(
serializer
.deserialize("passthrough", passthrough)
.unwrap()
.as_slice(),
passthrough.as_slice(),
"非压缩模式须为字节直通"
);
}