Programming Language

Nocter

A self-contained systems language built around simplicity, encapsulation, and foolproof design.

/examples/binary-record/tests.nct

tests.nct

see ./index.nct

use std/vec.Vec

func sample_records(): Vec<Record> {
    return Vec [Record.new(42, 3.5), Record.new(7, -1.25)]
}

func record_header(): Vec<u8> {
    var header: Vec<u8> = Vec.empty()
    header.push(78)
    header.push(67)
    header.push(84)
    header.push(82)
    header.push(0)
    header.push(1)
    return move header
}

noalloc func require_record(record: Record?, count: u32, bits: u64): bool {
    let value = record otherwise { return false }
    return value.item_count() == count && value.measurement().to_bits() == bits
}

test records_round_trip_through_one_byte_blocking_fragments {
    let records = sample_records()
    let encoded = encode_log(&records as &[Record])?
    var input = FragmentedBytes.new(&encoded as &[u8], 1)
    let decoded = decode_blocking(&+input)?
    match decoded.tail() {
        RecordTail.complete {}
        _ {
            return error.new(
                "example.binary_record.round_trip",
                "fragmented record log remained incomplete",
            )
        }
    }
    if decoded.len() != 2
    || !require_record(decoded.record(0), 42, 4615063718147915776)
    || !require_record(decoded.record(1), 7, 13831680355561635840) {
        return error.new("example.binary_record.round_trip", "fragmented record log changed")
    }
    return
}

test every_truncated_position_preserves_the_complete_prefix {
    let records = sample_records()
    let encoded = encode_log(&records as &[Record])?
    let complete: &[u8] = &encoded
    var split: usize = 0
    while split < complete.len() {
        let prefix = complete.get_range(0, split) otherwise {
            return error.new("example.binary_record.range", "valid prefix range was rejected")
        }
        let decoded = decode_log(prefix)?
        let expected_records: usize = if split < 23 { 0 } else { 1 }
        if decoded.len() != expected_records {
            return error.new("example.binary_record.truncated", "complete prefix was not preserved")
        }
        if split == 0 || split == 23 {
            match decoded.tail() {
                RecordTail.complete {}
                _ {
                    return error.new(
                        "example.binary_record.boundary",
                        "exact record boundary was damaged",
                    )
                }
            }
        } else {
            match decoded.tail() {
                RecordTail.incomplete {}
                _ {
                    return error.new(
                        "example.binary_record.truncated",
                        "truncated tail classification changed",
                    )
                }
            }
        }
        split += 1
    }
    return
}

test malformed_headers_and_lengths_are_classified_before_payload_consumption {
    var invalid_magic = record_header()
    invalid_magic[0] = 0
    let invalid_magic_log = decode_log(&invalid_magic as &[u8])?
    match invalid_magic_log.tail() {
        RecordTail.invalid_magic {}
        _ { return error.new("example.binary_record.header", "invalid magic was not classified") }
    }

    var unsupported_version = record_header()
    unsupported_version[5] = 2
    let unsupported_version_log = decode_log(&unsupported_version as &[u8])?
    match unsupported_version_log.tail() {
        RecordTail.unsupported_version {}
        _ {
            return error.new(
                "example.binary_record.header",
                "unsupported version was not classified",
            )
        }
    }

    var non_canonical = record_header()
    non_canonical.push(140)
    non_canonical.push(0)
    let non_canonical_log = decode_log(&non_canonical as &[u8])?
    if non_canonical_log.len() != 0 {
        return error.new("example.binary_record.length", "non-canonical length was not rejected")
    }
    match non_canonical_log.tail() {
        RecordTail.non_canonical_length {}
        _ {
            return error.new(
                "example.binary_record.length",
                "non-canonical length was not classified",
            )
        }
    }

    var overflow = record_header()
    var overflow_byte: usize = 0
    while overflow_byte < 9 {
        overflow.push(255)
        overflow_byte += 1
    }
    overflow.push(2)
    let overflow_log = decode_log(&overflow as &[u8])?
    match overflow_log.tail() {
        RecordTail.length_overflow {}
        _ {
            return error.new(
                "example.binary_record.length",
                "overflowing length was not classified",
            )
        }
    }

    var excessive = record_header()
    excessive.push(129)
    excessive.push(32)
    let excessive_log = decode_log(&excessive as &[u8])?
    if excessive_log.len() != 0 {
        return error.new("example.binary_record.length", "excessive length was not rejected")
    }
    match excessive_log.tail() {
        RecordTail.excessive_length {}
        _ {
            return error.new(
                "example.binary_record.length",
                "excessive length was not classified",
            )
        }
    }

    var unexpected = record_header()
    unexpected.push(13)
    let unexpected_log = decode_log(&unexpected as &[u8])?
    match unexpected_log.tail() {
        RecordTail.unexpected_length {}
        _ {
            return error.new(
                "example.binary_record.length",
                "unexpected schema length was not classified",
            )
        }
    }
    return
}

test checksum_and_trailing_corruption_preserve_preceding_records {
    let one: Vec<Record> = Vec [Record.new(42, 3.5)]
    let first = encode_log(&one as &[Record])?
    let two = sample_records()
    var damaged = encode_log(&two as &[Record])?
    damaged[45] = 0
    let damaged_log = decode_log(&damaged as &[u8])?
    if damaged_log.len() != 1 {
        return error.new("example.binary_record.checksum", "checksum damage lost the valid prefix")
    }
    match damaged_log.tail() {
        RecordTail.checksum_mismatch {}
        _ {
            return error.new(
                "example.binary_record.checksum",
                "checksum damage was not classified",
            )
        }
    }

    var trailing = Vec.from_slice(&first as &[u8])
    trailing.push(0)
    trailing.push(0)
    trailing.push(0)
    trailing.push(0)
    let trailing_log = decode_log(&trailing as &[u8])?
    if trailing_log.len() != 1 {
        return error.new("example.binary_record.trailing", "trailing corruption was accepted")
    }
    match trailing_log.tail() {
        RecordTail.invalid_magic {}
        _ {
            return error.new(
                "example.binary_record.trailing",
                "trailing corruption was not classified",
            )
        }
    }
    return
}