diff options
Diffstat (limited to 'examples/junit/src/test/java/com/example/LifecycleFuzzTest.java')
-rw-r--r-- | examples/junit/src/test/java/com/example/LifecycleFuzzTest.java | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/examples/junit/src/test/java/com/example/LifecycleFuzzTest.java b/examples/junit/src/test/java/com/example/LifecycleFuzzTest.java new file mode 100644 index 00000000..0d5dc2c7 --- /dev/null +++ b/examples/junit/src/test/java/com/example/LifecycleFuzzTest.java @@ -0,0 +1,94 @@ +/* + * Copyright 2022 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. + */ + +package com.example; + +import com.code_intelligence.jazzer.junit.FuzzTest; +import java.io.IOException; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.TestMethodOrder; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.TestInstancePostProcessor; + +@TestMethodOrder(MethodOrderer.MethodName.class) +@ExtendWith(LifecycleFuzzTest.LifecycleInstancePostProcessor.class) +class LifecycleFuzzTest { + // In fuzzing mode, the test is invoked once on the empty input and once with Jazzer. + private static final int EXPECTED_EACH_COUNT = + System.getenv().getOrDefault("JAZZER_FUZZ", "").isEmpty() ? 1 : 2; + + private static int beforeAllCount = 0; + private static int beforeEachGlobalCount = 0; + private static int afterEachGlobalCount = 0; + private static int afterAllCount = 0; + + private boolean beforeEachCalledOnInstance = false; + private boolean testInstancePostProcessorCalledOnInstance = false; + + @BeforeAll + static void beforeAll() { + beforeAllCount++; + } + + @BeforeEach + void beforeEach() { + beforeEachGlobalCount++; + beforeEachCalledOnInstance = true; + } + + @Disabled + @FuzzTest + void disabledFuzz(byte[] data) { + throw new AssertionError("This test should not be executed"); + } + + @FuzzTest(maxDuration = "1s") + void lifecycleFuzz(byte[] data) { + Assertions.assertEquals(1, beforeAllCount); + Assertions.assertEquals(beforeEachGlobalCount, afterEachGlobalCount + 1); + Assertions.assertTrue(beforeEachCalledOnInstance); + Assertions.assertTrue(testInstancePostProcessorCalledOnInstance); + } + + @AfterEach + void afterEach() { + afterEachGlobalCount++; + } + + @AfterAll + static void afterAll() throws IOException { + afterAllCount++; + Assertions.assertEquals(1, beforeAllCount); + Assertions.assertEquals(EXPECTED_EACH_COUNT, beforeEachGlobalCount); + Assertions.assertEquals(EXPECTED_EACH_COUNT, afterEachGlobalCount); + Assertions.assertEquals(1, afterAllCount); + throw new IOException(); + } + + static class LifecycleInstancePostProcessor implements TestInstancePostProcessor { + @Override + public void postProcessTestInstance(Object o, ExtensionContext extensionContext) { + ((LifecycleFuzzTest) o).testInstancePostProcessorCalledOnInstance = true; + } + } +} |