aboutsummaryrefslogtreecommitdiffhomepage
path: root/infra/base-images/base-runner/test_report
blob: 62365dabb54ab42adef871fb5fa3e2be893d28aa (plain)
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#!/bin/bash -eu
# Copyright 2016 Google Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
################################################################################

# Test fuzzers and writes junit xml reports.

REPORT_DIR="/junit_reports"
mkdir -p $REPORT_DIR

N=0
TOTAL_FAILURES=0
for FUZZER_BINARY in $(find $OUT/ -executable -type f); do
  if file "$FUZZER_BINARY" | grep -v ELF > /dev/null 2>&1; then
    continue
  fi

  FUZZER=$(basename $FUZZER_BINARY)
  if echo "$FUZZER" | grep "^afl-" > /dev/null 2>&1; then
    continue
  fi

  N=$[$N+1]
  echo "testing $FUZZER"

  # run fuzzer.
  FUZZER_STDOUT=$(tempfile)
  if [[ "$FUZZING_ENGINE" = libfuzzer ]]; then
    run_fuzzer $FUZZER -max_total_time=20 |& tee $FUZZER_STDOUT
  else
    export AFL_NO_UI=1
    timeout --preserve-status -s INT 20s run_fuzzer $FUZZER |& tee $FUZZER_STDOUT
  fi
  FUZZER_STATUS=${PIPESTATUS[0]}

  FAILURES=0
  FAILURE_TAG=""
  if [ "$FUZZER_STATUS" -ne "0" ]; then
    echo "ERROR: bad exit code: $FUZZER_STATUS"
    FAILURES=1
    FAILURE_TAG="<failure message=\"Fuzzer failed\">$FUZZER_STATUS</failure>"
    TOTAL_FAILURES=$[$TOTAL_FAILURES+1]
  fi

  # generate report.
  TIMESTAMP=$(date --iso-8601=seconds)
  HOSTNAME=$(hostname)
  TESTNAME="${TEST_SUITE:-}$FUZZER"

  OUT_TXT=$(cat $FUZZER_STDOUT)
  
  # Escape non-printable characters and CDATA end sequence.
  OUT_TXT=${OUT_TXT//[^[:print:]]/?}
  OUT_TXT=${OUT_TXT//]]>/?}

  REPORT_TEXT=$(cat <<-EOF
<?xml version="1.0" encoding="UTF-8"?>
<testsuite name="$TESTNAME" tests="1" skipped="0" failures="$FAILURES" errors="0" timestamp="$TIMESTAMP" hostname="$HOSTNAME" time="1">
  <properties/>
  <testcase name="$TESTNAME" classname="$TESTNAME" time="1">${FAILURE_TAG}</testcase>
  <system-out><![CDATA[${OUT_TXT}]]></system-out>
  <system-err></system-err>
</testsuite>
EOF
)
  echo "$REPORT_TEXT" > /junit_reports/$FUZZER.xml
done

if [ "$N" -eq "0" ]; then
  echo "ERROR: no fuzzers found in $OUT/"
  ls -al $OUT
  exit 1
fi

echo "$N fuzzers total ($TOTAL_FAILURES failed)."