mirror of
https://github.com/hinto-janai/cuprate.git
synced 2024-11-17 00:07:53 +00:00
83b59c557c
This gives us more control than what serde provides. This PR also moves to use `Bytes` where possible to allow zero-copy parsing of network messages.
60 lines
1.3 KiB
Rust
60 lines
1.3 KiB
Rust
use epee_encoding::{epee_object, from_bytes};
|
|
|
|
struct ObjSeq {
|
|
seq: Vec<ObjSeq>,
|
|
}
|
|
|
|
epee_object!(
|
|
ObjSeq,
|
|
seq: Vec<ObjSeq>,
|
|
);
|
|
|
|
struct ValSeq {
|
|
seq: Vec<i64>,
|
|
}
|
|
|
|
epee_object!(
|
|
ValSeq,
|
|
seq: Vec<i64>,
|
|
);
|
|
|
|
#[test]
|
|
fn seq_with_zero_len_can_have_any_marker() {
|
|
let mut data = [
|
|
0x01, 0x11, 0x01, 0x1, 0x01, 0x01, 0x02, 0x1, 0x1, 0x04, 0x03, b's', b'e', b'q',
|
|
]
|
|
.to_vec();
|
|
for marker in 1..13 {
|
|
data.push(0x80 | marker);
|
|
data.push(0);
|
|
|
|
assert!(from_bytes::<ObjSeq, _>(&mut data.as_slice()).is_ok());
|
|
|
|
assert!(from_bytes::<ValSeq, _>(&mut data.as_slice()).is_ok());
|
|
|
|
data.drain(14..);
|
|
}
|
|
}
|
|
|
|
#[test]
|
|
fn seq_with_non_zero_len_must_have_correct_marker() {
|
|
let mut data = [
|
|
0x01, 0x11, 0x01, 0x1, 0x01, 0x01, 0x02, 0x1, 0x1, 0x04, 0x03, b's', b'e', b'q',
|
|
]
|
|
.to_vec();
|
|
for marker in 2..13 {
|
|
// 1 is the marker for i64
|
|
data.push(0x80 | marker);
|
|
data.push(0x04); // varint length of 1
|
|
data.extend_from_slice(&1_i64.to_le_bytes());
|
|
|
|
assert!(from_bytes::<ValSeq, _>(&mut data.as_slice()).is_err());
|
|
|
|
data.drain(14..);
|
|
}
|
|
|
|
data.push(0x80 + 1);
|
|
data.push(0x04); // varint length
|
|
data.extend_from_slice(&1_i64.to_le_bytes());
|
|
(from_bytes::<ValSeq, _>(&mut data.as_slice()).unwrap());
|
|
}
|