use bincode::{DefaultOptions, Deserializer, Serializer};
use serde::{Deserialize, Serialize};
use reconcile::clock::{Hlc, LogicalCounter, NodeId, PhysicalTime, Timestamp};
use reconcile::entry::Entry;
use rsos::{lift, Fingerprint};
fn sample_stamp() -> Timestamp {
Timestamp::new(
Hlc::new(
PhysicalTime::from_millis(0x0123_4567_89ab_cdef),
LogicalCounter::new(0x1122_3344),
),
NodeId::new(0xfeed_face_dead_beef),
)
}
fn encode<T: Serialize>(value: &T) -> Vec<u8> {
let mut buf = Vec::new();
value
.serialize(&mut Serializer::new(&mut buf, DefaultOptions::new()))
.unwrap();
buf
}
#[test]
fn timestamp_bincode_encoding_is_unchanged() {
const GOLDEN: &[u8] = &[
253, 239, 205, 171, 137, 103, 69, 35, 1, 252, 68, 51, 34, 17, 253, 239, 190, 173, 222, 206,
250, 237, 254,
];
let stamp = sample_stamp();
assert_eq!(
encode(&stamp),
GOLDEN,
"Timestamp's wire encoding changed — this is a protocol break, not a refactor"
);
let mut deserializer = Deserializer::from_slice(GOLDEN, DefaultOptions::new());
assert_eq!(Timestamp::deserialize(&mut deserializer).unwrap(), stamp);
}
#[test]
fn entry_bincode_encoding_is_unchanged() {
const GOLDEN: &[u8] = &[
253, 239, 205, 171, 137, 103, 69, 35, 1, 252, 68, 51, 34, 17, 253, 239, 190, 173, 222, 206,
250, 237, 254, 0, 251, 57, 48,
];
let entry = Entry::present(sample_stamp(), 12345u32);
assert_eq!(
encode(&entry),
GOLDEN,
"Entry's wire encoding changed — this is a protocol break, not a refactor"
);
let mut deserializer = Deserializer::from_slice(GOLDEN, DefaultOptions::new());
assert_eq!(
Entry::<Timestamp, u32>::deserialize(&mut deserializer).unwrap(),
entry
);
}
#[test]
fn entry_fingerprint_is_unchanged() {
const GOLDEN: Fingerprint = Fingerprint([
0xbaa4_af17_b48b_79a7,
0x7ac3_63a5_54df_3f18,
0x6d7e_6ffe_ace1_e413,
0xec7f_5fad_ea96_0d52,
]);
let entry = Entry::present(sample_stamp(), 12345u32);
assert_eq!(
lift(&7u32, &entry),
GOLDEN,
"the fingerprint of an Entry changed — replicas on either side of this change \
would never converge"
);
}