aboutsummaryrefslogtreecommitdiff
path: root/tools/tests/test_gen_fuzz_corpus.py
blob: 5ce8c99a21f45358fa18950a9e52f30c0a0f3e9d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# Author:  cirakg & claude ai
# Summary: Tests for the fuzz corpus generator: determinism, mutation, valid Monkey C output, and the committed corpus.
from __future__ import annotations

import random
from pathlib import Path

import gen_fuzz_corpus

ROOT = Path(__file__).resolve().parents[2]


def test_same_seed_gives_the_same_corpus() -> None:
    assert gen_fuzz_corpus.corpus(7, 10, 10) == gen_fuzz_corpus.corpus(7, 10, 10)
    assert gen_fuzz_corpus.corpus(7, 10, 10) != gen_fuzz_corpus.corpus(8, 10, 10)


def test_corpus_starts_with_the_valid_seeds() -> None:
    jsons, uris = gen_fuzz_corpus.corpus(1, 5, 5)
    assert jsons[0] == gen_fuzz_corpus.AEGIS_SEED.encode()
    assert uris[: len(gen_fuzz_corpus.URI_SEEDS)] == [u.encode() for u in gen_fuzz_corpus.URI_SEEDS]
    assert len(jsons) == 5 and len(uris) == 5


def test_mutate_changes_the_input() -> None:
    rng = random.Random(3)
    base = gen_fuzz_corpus.AEGIS_SEED.encode()
    assert sum(gen_fuzz_corpus.mutate(base, rng) != base for _ in range(20)) >= 19


def test_render_puts_commas_outside_the_comments() -> None:
    text = gen_fuzz_corpus.render([b"{}", b"[]"], [b"x"], 1)
    assert '"7b7d", // lint: allow-literal' in text
    assert '"5b5d" // lint: allow-literal' in text
    assert text.startswith("// Author:  cirakg & claude ai\n// Summary:")


def test_committed_corpus_matches_the_generator() -> None:
    jsons, uris = gen_fuzz_corpus.corpus(4242, 50, 50)
    committed = (ROOT / "test" / "data" / "FuzzCorpus.mc").read_text(encoding="utf-8")
    assert committed == gen_fuzz_corpus.render(jsons, uris, 4242)