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