diff options
author | Fabian Meumertzheim <meumertzheim@code-intelligence.com> | 2023-01-25 16:03:17 +0100 |
---|---|---|
committer | Fabian Meumertzheim <fabian@meumertzhe.im> | 2023-01-26 16:45:37 +0100 |
commit | e9246afa96e7f26e87c6cfb67977657cc3ac2419 (patch) | |
tree | f06ce62bed580ff502b46255d513ae5b4e320141 /src/main/java/com/code_intelligence/jazzer/junit/FuzzTestExecutor.java | |
parent | 3de906524a6eac963d9524f35876ccbbca945d62 (diff) | |
download | jazzer-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.java | 47 |
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; |