use super::*;
#[test]
fn history_tree_parts_reads_legacy_entry_width() {
let legacy = LegacyHistoryTreeParts {
network_kind: NetworkKind::Mainnet,
size: 42,
peaks: BTreeMap::from([
(
0,
LegacyEntry {
inner: [0xAB; LEGACY_MAX_ENTRY_SIZE],
},
),
(
5,
LegacyEntry {
inner: [0xCD; LEGACY_MAX_ENTRY_SIZE],
},
),
]),
current_height: Height(1_000),
};
let legacy_bytes = bincode::DefaultOptions::new()
.serialize(&legacy)
.expect("legacy serialization succeeds");
let parts = HistoryTreeParts::from_bytes(&legacy_bytes);
assert_eq!(parts.network_kind, NetworkKind::Mainnet);
assert_eq!(parts.size, 42);
assert_eq!(parts.current_height, Height(1_000));
assert_eq!(parts.peaks.len(), 2);
assert_eq!(parts.as_bytes(), HistoryTreeParts::from(legacy).as_bytes());
assert!(parts.as_bytes().len() > legacy_bytes.len());
}
#[test]
fn history_tree_parts_reads_legacy_entry_width_with_non_eof_misparse() {
let legacy = LegacyHistoryTreeParts {
network_kind: NetworkKind::Mainnet,
size: 7,
peaks: BTreeMap::from([
(
0,
LegacyEntry {
inner: [0xFF; LEGACY_MAX_ENTRY_SIZE],
},
),
(
1,
LegacyEntry {
inner: [0xFF; LEGACY_MAX_ENTRY_SIZE],
},
),
]),
current_height: Height(500),
};
let legacy_bytes = bincode::DefaultOptions::new()
.serialize(&legacy)
.expect("legacy serialization succeeds");
let current_err = bincode::DefaultOptions::new()
.deserialize::<HistoryTreeParts>(&legacy_bytes)
.err()
.expect("current-width parse of a legacy record fails");
assert!(
!matches!(
current_err.as_ref(),
bincode::ErrorKind::Io(io_err) if io_err.kind() == std::io::ErrorKind::UnexpectedEof,
),
"expected a non-EOF misparse error, got: {current_err:?}",
);
let parts = HistoryTreeParts::from_bytes(&legacy_bytes);
assert_eq!(parts.network_kind, NetworkKind::Mainnet);
assert_eq!(parts.size, 7);
assert_eq!(parts.current_height, Height(500));
assert_eq!(parts.peaks.len(), 2);
assert_eq!(parts.as_bytes(), HistoryTreeParts::from(legacy).as_bytes());
}
#[test]
fn history_tree_parts_round_trips_current_width() {
let parts = HistoryTreeParts {
network_kind: NetworkKind::Testnet,
size: 3,
peaks: BTreeMap::from([(
0,
zcash_history::Entry::from_raw_bytes_padded(&[7; LEGACY_MAX_ENTRY_SIZE]),
)]),
current_height: Height(9),
};
let bytes = parts.as_bytes();
let parsed = HistoryTreeParts::from_bytes(&bytes);
assert_eq!(parsed.network_kind, NetworkKind::Testnet);
assert_eq!(parsed.size, 3);
assert_eq!(parsed.current_height, Height(9));
assert_eq!(parsed.as_bytes(), bytes);
}