Skip to content

Commit ea24f14

Browse files
committed
Test warning logs for CloseableResource without AutoCloseable
Issue #4434
1 parent c82c098 commit ea24f14

File tree

2 files changed

+55
-16
lines changed

2 files changed

+55
-16
lines changed

Diff for: junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/AbstractExtensionContext.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
import org.junit.jupiter.engine.extension.ExtensionContextInternal;
3636
import org.junit.jupiter.engine.extension.ExtensionRegistry;
3737
import org.junit.platform.commons.JUnitException;
38+
import org.junit.platform.commons.logging.Logger;
39+
import org.junit.platform.commons.logging.LoggerFactory;
3840
import org.junit.platform.commons.util.Preconditions;
3941
import org.junit.platform.commons.util.UnrecoverableExceptions;
4042
import org.junit.platform.engine.EngineExecutionListener;
@@ -50,6 +52,8 @@
5052
*/
5153
abstract class AbstractExtensionContext<T extends TestDescriptor> implements ExtensionContextInternal, AutoCloseable {
5254

55+
private static final Logger LOGGER = LoggerFactory.getLogger(AbstractExtensionContext.class);
56+
5357
private final ExtensionContext parent;
5458
private final EngineExecutionListener engineExecutionListener;
5559
private final T testDescriptor;
@@ -98,8 +102,8 @@ private NamespacedHierarchicalStore.CloseAction<org.junit.platform.engine.suppor
98102

99103
if (value instanceof Store.CloseableResource) {
100104
if (isAutoCloseEnabled) {
101-
engineExecutionListener.reportingEntryPublished(testDescriptor, ReportEntry.from("WARNING",
102-
"Type implements CloseableResource but not AutoCloseable: " + value.getClass().getName()));
105+
LOGGER.warn(
106+
() -> "Type implements CloseableResource but not AutoCloseable: " + value.getClass().getName());
103107
}
104108
((Store.CloseableResource) value).close();
105109
}

Diff for: jupiter-tests/src/test/java/org/junit/jupiter/engine/descriptor/ResourceAutoClosingTests.java

+49-14
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,17 @@
1414
import static org.mockito.Mockito.mock;
1515
import static org.mockito.Mockito.when;
1616

17+
import java.util.logging.Level;
18+
import java.util.logging.LogRecord;
19+
1720
import org.junit.jupiter.api.Test;
18-
import org.junit.jupiter.api.extension.BeforeAllCallback;
19-
import org.junit.jupiter.api.extension.ExtendWith;
2021
import org.junit.jupiter.api.extension.ExtensionContext;
22+
import org.junit.jupiter.api.fixtures.TrackLogRecords;
2123
import org.junit.jupiter.engine.config.JupiterConfiguration;
2224
import org.junit.jupiter.engine.extension.ExtensionRegistry;
25+
import org.junit.platform.commons.logging.LogRecordListener;
2326
import org.junit.platform.launcher.core.NamespacedHierarchicalStoreProviders;
27+
import org.junit.platform.testkit.engine.ExecutionRecorder;
2428

2529
class ResourceAutoClosingTests {
2630

@@ -30,6 +34,7 @@ class ResourceAutoClosingTests {
3034
private final LauncherStoreFacade launcherStoreFacade = new LauncherStoreFacade(
3135
NamespacedHierarchicalStoreProviders.dummyNamespacedHierarchicalStore());
3236

37+
// TODO when config name is renamed, update the test name
3338
@Test
3439
void shouldCloseAutoCloseableWhenAutoCloseEnabledIsTrue() throws Exception {
3540
AutoCloseableResource resource = new AutoCloseableResource();
@@ -60,6 +65,42 @@ void shouldNotCloseAutoCloseableWhenAutoCloseEnabledIsFalse() throws Exception {
6065
assertThat(resource.closed).isFalse();
6166
}
6267

68+
@Test
69+
void shouldLogWarningWhenClosingResourceImplementsCloseableResourceButNotAutoCloseableAndConfigIsTrue(
70+
@TrackLogRecords LogRecordListener listener) throws Exception {
71+
ExecutionRecorder executionRecorder = new ExecutionRecorder();
72+
CloseableResource resource = new CloseableResource();
73+
String msg = "Type implements CloseableResource but not AutoCloseable: " + resource.getClass().getName();
74+
when(configuration.isAutoCloseEnabled()).thenReturn(true);
75+
76+
ExtensionContext extensionContext = new JupiterEngineExtensionContext(executionRecorder, testDescriptor,
77+
configuration, extensionRegistry, launcherStoreFacade);
78+
ExtensionContext.Store store = extensionContext.getStore(ExtensionContext.Namespace.GLOBAL);
79+
store.put("resource", resource);
80+
81+
((AutoCloseable) extensionContext).close();
82+
assertThat(listener.stream(Level.WARNING)).map(LogRecord::getMessage).anyMatch(msg::equals);
83+
assertThat(resource.closed).isTrue();
84+
}
85+
86+
@Test
87+
void shouldNotLogWarningWhenClosingResourceImplementsCloseableResourceAndAutoCloseableAndConfigIsFalse(
88+
@TrackLogRecords LogRecordListener listener) throws Exception {
89+
ExecutionRecorder executionRecorder = new ExecutionRecorder();
90+
CloseableResource resource = new CloseableResource();
91+
String msg = "Type implements CloseableResource but not AutoCloseable: " + resource.getClass().getName();
92+
when(configuration.isAutoCloseEnabled()).thenReturn(false);
93+
94+
ExtensionContext extensionContext = new JupiterEngineExtensionContext(executionRecorder, testDescriptor,
95+
configuration, extensionRegistry, launcherStoreFacade);
96+
ExtensionContext.Store store = extensionContext.getStore(ExtensionContext.Namespace.GLOBAL);
97+
store.put("resource", resource);
98+
99+
((AutoCloseable) extensionContext).close();
100+
assertThat(listener.stream(Level.WARNING)).map(LogRecord::getMessage).noneMatch(msg::equals);
101+
assertThat(resource.closed).isTrue();
102+
}
103+
63104
static class AutoCloseableResource implements AutoCloseable {
64105
private boolean closed = false;
65106

@@ -69,19 +110,13 @@ public void close() {
69110
}
70111
}
71112

72-
static class AutoCloseableResourceStoreUsingExtension implements BeforeAllCallback {
73-
@Override
74-
public void beforeAll(ExtensionContext context) {
75-
var store = context.getStore(ExtensionContext.Namespace.GLOBAL);
76-
store.put("resource", new AutoCloseableResource());
77-
}
78-
}
113+
@SuppressWarnings("deprecation")
114+
static class CloseableResource implements ExtensionContext.Store.CloseableResource {
115+
private boolean closed = false;
79116

80-
@SuppressWarnings("JUnitMalformedDeclaration")
81-
@ExtendWith(AutoCloseableResourceStoreUsingExtension.class)
82-
static class AutoCloseableTestCase {
83-
@Test
84-
void dummyTest() {
117+
@Override
118+
public void close() {
119+
closed = true;
85120
}
86121
}
87122
}

0 commit comments

Comments
 (0)