xref: /aosp_15_r20/external/jazzer-api/examples/junit-spring-web/build-and-run-tests.sh (revision 33edd6723662ea34453766bfdca85dbfdd5342b8)
1*33edd672SMark#!/usr/bin/env bash
2*33edd672SMark# Copyright 2023 Code Intelligence GmbH
3*33edd672SMark#
4*33edd672SMark# Licensed under the Apache License, Version 2.0 (the "License");
5*33edd672SMark# you may not use this file except in compliance with the License.
6*33edd672SMark# You may obtain a copy of the License at
7*33edd672SMark#
8*33edd672SMark#     http://www.apache.org/licenses/LICENSE-2.0
9*33edd672SMark#
10*33edd672SMark# Unless required by applicable law or agreed to in writing, software
11*33edd672SMark# distributed under the License is distributed on an "AS IS" BASIS,
12*33edd672SMark# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*33edd672SMark# See the License for the specific language governing permissions and
14*33edd672SMark# limitations under the License.
15*33edd672SMark
16*33edd672SMark# Development-only. This script builds the example project against the local version of Jazzer,
17*33edd672SMark# runs its unit and fuzz tests, and compares the results with expected results.
18*33edd672SMark
19*33edd672SMarkset -e
20*33edd672SMark( cd ../../ &&
21*33edd672SMark bazel build //...
22*33edd672SMark)
23*33edd672SMark
24*33edd672SMark# Update jazzer version used for building this project in the pom.xml
25*33edd672SMarkJAZZER_VERSION=$(grep -oP '(?<=JAZZER_VERSION = ")[^"]*' ../../maven.bzl)
26*33edd672SMark# Find line with "<artifactId>jazzer-junit</artifactId>" and replace the version in the next line
27*33edd672SMarksed -i "/<artifactId>jazzer-junit<\/artifactId>/ {n;s/<version>.*<\/version>/<version>$JAZZER_VERSION<\/version>/}" pom.xml
28*33edd672SMark
29*33edd672SMark# Add locally-built Jazzer to the Maven repository
30*33edd672SMark./mvnw install:install-file -Dfile=../../bazel-bin/deploy/jazzer-junit-project.jar -DpomFile=../../bazel-bin/deploy/jazzer-junit-pom.xml
31*33edd672SMark./mvnw install:install-file -Dfile=../../bazel-bin/deploy/jazzer-project.jar       -DpomFile=../../bazel-bin/deploy/jazzer-pom.xml
32*33edd672SMark./mvnw install:install-file -Dfile=../../bazel-bin/deploy/jazzer-api-project.jar   -DpomFile=../../bazel-bin/deploy/jazzer-api-pom.xml
33*33edd672SMark
34*33edd672SMark## Regression and unit tests
35*33edd672SMarkecho "[SPRINGBOOT-JUNIT]: These unit and regression fuzz tests should pass"
36*33edd672SMark./mvnw test -Dtest="JunitSpringWebApplicationTests#unitTestShouldPass+fuzzTestShouldPass"
37*33edd672SMark
38*33edd672SMarkecho "[SPRINGBOOT-JUNIT]: This regression fuzz test should fail."
39*33edd672SMark# Temporarily disable exit on error.
40*33edd672SMarkset +e
41*33edd672SMark./mvnw test -Dtest="JunitSpringWebApplicationTests#fuzzTestShouldFail"
42*33edd672SMarkdeclare -i exit_code=$?
43*33edd672SMarkset -e
44*33edd672SMark
45*33edd672SMark# Assert that the test failed with exit code 1.
46*33edd672SMarkif [ $exit_code -eq 1 ]
47*33edd672SMarkthen
48*33edd672SMark  echo "[SPRINGBOOT-JUNIT]: Expected failing fuzz tests: continuing"
49*33edd672SMarkelse
50*33edd672SMark  echo "[SPRINGBOOT-JUNIT]: Expected exit code 1, but got $exit_code"
51*33edd672SMark  exit 1
52*33edd672SMarkfi
53*33edd672SMark
54*33edd672SMark## Fuzz tests
55*33edd672SMarkecho "[SPRINGBOOT-JUNIT]: This fuzz test should pass"
56*33edd672SMarkJAZZER_FUZZ=1 ./mvnw test -Dtest="JunitSpringWebApplicationTests#fuzzTestShouldPass"
57*33edd672SMark
58*33edd672SMarkecho "[SPRINGBOOT-JUNIT]: This fuzz test should fail"
59*33edd672SMarkset +e
60*33edd672SMarkJAZZER_FUZZ=1 ./mvnw test -Dtest="JunitSpringWebApplicationTests#fuzzTestShouldFail"
61*33edd672SMarkdeclare -i exit_code=$?
62*33edd672SMarkset -e
63*33edd672SMark
64*33edd672SMarkif [ $exit_code -eq 1 ]
65*33edd672SMarkthen
66*33edd672SMark  echo "[SPRINGBOOT-JUNIT]: Expected failing fuzz tests: continuing"
67*33edd672SMarkelse
68*33edd672SMark  echo "[SPRINGBOOT-JUNIT]: Expected exit code 1, but got $exit_code"
69*33edd672SMark  exit 1
70*33edd672SMarkfi
71*33edd672SMark
72*33edd672SMarkecho "[SPRINGBOOT-JUNIT]: This fuzz test using autofuzz should fail"
73*33edd672SMarkset +e
74*33edd672SMarkJAZZER_FUZZ=1 ./mvnw test -Dtest="JunitSpringWebApplicationTests#fuzzTestWithDtoShouldFail"
75*33edd672SMarkdeclare -i exit_code=$?
76*33edd672SMarkset -e
77*33edd672SMark
78*33edd672SMarkif [ $exit_code -eq 1 ]
79*33edd672SMarkthen
80*33edd672SMark  echo "[SPRINGBOOT-JUNIT]: Expected failing fuzz tests: continuing"
81*33edd672SMarkelse
82*33edd672SMark  echo "[SPRINGBOOT-JUNIT]: Expected exit code 1, but got $exit_code"
83*33edd672SMark  exit 1
84*33edd672SMarkfi
85*33edd672SMark
86*33edd672SMark## CLI tests
87*33edd672SMark## Assert transitive JUnit dependencies are specified
88*33edd672SMarkassertDependency() {
89*33edd672SMark  if ./mvnw dependency:tree | grep -q "$1"
90*33edd672SMark  then
91*33edd672SMark    echo "[SPRINGBOOT-JUNIT]: Found $1 dependency in project"
92*33edd672SMark  else
93*33edd672SMark    echo "[SPRINGBOOT-JUNIT]: Did not find $1 dependency in project"
94*33edd672SMark    exit 1
95*33edd672SMark  fi
96*33edd672SMark}
97*33edd672SMarkassertDependency "org.junit.jupiter:junit-jupiter-api"
98*33edd672SMarkassertDependency "org.junit.jupiter:junit-jupiter-params"
99*33edd672SMarkassertDependency "org.junit.platform:junit-platform-launcher"
100*33edd672SMark
101*33edd672SMark# Only build project and test jars, no need for a fat-jar or test execution
102*33edd672SMark./mvnw jar:jar
103*33edd672SMark./mvnw jar:test-jar
104*33edd672SMark
105*33edd672SMark# Extract dependency locations
106*33edd672SMarkout=$(./mvnw dependency:build-classpath -DforceStdout)
107*33edd672SMarkdeps=$(echo "$out" | sed '/^\[/d')
108*33edd672SMark
109*33edd672SMark# Directly execute Jazzer without Maven
110*33edd672SMarkecho "[SPRINGBOOT-JUNIT]: Direct Jazzer execution of fuzz test should pass"
111*33edd672SMarkjava -cp "target/*:${deps}" \
112*33edd672SMark  com.code_intelligence.jazzer.Jazzer \
113*33edd672SMark  --target_class=com.example.JunitSpringWebApplicationTests \
114*33edd672SMark  --target_method=fuzzTestShouldPass \
115*33edd672SMark  --instrumentation_includes=com.example.* \
116*33edd672SMark  --custom_hook_includes=com.example.*
117*33edd672SMark
118*33edd672SMark
119*33edd672SMarkecho "[SPRINGBOOT-JUNIT]: Direct Jazzer execution of fuzz test using autofuzz should fail"
120*33edd672SMarkset +e
121*33edd672SMarkJAZZER_FUZZ=1 java -cp "target/*:${deps}" \
122*33edd672SMark  com.code_intelligence.jazzer.Jazzer \
123*33edd672SMark  --target_class=com.example.JunitSpringWebApplicationTests \
124*33edd672SMark  --target_method=fuzzTestWithDtoShouldFail \
125*33edd672SMark  --instrumentation_includes=com.example.* \
126*33edd672SMark  --custom_hook_includes=com.example.*
127*33edd672SMarkdeclare -i exit_code=$?
128*33edd672SMarkset -e
129*33edd672SMark
130*33edd672SMarkif [ $exit_code -eq 77 ]
131*33edd672SMarkthen
132*33edd672SMark  echo "[SPRINGBOOT-JUNIT]: Expected failing fuzz tests: continuing"
133*33edd672SMarkelse
134*33edd672SMark  echo "[SPRINGBOOT-JUNIT]: Expected exit code 77, but got $exit_code"
135*33edd672SMark  exit 1
136*33edd672SMarkfi
137*33edd672SMark
138*33edd672SMarkecho "[SPRINGBOOT-JUNIT]: All tests passed"
139