soyokaze 0.6.3

HTTP/1/2/3 Library Crate
Documentation
mod harness;

use harness::rng::Rng;

const CASES: usize = 2_000;

fn case_count() -> usize {
    std::env::var("SOYOKAZE_FUZZ_CASES").ok().and_then(|value| value.parse().ok()).unwrap_or(CASES)
}

const ALPHABET: &[u8] = &[
    0x00, 0x01, 0x0f, 0x10, 0x1f, 0x20, 0x3f, 0x40, 0x7f, 0x80, 0x81, 0xc0, 0xfe, 0xff, b'a', b':',
];

const SEEDS: &[&[u8]] = &[
    b"",
    b"\x00",
    b"\xff",
    b"\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff",
    b"\x82\x44\x0fwww.example.com",
    b"\x3f\xe1\xff\xff\xff\x07",
    b"\x1f\x80\x80\x80\x80\x80\x80\x80\x80\x80\x80",
    b"\xff\xff\xff\xff\xff",
    b"\xff\xff\xff\x00",
    b"\x00\x00\x03\x04\x00\x00\x00\x00\x00\x01\x02\x03",
    b"\x00\x00\x05\x00\x08\x00\x00\x00\x01\xff\x01\x02\x03\x04",
    b"\x01\xbf\xff\xff\xff\x00",
    b"\x82\xff\xff\xff\xff\xff\xff\xff\xff\xff",
];

fn cases(seed: u64) -> impl Iterator<Item = Vec<u8>> {
    let mut rng = Rng::new(seed);

    SEEDS.iter().map(|seed| seed.to_vec()).chain((0..case_count()).map(move |index| {
        if index % 2 == 0 { rng.bytes(256) } else { rng.biased(256, ALPHABET) }
    }))
}

#[test]
fn field_harness() {
    for case in cases(0x5eed_0005) {
        harness::fields::check(&case);
    }
}

#[test]
fn huffman_harness() {
    for case in cases(0x5eed_0001) {
        harness::huffman::check(&case);
    }
}

#[test]
fn hpack_harness() {
    for case in cases(0x5eed_0002) {
        harness::hpack::check(&case);
    }
}

#[test]
fn qpack_harness() {
    for case in cases(0x5eed_0003) {
        harness::qpack::check(&case);
    }
}

#[test]
fn frame_harness() {
    for case in cases(0x5eed_0004) {
        harness::frames::check(&case);
    }
}

#[test]
fn every_harness_runs_over_every_seed() {
    for case in SEEDS {
        harness::all(case);
    }
}

#[test]
fn the_generator_is_deterministic() {
    let first: Vec<Vec<u8>> = cases(0x5eed_0001).take(32).collect();
    let second: Vec<Vec<u8>> = cases(0x5eed_0001).take(32).collect();

    assert_eq!(first, second, "the same seed produced different cases");
    assert_ne!(
        first,
        cases(0x5eed_0002).take(32).collect::<Vec<_>>(),
        "different seeds produced the same cases",
    );
}