modelvault-core 0.15.2

Core engine for ModelVault — application-focused embedded storage with model schemas, validation, and migrations.
Documentation
use modelvault_core::error::FormatError;
use modelvault_core::superblock::{decode_superblock, Superblock, SUPERBLOCK_SIZE};
use modelvault_core::DbError;

#[test]
fn decode_superblock_rejects_truncated() {
    let bytes = [0u8; 32];
    let res = decode_superblock(&bytes);
    assert!(matches!(
        res,
        Err(DbError::Format(FormatError::TruncatedSuperblock { .. }))
    ));
}

#[test]
fn decode_superblock_rejects_bad_magic() {
    let mut bytes = Superblock::empty().encode();
    bytes[0] ^= 0xff;
    let res = decode_superblock(&bytes);
    assert!(matches!(
        res,
        Err(DbError::Format(FormatError::BadSuperblockMagic { .. }))
    ));
}

#[test]
fn decode_superblock_rejects_bad_checksum() {
    let mut bytes = Superblock::empty().encode();
    bytes[32] ^= 0xff;
    let res = decode_superblock(&bytes);
    assert!(matches!(
        res,
        Err(DbError::Format(FormatError::BadSuperblockChecksum))
    ));
    assert_eq!(SUPERBLOCK_SIZE, 4096);
}

#[test]
fn decode_superblock_rejects_unsupported_version() {
    let mut bytes = Superblock::empty().encode();
    bytes[4] = 9;
    let crc = crc32c::crc32c(&bytes[0..32]);
    bytes[32..36].copy_from_slice(&crc.to_le_bytes());
    let res = decode_superblock(&bytes);
    assert!(matches!(
        res,
        Err(DbError::Format(FormatError::UnsupportedVersion { .. }))
    ));
}

#[test]
fn decode_superblock_rejects_checksum_kind_mismatch() {
    let mut bytes = Superblock::empty().encode();
    bytes[28] = 9;
    let crc = crc32c::crc32c(&bytes[0..32]);
    bytes[32..36].copy_from_slice(&crc.to_le_bytes());
    let res = decode_superblock(&bytes);
    assert!(matches!(
        res,
        Err(DbError::Format(FormatError::UnsupportedVersion { .. }))
    ));
}