aboutsummaryrefslogtreecommitdiff
path: root/bazel/FuzzTargetTestWrapper.java
diff options
context:
space:
mode:
authorFabian Meumertzheim <fabian@meumertzhe.im>2021-10-08 15:41:08 +0200
committerFabian Meumertzheim <fabian@meumertzhe.im>2021-10-17 10:37:34 +0200
commit27b15be5fd30af5f3b64ab6451fb26c417681221 (patch)
tree285c944b7669e73952fb276c694ac2560acd83ac /bazel/FuzzTargetTestWrapper.java
parentc470f962424801a4020cf7215dc27422949f34fd (diff)
downloadjazzer-api-27b15be5fd30af5f3b64ab6451fb26c417681221.tar.gz
Use rules_jni
This simplifies the libjvm location logic as well as native library packaging. Incidentally, this fixes the libjpeg_turbo build. In anticipation of Windows support and because it simplifies further improvements to the fuzz target test setup, the wrapper is rewritten in Java.
Diffstat (limited to 'bazel/FuzzTargetTestWrapper.java')
-rw-r--r--bazel/FuzzTargetTestWrapper.java78
1 files changed, 78 insertions, 0 deletions
diff --git a/bazel/FuzzTargetTestWrapper.java b/bazel/FuzzTargetTestWrapper.java
new file mode 100644
index 00000000..ef22ea0e
--- /dev/null
+++ b/bazel/FuzzTargetTestWrapper.java
@@ -0,0 +1,78 @@
+// Copyright 2021 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.
+
+import com.google.devtools.build.runfiles.Runfiles;
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class FuzzTargetTestWrapper {
+ public static void main(String[] args) {
+ String driverActualPath;
+ String jarActualPath;
+ Runfiles runfiles;
+ try {
+ runfiles = Runfiles.create();
+ driverActualPath = runfiles.rlocation(args[0]);
+ jarActualPath = runfiles.rlocation(args[1]);
+ } catch (IOException | ArrayIndexOutOfBoundsException e) {
+ e.printStackTrace();
+ System.exit(1);
+ return;
+ }
+
+ ProcessBuilder processBuilder = new ProcessBuilder();
+ Map<String, String> environment = processBuilder.environment();
+ // Ensure that Jazzer can find its runfiles.
+ environment.putAll(runfiles.getEnvVars());
+
+ // Crashes will be available as test outputs. These are cleared on the next run,
+ // so this is only useful for examples.
+ String outputDir = System.getenv("TEST_UNDECLARED_OUTPUTS_DIR");
+ List<String> command =
+ Stream
+ .concat(Stream.of(driverActualPath, String.format("-artifact_prefix=%s/", outputDir),
+ String.format("--reproducer_path=%s", outputDir), "-seed=2735196724",
+ String.format("--cp=%s", jarActualPath)),
+ Arrays.stream(args).skip(2))
+ .collect(Collectors.toList());
+ processBuilder.inheritIO();
+ processBuilder.command(command);
+
+ try {
+ int exitCode = processBuilder.start().waitFor();
+ // Assert that we either found a crash in Java (exit code 77) or a sanitizer crash (exit code
+ // 76).
+ if (exitCode != 76 && exitCode != 77) {
+ System.exit(3);
+ }
+ String[] outputFiles = new File(outputDir).list();
+ if (outputFiles == null) {
+ System.exit(4);
+ }
+ // Verify that libFuzzer dumped a crashing input.
+ if (Arrays.stream(outputFiles).noneMatch(name -> name.startsWith("crash-"))) {
+ System.exit(5);
+ }
+ } catch (IOException | InterruptedException e) {
+ e.printStackTrace();
+ System.exit(2);
+ }
+ System.exit(0);
+ }
+}