Skip to content

Commit 13a7c77

Browse files
committed
tests: Extract common base class out of lifecycle tests
1 parent 55eb18b commit 13a7c77

File tree

5 files changed

+224
-488
lines changed

5 files changed

+224
-488
lines changed

examples/junit/src/test/java/com/example/BUILD.bazel

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ java_fuzz_target_test(
8484
":junit_runtime",
8585
],
8686
deps = [
87+
":lifecycle_recording_test_base",
8788
":test_successful_exception",
8889
"//examples/junit/src/main/java/com/example:parser",
8990
"//src/main/java/com/code_intelligence/jazzer/junit:fuzz_test",
@@ -107,6 +108,7 @@ java_fuzz_target_test(
107108
":junit_runtime",
108109
],
109110
deps = [
111+
":lifecycle_recording_test_base",
110112
":test_successful_exception",
111113
"//examples/junit/src/main/java/com/example:parser",
112114
"//src/main/java/com/code_intelligence/jazzer/junit:fuzz_test",
@@ -131,6 +133,7 @@ java_fuzz_target_test(
131133
":junit_runtime",
132134
],
133135
deps = [
136+
":lifecycle_recording_test_base",
134137
":test_successful_exception",
135138
"//examples/junit/src/main/java/com/example:parser",
136139
"//src/main/java/com/code_intelligence/jazzer/junit:fuzz_test",
@@ -309,6 +312,18 @@ java_fuzz_target_test(
309312
]
310313
]
311314

315+
java_library(
316+
name = "lifecycle_recording_test_base",
317+
testonly = True,
318+
srcs = ["LifecycleRecordingTestBase.java"],
319+
deps = [
320+
"//src/main/java/com/code_intelligence/jazzer/junit:fuzz_test",
321+
"@maven//:com_google_truth_extensions_truth_java8_extension",
322+
"@maven//:com_google_truth_truth",
323+
"@maven//:org_junit_jupiter_junit_jupiter_api",
324+
],
325+
)
326+
312327
java_library(
313328
name = "junit_runtime",
314329
runtime_deps = [
Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
/*
2+
* Copyright 2023 Code Intelligence GmbH
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.example;
18+
19+
import static com.google.common.truth.Truth.assertThat;
20+
import static com.google.common.truth.Truth8.assertThat;
21+
import static java.util.stream.Collectors.collectingAndThen;
22+
import static java.util.stream.Collectors.toList;
23+
24+
import com.code_intelligence.jazzer.junit.FuzzTest;
25+
import com.example.LifecycleRecordingTestBase.LifecycleCallbacks1;
26+
import com.example.LifecycleRecordingTestBase.LifecycleCallbacks2;
27+
import com.example.LifecycleRecordingTestBase.LifecycleCallbacks3;
28+
import java.util.Collections;
29+
import java.util.List;
30+
import java.util.stream.Stream;
31+
import org.junit.jupiter.api.AfterEach;
32+
import org.junit.jupiter.api.BeforeEach;
33+
import org.junit.jupiter.api.Disabled;
34+
import org.junit.jupiter.api.MethodOrderer;
35+
import org.junit.jupiter.api.TestMethodOrder;
36+
import org.junit.jupiter.api.extension.AfterEachCallback;
37+
import org.junit.jupiter.api.extension.BeforeEachCallback;
38+
import org.junit.jupiter.api.extension.ExtendWith;
39+
import org.junit.jupiter.api.extension.ExtensionContext;
40+
import org.junit.jupiter.api.extension.TestInstancePostProcessor;
41+
42+
@TestMethodOrder(MethodOrderer.MethodName.class)
43+
@ExtendWith(LifecycleRecordingTestBase.LifecycleInstancePostProcessor.class)
44+
@ExtendWith(LifecycleCallbacks1.class)
45+
@ExtendWith(LifecycleCallbacks2.class)
46+
@ExtendWith(LifecycleCallbacks3.class)
47+
public abstract class LifecycleRecordingTestBase {
48+
49+
protected static final long RUNS = 3;
50+
protected static final boolean IS_REGRESSION_TEST = "".equals(System.getenv("JAZZER_FUZZ"));
51+
protected static final boolean IS_FUZZING_FROM_COMMAND_LINE =
52+
System.getenv("JAZZER_FUZZ") == null;
53+
protected static final boolean IS_FUZZING_FROM_JUNIT =
54+
!IS_FUZZING_FROM_COMMAND_LINE && !IS_REGRESSION_TEST;
55+
56+
private static int nextInstanceId = 1;
57+
private final int instanceId = nextInstanceId++;
58+
59+
protected abstract List<String> events();
60+
61+
static List<String> expectedBeforeEachEvents(int instanceId) {
62+
return Stream.of(
63+
"beforeEachCallback1",
64+
"beforeEachCallback2",
65+
"beforeEachCallback3",
66+
"beforeEach1",
67+
"beforeEach2",
68+
"beforeEach3")
69+
.map(s -> s + " on " + instanceId)
70+
.collect(collectingAndThen(toList(), Collections::unmodifiableList));
71+
}
72+
73+
static List<String> expectedAfterEachEvents(int instanceId) {
74+
return Stream.of(
75+
"afterEach1",
76+
"afterEach2",
77+
"afterEach3",
78+
"afterEachCallback3",
79+
"afterEachCallback2",
80+
"afterEachCallback1")
81+
.map(s -> s + " on " + instanceId)
82+
.collect(collectingAndThen(toList(), Collections::unmodifiableList));
83+
}
84+
85+
static void assertConsistentTestInstances(ExtensionContext extensionContext) {
86+
assertThat(extensionContext.getTestInstance().get())
87+
.isSameInstanceAs(extensionContext.getRequiredTestInstance());
88+
assertThat(extensionContext.getTestInstances().get())
89+
.isSameInstanceAs(extensionContext.getRequiredTestInstances());
90+
assertThat(extensionContext.getRequiredTestInstances().getAllInstances())
91+
.containsExactly(extensionContext.getRequiredTestInstance());
92+
}
93+
94+
protected void addEvent(String what) {
95+
events().add(what + " on " + instanceId);
96+
}
97+
98+
@Disabled
99+
@FuzzTest
100+
void disabledFuzz(byte[] data) {
101+
addEvent("disabledFuzz");
102+
throw new AssertionError("This test should not be executed");
103+
}
104+
105+
@BeforeEach
106+
void beforeEach1() {
107+
addEvent("beforeEach1");
108+
}
109+
110+
@BeforeEach
111+
void beforeEach2() {
112+
addEvent("beforeEach2");
113+
}
114+
115+
@BeforeEach
116+
void beforeEach3() {
117+
addEvent("beforeEach3");
118+
}
119+
120+
@AfterEach
121+
void afterEach1() {
122+
addEvent("afterEach1");
123+
}
124+
125+
@AfterEach
126+
void afterEach2() {
127+
addEvent("afterEach2");
128+
}
129+
130+
@AfterEach
131+
void afterEach3() {
132+
addEvent("afterEach3");
133+
}
134+
135+
static class LifecycleInstancePostProcessor implements TestInstancePostProcessor {
136+
@Override
137+
public void postProcessTestInstance(Object o, ExtensionContext extensionContext) {
138+
assertThat(extensionContext.getTestInstance()).isEmpty();
139+
assertThat(extensionContext.getTestInstances()).isEmpty();
140+
((LifecycleRecordingTestBase) o).addEvent("postProcessTestInstance");
141+
}
142+
}
143+
144+
static class LifecycleCallbacks1 implements BeforeEachCallback, AfterEachCallback {
145+
@Override
146+
public void beforeEach(ExtensionContext extensionContext) {
147+
assertConsistentTestInstances(extensionContext);
148+
((LifecycleRecordingTestBase) extensionContext.getRequiredTestInstance())
149+
.addEvent("beforeEachCallback1");
150+
}
151+
152+
@Override
153+
public void afterEach(ExtensionContext extensionContext) {
154+
assertConsistentTestInstances(extensionContext);
155+
((LifecycleRecordingTestBase) extensionContext.getRequiredTestInstance())
156+
.addEvent("afterEachCallback1");
157+
}
158+
}
159+
160+
static class LifecycleCallbacks2 implements BeforeEachCallback, AfterEachCallback {
161+
@Override
162+
public void beforeEach(ExtensionContext extensionContext) {
163+
assertConsistentTestInstances(extensionContext);
164+
((LifecycleRecordingTestBase) extensionContext.getRequiredTestInstance())
165+
.addEvent("beforeEachCallback2");
166+
}
167+
168+
@Override
169+
public void afterEach(ExtensionContext extensionContext) {
170+
assertConsistentTestInstances(extensionContext);
171+
((LifecycleRecordingTestBase) extensionContext.getRequiredTestInstance())
172+
.addEvent("afterEachCallback2");
173+
}
174+
}
175+
176+
static class LifecycleCallbacks3 implements BeforeEachCallback, AfterEachCallback {
177+
@Override
178+
public void beforeEach(ExtensionContext extensionContext) {
179+
assertConsistentTestInstances(extensionContext);
180+
((LifecycleRecordingTestBase) extensionContext.getRequiredTestInstance())
181+
.addEvent("beforeEachCallback3");
182+
}
183+
184+
@Override
185+
public void afterEach(ExtensionContext extensionContext) {
186+
assertConsistentTestInstances(extensionContext);
187+
((LifecycleRecordingTestBase) extensionContext.getRequiredTestInstance())
188+
.addEvent("afterEachCallback3");
189+
}
190+
}
191+
}

0 commit comments

Comments
 (0)