These test cases are used by the test-integration build step.
A integration test case consists of a single .c file containing a test manifest
embedded inside a /** manifest: ... */ comment that can be placed anywhere in the file
but preferably in the bottom.
The cases are executed with test/cases as the CWD.
The manifest starts with the test type followed by key-value pairs of arugments and finally by trailing data.
Currently 4 test kinds are supported:
-
syntax: Run the compiler on the test case with-fsyntax-onlyand check the resulting errors against those potentially specified in the trailing data.--verbose-astis also used the output of which can be checked against an expected result intest/cases/ast/<test name>. -
syntax_ignore_errors: Same as syntax but any errors are ignored. -
expand: Run the compiler on the test case with-E -P, checks any warnings match those specified in the trailing data, and that the expansion output matches the expected result specified intest/cases/expanded/<test name>. -
expand_partial: Like expand but only checks that the result contains the output specified in the trailing data instead of a complete match. -
expand_error: Like expand but checks errors like syntax instead of the expansion output. (there is no expansion output when the preprocessor emits an error)
Currently 3 different arguments are supported:
-
skip: Specify reason why some check was skipped. The manifest can have multipleskips. -
args: Takes an array of arguments to be passed to the compiler. -
env: Takes an array of KEY=VALUE pairs to be specified in the environment variables passed to the compiler.
/** manifest:
syntax
args = -Iinclude -Wfoo
skip = thing is broken
env = MYENV=1
foo.c: 1:4: error: something went wrong
*/Fuzz testing requires AFLplusplus. Run zig build fuzz to build the fuzz target,
then afl-fuzz -i test/cases -o test/fuzz-output -- ./zig-out/bin/arofuzz
A Dockerfile is provided to make it easier to get started with fuzzing. It requires two build args,
ZIG_VERSION and ZIG_PUBKEY. ZIG_VERSION should be the release filename from https://ziglang.org/download/, without
the .tar.xz extension. ZIG_PUBKEY should be the minisign public key on https://ziglang.org/download/. You can also
provide USER_ID and GROUP_ID so that files created in the container have the same user id and group id as files on
your host system.
Please read https://github.com/AFLplusplus/AFLplusplus/blob/stable/docs/fuzzing_in_depth.md#0-common-sense-risks before running the fuzzer on your system.
docker build -t aro-fuzz \
--build-arg ZIG_VERSION=zig-linux-x86_64-0.12.0-dev.1595+70d8baaec \
--build-arg ZIG_PUBKEY=RWSGOq2NVecA2UPNdBUZykf1CCb147pkmdtYxgb3Ti+JO/wCYvhbAb/U \
--build-arg USER_ID=$(id -u ${USER}) \
--build-arg GROUP_ID=$(id -g ${USER}) \
test/docker/fuzz
docker run --rm -it -v $PWD:/arocc -w /arocc --mount type=tmpfs,destination=/ramdisk -e AFL_TMPDIR=/ramdisk aro-fuzz
zig build fuzz # This might take a while
afl-fuzz -i test/cases -o test/fuzz-output -- ./zig-out/bin/arofuzzzig build test-unit --fuzz