aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/code_intelligence/jazzer/junit/FuzzTestExecutor.java
diff options
context:
space:
mode:
authorFabian Meumertzheim <meumertzheim@code-intelligence.com>2023-01-25 16:03:17 +0100
committerFabian Meumertzheim <fabian@meumertzhe.im>2023-01-26 16:45:37 +0100
commite9246afa96e7f26e87c6cfb67977657cc3ac2419 (patch)
treef06ce62bed580ff502b46255d513ae5b4e320141 /src/main/java/com/code_intelligence/jazzer/junit/FuzzTestExecutor.java
parent3de906524a6eac963d9524f35876ccbbca945d62 (diff)
downloadjazzer-api-e9246afa96e7f26e87c6cfb67977657cc3ac2419.tar.gz
driver: Add a JUnit runner
The new runner uses the JUnit launcher API to run `@FuzzTest`s using JUnit, which provides support for Jupiter extensions even when running these tests from the command line. The new runner renders the `@FuzzTest` logic in `FuzzTargetFinder` obsolete. This commit removes it.
Diffstat (limited to 'src/main/java/com/code_intelligence/jazzer/junit/FuzzTestExecutor.java')
-rw-r--r--src/main/java/com/code_intelligence/jazzer/junit/FuzzTestExecutor.java47
1 files changed, 46 insertions, 1 deletions
diff --git a/src/main/java/com/code_intelligence/jazzer/junit/FuzzTestExecutor.java b/src/main/java/com/code_intelligence/jazzer/junit/FuzzTestExecutor.java
index 7f968156..1ff29f8d 100644
--- a/src/main/java/com/code_intelligence/jazzer/junit/FuzzTestExecutor.java
+++ b/src/main/java/com/code_intelligence/jazzer/junit/FuzzTestExecutor.java
@@ -17,11 +17,14 @@ package com.code_intelligence.jazzer.junit;
import static com.code_intelligence.jazzer.junit.Utils.generatedCorpusPath;
import static com.code_intelligence.jazzer.junit.Utils.inputsDirectoryResourcePath;
import static com.code_intelligence.jazzer.junit.Utils.inputsDirectorySourcePath;
+import static com.code_intelligence.jazzer.junit.Utils.runFromCommandLine;
import static com.code_intelligence.jazzer.utils.Utils.getReadableDescriptor;
+import static java.util.Collections.unmodifiableList;
import com.code_intelligence.jazzer.api.FuzzedDataProvider;
import com.code_intelligence.jazzer.driver.FuzzTargetHolder;
import com.code_intelligence.jazzer.driver.FuzzTargetRunner;
+import com.code_intelligence.jazzer.driver.junit.ExitCodeException;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
@@ -62,7 +65,15 @@ abstract class FuzzTestExecutor {
fuzzTestMethod.getName(), getReadableDescriptor(fuzzTestMethod)));
}
- return prepareForTestRunner(context, maxDuration);
+ if (runFromCommandLine(context)) {
+ return prepareForCommandLine(context);
+ } else {
+ return prepareForTestRunner(context, maxDuration);
+ }
+ }
+
+ private static FuzzTestExecutor prepareForCommandLine(ExtensionContext context) {
+ return new CommandLineFuzzTestExecutor(context);
}
private static FuzzTestExecutor prepareForTestRunner(ExtensionContext context, String maxDuration)
@@ -166,6 +177,40 @@ abstract class FuzzTestExecutor {
return executeInternal(invocationContext);
}
+ private static final class CommandLineFuzzTestExecutor extends FuzzTestExecutor {
+ private final List<String> libFuzzerArgs;
+
+ private CommandLineFuzzTestExecutor(ExtensionContext extensionContext) {
+ this.libFuzzerArgs = getLibFuzzerArgs(extensionContext);
+ }
+
+ /**
+ * Returns the list of arguments set on the command line.
+ */
+ private static List<String> getLibFuzzerArgs(ExtensionContext extensionContext) {
+ ArrayList<String> args = new ArrayList<>();
+ for (int i = 0;; i++) {
+ Optional<String> arg =
+ extensionContext.getConfigurationParameter("jazzer.internal.arg." + i);
+ if (!arg.isPresent()) {
+ break;
+ }
+ args.add(arg.get());
+ }
+ return unmodifiableList(args);
+ }
+
+ public Optional<Throwable> executeInternal(
+ ReflectiveInvocationContext<Method> invocationContext) {
+ int exitCode = FuzzTargetRunner.startLibFuzzer(libFuzzerArgs);
+ if (exitCode != 0) {
+ return Optional.of(new ExitCodeException(exitCode));
+ } else {
+ return Optional.empty();
+ }
+ }
+ }
+
private static final class TestRunnerFuzzTestExecutor extends FuzzTestExecutor {
private final List<String> libFuzzerArgs;