use chia_protocol::{Bytes, Message, ProtocolMessageTypes};
use chia_traits::Streamable;
use dig_peer_protocol::DigMessage;
fn all_chia_opcodes() -> Vec<u8> {
(0..=u8::MAX)
.filter(|byte| ProtocolMessageTypes::from_bytes(&[*byte]).is_ok())
.collect()
}
const PAYLOAD_LENGTHS: [usize; 4] = [0, 1, 300, 65_600];
const ASYMMETRIC_ID: u16 = 0x0102;
#[test]
fn dig_message_encodes_byte_identically_to_chia_message() {
let opcodes = all_chia_opcodes();
assert!(
opcodes.len() > 100,
"probe found only {} opcodes — the fixture is not exercising the real namespace",
opcodes.len()
);
for opcode in opcodes {
let chia_type = ProtocolMessageTypes::from_bytes(&[opcode]).expect("probed as valid");
for id in [None, Some(ASYMMETRIC_ID)] {
for len in PAYLOAD_LENGTHS {
let payload: Vec<u8> = (0..len).map(|i| (i % 251) as u8).collect();
let chia = Message {
msg_type: chia_type,
id,
data: Bytes::new(payload.clone()),
};
let dig = DigMessage::new(opcode, id, Bytes::new(payload));
assert_eq!(
dig.to_bytes(),
chia.to_bytes().expect("chia encode"),
"encoding diverged for opcode {opcode} (id={id:?}, payload_len={len})"
);
}
}
}
}
#[test]
fn dig_message_decodes_what_chia_message_encoded() {
for opcode in all_chia_opcodes() {
let chia_type = ProtocolMessageTypes::from_bytes(&[opcode]).expect("probed as valid");
for id in [None, Some(ASYMMETRIC_ID)] {
for len in PAYLOAD_LENGTHS {
let payload: Vec<u8> = (0..len).map(|i| (i % 251) as u8).collect();
let wire = Message {
msg_type: chia_type,
id,
data: Bytes::new(payload.clone()),
}
.to_bytes()
.expect("chia encode");
let decoded = DigMessage::from_bytes(&wire)
.unwrap_or_else(|| panic!("DigMessage rejected a real Chia frame ({opcode})"));
assert_eq!(decoded.msg_type, opcode);
assert_eq!(decoded.id, id);
assert_eq!(decoded.data.as_ref(), payload.as_slice());
}
}
}
}