mod announce;
mod header;
mod manifest;
pub use announce::*;
pub use header::*;
pub use manifest::*;
pub use crate::frame::parse::{take_address, IResult as ParserResult};
#[cfg(test)]
pub fn random_payload(size: usize) -> Vec<u8> {
use rand::RngCore;
let mut buf = vec![0; size];
rand::thread_rng().fill_bytes(&mut buf);
buf.into()
}
pub mod modes {
pub fn str_name(mode: u16) -> &'static str {
match mode {
ANNOUNCE => "announce frame",
DATA => "ERIS block data frame",
MANIFEST => "ERIS root manifest frame",
ROUTER_PEERING => "Router-to-Router introduction",
_ => "[UNKNOWN]",
}
}
pub const ANNOUNCE: u16 = 4;
pub const DATA: u16 = 8;
pub const MANIFEST: u16 = 9;
pub const ROUTER_PEERING: u16 = 64;
pub const NAMESPACE_ANYCAST: u16 = 0b1000_0000;
}
#[test]
fn full_announce_frame() {
use crate::{
frame::{FrameGenerator, FrameParser},
types::{Address, InMemoryEnvelope},
};
let origin = OriginDataV1::now();
let origin_signature = [1; 64];
let af = AnnounceFrame::V1(AnnounceFrameV1 {
origin,
origin_signature,
route: RouteDataV1 { available_mtu: 0 },
});
let mut afb = vec![];
af.clone().generate(&mut afb).unwrap();
println!("abf len: {}", afb.len());
let h = CarrierFrameHeader::new_announce_frame(Address::random(), afb.len() as u16);
let mut hb = vec![];
h.clone().generate(&mut hb).unwrap();
println!("hb len: {}", hb.len());
let in_memory_env = InMemoryEnvelope::from_header_and_payload(h.clone(), afb.clone()).unwrap();
let (r, cfhp) = CarrierFrameHeader::parse(&hb).unwrap();
assert_eq!(r, crate::frame::EMPTY);
assert_eq!(cfhp.unwrap(), h);
let (r2, afp) = AnnounceFrame::parse(&afb).unwrap();
assert_eq!(r2, crate::frame::EMPTY);
assert_eq!(afp.unwrap(), af);
assert_eq!(hb.len(), h.get_size());
let (r3, afp2) = AnnounceFrame::parse(&in_memory_env.get_payload_slice()).unwrap();
assert_eq!(r3, crate::frame::EMPTY);
assert_eq!(afp2.unwrap(), af);
}