#!/usr/bin/env bash
# Copyright 2023 Code Intelligence GmbH
#
# 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.
# Development-only. This script builds the example project against the local version of Jazzer,
# runs its unit and fuzz tests, and compares the results with expected results.
set -e
( cd ../../ &&
bazel build //...
)
# Update jazzer version used for building this project in the pom.xml
JAZZER_VERSION=$(grep -oP '(?<=JAZZER_VERSION = ")[^"]*' ../../maven.bzl)
# Find line with "jazzer-junit" and replace the version in the next line
sed -i "/jazzer-junit<\/artifactId>/ {n;s/.*<\/version>/$JAZZER_VERSION<\/version>/}" pom.xml
# Add locally-built Jazzer to the Maven repository
./mvnw install:install-file -Dfile=../../bazel-bin/deploy/jazzer-junit-project.jar -DpomFile=../../bazel-bin/deploy/jazzer-junit-pom.xml
./mvnw install:install-file -Dfile=../../bazel-bin/deploy/jazzer-project.jar -DpomFile=../../bazel-bin/deploy/jazzer-pom.xml
./mvnw install:install-file -Dfile=../../bazel-bin/deploy/jazzer-api-project.jar -DpomFile=../../bazel-bin/deploy/jazzer-api-pom.xml
## Regression and unit tests
echo "[SPRINGBOOT-JUNIT]: These unit and regression fuzz tests should pass"
./mvnw test -Dtest="JunitSpringWebApplicationTests#unitTestShouldPass+fuzzTestShouldPass"
echo "[SPRINGBOOT-JUNIT]: This regression fuzz test should fail."
# Temporarily disable exit on error.
set +e
./mvnw test -Dtest="JunitSpringWebApplicationTests#fuzzTestShouldFail"
declare -i exit_code=$?
set -e
# Assert that the test failed with exit code 1.
if [ $exit_code -eq 1 ]
then
echo "[SPRINGBOOT-JUNIT]: Expected failing fuzz tests: continuing"
else
echo "[SPRINGBOOT-JUNIT]: Expected exit code 1, but got $exit_code"
exit 1
fi
## Fuzz tests
echo "[SPRINGBOOT-JUNIT]: This fuzz test should pass"
JAZZER_FUZZ=1 ./mvnw test -Dtest="JunitSpringWebApplicationTests#fuzzTestShouldPass"
echo "[SPRINGBOOT-JUNIT]: This fuzz test should fail"
set +e
JAZZER_FUZZ=1 ./mvnw test -Dtest="JunitSpringWebApplicationTests#fuzzTestShouldFail"
declare -i exit_code=$?
set -e
if [ $exit_code -eq 1 ]
then
echo "[SPRINGBOOT-JUNIT]: Expected failing fuzz tests: continuing"
else
echo "[SPRINGBOOT-JUNIT]: Expected exit code 1, but got $exit_code"
exit 1
fi
echo "[SPRINGBOOT-JUNIT]: This fuzz test using autofuzz should fail"
set +e
JAZZER_FUZZ=1 ./mvnw test -Dtest="JunitSpringWebApplicationTests#fuzzTestWithDtoShouldFail"
declare -i exit_code=$?
set -e
if [ $exit_code -eq 1 ]
then
echo "[SPRINGBOOT-JUNIT]: Expected failing fuzz tests: continuing"
else
echo "[SPRINGBOOT-JUNIT]: Expected exit code 1, but got $exit_code"
exit 1
fi
## CLI tests
## Assert transitive JUnit dependencies are specified
assertDependency() {
if ./mvnw dependency:tree | grep -q "$1"
then
echo "[SPRINGBOOT-JUNIT]: Found $1 dependency in project"
else
echo "[SPRINGBOOT-JUNIT]: Did not find $1 dependency in project"
exit 1
fi
}
assertDependency "org.junit.jupiter:junit-jupiter-api"
assertDependency "org.junit.jupiter:junit-jupiter-params"
assertDependency "org.junit.platform:junit-platform-launcher"
# Only build project and test jars, no need for a fat-jar or test execution
./mvnw jar:jar
./mvnw jar:test-jar
# Extract dependency locations
out=$(./mvnw dependency:build-classpath -DforceStdout)
deps=$(echo "$out" | sed '/^\[/d')
# Directly execute Jazzer without Maven
echo "[SPRINGBOOT-JUNIT]: Direct Jazzer execution of fuzz test should pass"
java -cp "target/*:${deps}" \
com.code_intelligence.jazzer.Jazzer \
--target_class=com.example.JunitSpringWebApplicationTests \
--target_method=fuzzTestShouldPass \
--instrumentation_includes=com.example.* \
--custom_hook_includes=com.example.*
echo "[SPRINGBOOT-JUNIT]: Direct Jazzer execution of fuzz test using autofuzz should fail"
set +e
JAZZER_FUZZ=1 java -cp "target/*:${deps}" \
com.code_intelligence.jazzer.Jazzer \
--target_class=com.example.JunitSpringWebApplicationTests \
--target_method=fuzzTestWithDtoShouldFail \
--instrumentation_includes=com.example.* \
--custom_hook_includes=com.example.*
declare -i exit_code=$?
set -e
if [ $exit_code -eq 77 ]
then
echo "[SPRINGBOOT-JUNIT]: Expected failing fuzz tests: continuing"
else
echo "[SPRINGBOOT-JUNIT]: Expected exit code 77, but got $exit_code"
exit 1
fi
echo "[SPRINGBOOT-JUNIT]: All tests passed"