cuprate/net/epee-encoding/tests/seq.rs
Boog900 83b59c557c
net: use epee_encoding instead of monero-epee-bin-serde
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.
2024-01-30 16:09:54 +00:00

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());
}