1#!/bin/bash -eu
2
3# Go to tests folder
4cd "$( dirname "${BASH_SOURCE[0]}" )/.."
5
6# Build seed corpus.
7# Generating it here ensures it will contain all of the fields in the AllTypes
8# test case. The generators are built without fuzzing instrumentation.
9rm -rf build
10scons build/alltypes/encode_alltypes build/fuzztest/generate_message
11mkdir fuzztest_seed_corpus
12build/alltypes/encode_alltypes 0 > fuzztest_seed_corpus/alltypes0
13build/alltypes/encode_alltypes 1 > fuzztest_seed_corpus/alltypes1
14build/alltypes/encode_alltypes 2 > fuzztest_seed_corpus/alltypes2
15build/fuzztest/generate_message $(date +%s) > fuzztest_seed_corpus/rndmsg 2>/dev/null
16for f in fuzztest_seed_corpus/*; do
17    mv $f fuzztest_seed_corpus/$(sha1sum $f | cut -f 1 -d ' ')
18done
19zip -r "$OUT/corpus.zip" fuzztest_seed_corpus
20
21# Build the fuzz testing stubs with instrumentation
22rm -rf build
23
24FUZZERS="build/fuzztest/fuzztest_proto2_static
25         build/fuzztest/fuzztest_proto2_pointer
26         build/fuzztest/fuzztest_proto3_static
27         build/fuzztest/fuzztest_proto3_pointer
28         build/fuzztest/fuzztest_io_errors"
29
30scons CC="$CC" CXX="$CXX" LINK="$CXX" \
31      CCFLAGS="-Wall -Wextra -g -DLLVMFUZZER $CFLAGS" \
32      CXXFLAGS="-Wall -Wextra -g -DLLVMFUZZER $CXXFLAGS" \
33      NODEFARGS="1" \
34      LINKFLAGS="-std=c++11 $CXXFLAGS" \
35      LINKLIBS="$LIB_FUZZING_ENGINE" $FUZZERS
36
37cp $FUZZERS "$OUT"
38
39# The fuzzer test cases are closely related, so use the same seed corpus
40# for all of them.
41for fuzzer in $FUZZERS
42    do cp "$OUT/corpus.zip" "$OUT/$(basename $fuzzer)_seed_corpus.zip"
43done
44rm "$OUT/corpus.zip"
45
46