use byteorder::{ByteOrder, LittleEndian};
use super::constants::BINLOG_CHECKSUM_LEN;
pub fn validate_event_checksum(event_data: &[u8]) -> bool {
if event_data.len() < BINLOG_CHECKSUM_LEN {
return false;
}
let data_end = event_data.len() - BINLOG_CHECKSUM_LEN;
let computed = crc32c::crc32c(&event_data[..data_end]);
let stored = LittleEndian::read_u32(&event_data[data_end..]);
computed == stored
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn valid_checksum() {
let mut data = vec![0xABu8; 50];
let crc = crc32c::crc32c(&data[..46]);
LittleEndian::write_u32(&mut data[46..], crc);
assert!(validate_event_checksum(&data));
}
#[test]
fn invalid_checksum() {
let mut data = vec![0xABu8; 50];
LittleEndian::write_u32(&mut data[46..], 0xDEADBEEF);
assert!(!validate_event_checksum(&data));
}
#[test]
fn too_short() {
let data = vec![0u8; 3];
assert!(!validate_event_checksum(&data));
}
#[test]
fn exact_checksum_size() {
let mut data = vec![0u8; 4];
let crc = crc32c::crc32c(&[]);
LittleEndian::write_u32(&mut data[0..], crc);
assert!(validate_event_checksum(&data));
}
}