use vyre_runtime::megakernel::protocol::{
control_byte_len, debug_log_byte_len, encode_control, encode_empty_debug_log,
encode_empty_ring, read_done_count, read_epoch, read_metrics, read_observable, ring_byte_len,
try_encode_control, try_read_done_count, try_read_epoch, try_read_observable,
};
#[test]
fn control_byte_len_for_zero_observable() {
assert_eq!(control_byte_len(0), Some(640));
}
#[test]
fn control_byte_len_for_small_observable() {
assert_eq!(control_byte_len(4), Some(656));
}
#[test]
fn control_byte_len_none_on_overflow() {
assert_eq!(control_byte_len(u32::MAX), None);
}
#[test]
fn ring_byte_len_for_zero_slots() {
assert_eq!(ring_byte_len(0), Some(0));
}
#[test]
fn ring_byte_len_for_small_slots() {
assert_eq!(ring_byte_len(4), Some(256));
}
#[test]
fn ring_byte_len_none_on_overflow() {
assert_eq!(ring_byte_len(u32::MAX), None);
}
#[test]
fn debug_log_byte_len_for_zero_records() {
assert_eq!(debug_log_byte_len(0), Some(4));
}
#[test]
fn debug_log_byte_len_none_on_overflow() {
assert_eq!(debug_log_byte_len(u32::MAX), None);
}
#[test]
fn encode_control_produces_expected_length() {
let bytes = encode_control(false, 0, 0).unwrap();
assert_eq!(bytes.len(), 640);
}
#[test]
fn encode_control_with_observables() {
let bytes = encode_control(false, 0, 3).unwrap();
assert_eq!(bytes.len(), 640 + 3 * 4);
}
#[test]
fn try_encode_control_rejects_too_many_observables() {
let err = try_encode_control(false, 0, u32::MAX).unwrap_err();
assert!(err.to_string().contains("Fix:"));
}
#[test]
fn encode_empty_ring_zero_slots() {
let bytes = encode_empty_ring(0).unwrap();
assert!(bytes.is_empty());
}
#[test]
fn encode_empty_ring_small_slots() {
let bytes = encode_empty_ring(4).unwrap();
assert_eq!(bytes.len(), 256);
}
#[test]
fn encode_empty_debug_log_zero_records() {
let bytes = encode_empty_debug_log(0).unwrap();
assert_eq!(bytes.len(), 4);
}
#[test]
fn read_done_count_from_control_is_zero_by_default() {
let bytes = encode_control(false, 42, 0).unwrap();
assert_eq!(read_done_count(&bytes), 0);
}
#[test]
fn read_epoch_from_control() {
let bytes = encode_control(false, 0, 0).unwrap();
assert_eq!(read_epoch(&bytes), 0);
}
#[test]
fn try_read_done_count_rejects_short_buffer() {
let err = try_read_done_count(b"").unwrap_err();
assert!(err.to_string().contains("Fix:"));
}
#[test]
fn try_read_epoch_rejects_short_buffer() {
let err = try_read_epoch(b"").unwrap_err();
assert!(err.to_string().contains("Fix:"));
}
#[test]
fn read_observable_from_control() {
let bytes = encode_control(false, 0, 3).unwrap();
assert_eq!(read_observable(&bytes, 0), 0);
assert_eq!(read_observable(&bytes, 1), 0);
assert_eq!(read_observable(&bytes, 2), 0);
}
#[test]
fn try_read_observable_rejects_out_of_bounds() {
let bytes = encode_control(false, 0, 1).unwrap();
let err = try_read_observable(&bytes, 99).unwrap_err();
assert!(err.to_string().contains("Fix:"));
}
#[test]
fn read_metrics_empty_control() {
let bytes = encode_control(false, 0, 0).unwrap();
let metrics = read_metrics(&bytes);
assert!(metrics.is_empty());
}
#[test]
fn control_roundtrip_tenant_count_via_read_word() {
for n in [0, 1, 42] {
let bytes = encode_control(false, n, 0).unwrap();
let _ = read_done_count(&bytes);
let _ = read_epoch(&bytes);
}
}
#[test]
fn control_roundtrip_epoch() {
let bytes = encode_control(false, 0, 0).unwrap();
let _ = read_epoch(&bytes);
}