tests: Add fuzz test

This commit is contained in:
James Westman 2022-04-18 17:34:13 -05:00
parent 4e2501c7d7
commit 9144ac67f0
No known key found for this signature in database
GPG key ID: CE2DBA0ADB654EA6
5 changed files with 61 additions and 1 deletions

3
.gitignore vendored
View file

@ -10,3 +10,6 @@ coverage.xml
.mypy_cache
/subprojects/gtk-blueprint-tool
/blueprint-regression-tests
/corpus
/crashes

View file

@ -25,6 +25,20 @@ build:
reports:
cobertura: coverage.xml
fuzz:
image: registry.gitlab.gnome.org/jwestman/blueprint-compiler
stage: build
allow_failure: true
script:
- meson _build
- ninja -C _build install
- ./tests/fuzz.sh 5000
artifacts:
when: always
paths:
- corpus
- crashes
pages:
stage: pages
dependencies:

View file

@ -1,5 +1,9 @@
FROM fedora:latest
RUN dnf install -y meson python3-pip gtk4-devel gobject-introspection-devel libadwaita-devel
RUN dnf install -y meson python3-pip gtk4-devel gobject-introspection-devel libadwaita-devel python3-devel
RUN pip3 install furo mypy sphinx coverage
# The version on PyPI is very old and doesn't install. Use the upstream package registry instead.
RUN pip install pythonfuzz --extra-index-url https://gitlab.com/api/v4/projects/19904939/packages/pypi/simple
RUN dnf install -y git

27
tests/fuzz.py Normal file
View file

@ -0,0 +1,27 @@
from pythonfuzz.main import PythonFuzz
from blueprintcompiler import tokenizer, parser, decompiler
from blueprintcompiler.completions import complete
from blueprintcompiler.errors import PrintableError, MultipleErrors, CompileError, CompilerBugError
from blueprintcompiler.tokenizer import Token, TokenType, tokenize
from blueprintcompiler import utils
@PythonFuzz
def fuzz(buf):
try:
blueprint = buf.decode("ascii")
tokens = tokenizer.tokenize(blueprint)
ast, errors, warnings = parser.parse(tokens)
if errors is None and len(ast.errors) == 0:
actual = ast.generate()
except CompilerBugError as e:
raise e
except PrintableError:
pass
except UnicodeDecodeError:
pass
if __name__ == "__main__":
fuzz()

12
tests/fuzz.sh Executable file
View file

@ -0,0 +1,12 @@
#!/bin/bash
if [ $# = 1 ]; then
RUNS="$1"
else
RUNS=-1
fi
mkdir -p corpus
cp tests/samples/*.blp corpus
cp tests/sample_errors/*.blp corpus
python3 tests/fuzz.py --runs $RUNS corpus