Skip to content

Commit 7a056cd

Browse files
committed
Load interceptors before session listeners
1 parent a13b99a commit 7a056cd

File tree

16 files changed

+181
-186
lines changed

16 files changed

+181
-186
lines changed

junit-platform-launcher/src/main/java/org/junit/platform/launcher/LauncherInterceptor.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
package org.junit.platform.launcher;
1212

1313
import static org.apiguardian.api.API.Status.EXPERIMENTAL;
14+
import static org.apiguardian.api.API.Status.INTERNAL;
15+
16+
import java.util.List;
1417

1518
import org.apiguardian.api.API;
1619

@@ -28,6 +31,18 @@
2831
@API(status = EXPERIMENTAL, since = "1.10")
2932
public interface LauncherInterceptor {
3033

34+
LauncherInterceptor NOOP = new LauncherInterceptor() {
35+
@Override
36+
public <T> T intercept(Invocation<T> invocation) {
37+
return invocation.proceed();
38+
}
39+
40+
@Override
41+
public void close() {
42+
// do nothing
43+
}
44+
};
45+
3146
/**
3247
* Intercept the supplied invocation.
3348
*
@@ -54,4 +69,29 @@ public interface LauncherInterceptor {
5469
interface Invocation<T> {
5570
T proceed();
5671
}
72+
73+
@API(status = INTERNAL, since = "1.10")
74+
static LauncherInterceptor composite(List<LauncherInterceptor> interceptors) {
75+
if (interceptors.isEmpty()) {
76+
return NOOP;
77+
}
78+
return interceptors.stream() //
79+
.skip(1) //
80+
.reduce(interceptors.get(0), (a, b) -> new LauncherInterceptor() {
81+
@Override
82+
public void close() {
83+
try {
84+
a.close();
85+
}
86+
finally {
87+
b.close();
88+
}
89+
}
90+
91+
@Override
92+
public <T> T intercept(Invocation<T> invocation) {
93+
return a.intercept(() -> b.intercept(invocation));
94+
}
95+
});
96+
}
5797
}

junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/CloseableLauncher.java

Lines changed: 0 additions & 21 deletions
This file was deleted.

junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/DefaultLauncherSession.java

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,23 @@
2828
*/
2929
class DefaultLauncherSession implements LauncherSession {
3030

31-
private final DelegatingCloseableLauncher<CloseableLauncher> launcher;
31+
private final LauncherInterceptor interceptor;
3232
private final LauncherSessionListener listener;
33-
34-
DefaultLauncherSession(Supplier<Launcher> launcherSupplier, List<LauncherInterceptor> interceptors,
35-
LauncherSessionListener listener) {
36-
CloseableLauncher closeableLauncher = InterceptingClosableLauncher.decorate(launcherSupplier, interceptors);
37-
this.launcher = new DelegatingCloseableLauncher<>(closeableLauncher, delegate -> {
38-
delegate.close();
39-
return ClosedLauncher.INSTANCE;
40-
});
41-
this.listener = listener;
33+
private final DelegatingLauncher launcher;
34+
35+
DefaultLauncherSession(List<LauncherInterceptor> interceptors, Supplier<LauncherSessionListener> listenerSupplier,
36+
Supplier<Launcher> launcherSupplier) {
37+
interceptor = LauncherInterceptor.composite(interceptors);
38+
Launcher launcher;
39+
if (interceptor == LauncherInterceptor.NOOP) {
40+
this.listener = listenerSupplier.get();
41+
launcher = launcherSupplier.get();
42+
}
43+
else {
44+
this.listener = interceptor.intercept(listenerSupplier::get);
45+
launcher = new InterceptingLauncher(interceptor.intercept(launcherSupplier::get), interceptor);
46+
}
47+
this.launcher = new DelegatingLauncher(launcher);
4248
listener.launcherSessionOpened(this);
4349
}
4450

@@ -53,13 +59,14 @@ LauncherSessionListener getListener() {
5359

5460
@Override
5561
public void close() {
56-
if (!launcher.isClosed()) {
57-
launcher.close();
62+
if (launcher.delegate != ClosedLauncher.INSTANCE) {
63+
launcher.delegate = ClosedLauncher.INSTANCE;
5864
listener.launcherSessionClosed(this);
65+
interceptor.close();
5966
}
6067
}
6168

62-
private static class ClosedLauncher implements CloseableLauncher {
69+
private static class ClosedLauncher implements Launcher {
6370

6471
static final ClosedLauncher INSTANCE = new ClosedLauncher();
6572

@@ -90,10 +97,5 @@ public void execute(LauncherDiscoveryRequest launcherDiscoveryRequest, TestExecu
9097
public void execute(TestPlan testPlan, TestExecutionListener... listeners) {
9198
throw new PreconditionViolationException("Launcher session has already been closed");
9299
}
93-
94-
@Override
95-
public void close() {
96-
// do nothing
97-
}
98100
}
99101
}

junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/DelegatingCloseableLauncher.java

Lines changed: 0 additions & 41 deletions
This file was deleted.

junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/DelegatingLauncher.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,11 @@
1919
/**
2020
* @since 1.10
2121
*/
22-
class DelegatingLauncher<T extends Launcher> implements Launcher {
22+
class DelegatingLauncher implements Launcher {
2323

24-
protected T delegate;
24+
protected Launcher delegate;
2525

26-
DelegatingLauncher(T delegate) {
26+
DelegatingLauncher(Launcher delegate) {
2727
this.delegate = delegate;
2828
}
2929

junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/InterceptingClosableLauncher.java

Lines changed: 0 additions & 93 deletions
This file was deleted.
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/*
2+
* Copyright 2015-2023 the original author or authors.
3+
*
4+
* All rights reserved. This program and the accompanying materials are
5+
* made available under the terms of the Eclipse Public License v2.0 which
6+
* accompanies this distribution and is available at
7+
*
8+
* https://www.eclipse.org/legal/epl-v20.html
9+
*/
10+
11+
package org.junit.platform.launcher.core;
12+
13+
import org.junit.platform.launcher.Launcher;
14+
import org.junit.platform.launcher.LauncherDiscoveryRequest;
15+
import org.junit.platform.launcher.LauncherInterceptor;
16+
import org.junit.platform.launcher.TestExecutionListener;
17+
import org.junit.platform.launcher.TestPlan;
18+
19+
/**
20+
* @since 1.10
21+
*/
22+
class InterceptingLauncher extends DelegatingLauncher {
23+
24+
private final LauncherInterceptor interceptor;
25+
26+
InterceptingLauncher(Launcher delegate, LauncherInterceptor interceptor) {
27+
super(delegate);
28+
this.interceptor = interceptor;
29+
}
30+
31+
@Override
32+
public TestPlan discover(LauncherDiscoveryRequest launcherDiscoveryRequest) {
33+
return interceptor.intercept(() -> super.discover(launcherDiscoveryRequest));
34+
}
35+
36+
@Override
37+
public void execute(LauncherDiscoveryRequest launcherDiscoveryRequest, TestExecutionListener... listeners) {
38+
interceptor.intercept(() -> {
39+
super.execute(launcherDiscoveryRequest, listeners);
40+
return null;
41+
});
42+
}
43+
44+
@Override
45+
public void execute(TestPlan testPlan, TestExecutionListener... listeners) {
46+
interceptor.intercept(() -> {
47+
super.execute(testPlan, listeners);
48+
return null;
49+
});
50+
}
51+
}

junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/LauncherFactory.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,8 @@ public static LauncherSession openSession() throws PreconditionViolationExceptio
100100
public static LauncherSession openSession(LauncherConfig config) throws PreconditionViolationException {
101101
Preconditions.notNull(config, "LauncherConfig must not be null");
102102
LauncherConfigurationParameters configurationParameters = LauncherConfigurationParameters.builder().build();
103-
return new DefaultLauncherSession(() -> createDefaultLauncher(config, configurationParameters),
104-
collectLauncherInterceptors(configurationParameters), createLauncherSessionListener(config));
103+
return new DefaultLauncherSession(collectLauncherInterceptors(configurationParameters),
104+
() -> createLauncherSessionListener(config), () -> createDefaultLauncher(config, configurationParameters));
105105
}
106106

107107
/**
@@ -131,7 +131,7 @@ public static Launcher create(LauncherConfig config) throws PreconditionViolatio
131131
Preconditions.notNull(config, "LauncherConfig must not be null");
132132
LauncherConfigurationParameters configurationParameters = LauncherConfigurationParameters.builder().build();
133133
return new SessionPerRequestLauncher(() -> createDefaultLauncher(config, configurationParameters),
134-
createLauncherSessionListener(config), () -> collectLauncherInterceptors(configurationParameters));
134+
() -> createLauncherSessionListener(config), () -> collectLauncherInterceptors(configurationParameters));
135135
}
136136

137137
private static DefaultLauncher createDefaultLauncher(LauncherConfig config,

junit-platform-launcher/src/main/java/org/junit/platform/launcher/core/SessionPerRequestLauncher.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,14 @@ class SessionPerRequestLauncher implements Launcher {
2929

3030
private final LauncherListenerRegistry listenerRegistry = new LauncherListenerRegistry();
3131
private final Supplier<Launcher> launcherSupplier;
32-
private final LauncherSessionListener sessionListener;
32+
private final Supplier<LauncherSessionListener> sessionListenerSupplier;
3333
private final Supplier<List<LauncherInterceptor>> interceptorFactory;
3434

35-
SessionPerRequestLauncher(Supplier<Launcher> launcherSupplier, LauncherSessionListener sessionListener,
35+
SessionPerRequestLauncher(Supplier<Launcher> launcherSupplier,
36+
Supplier<LauncherSessionListener> sessionListenerSupplier,
3637
Supplier<List<LauncherInterceptor>> interceptorFactory) {
3738
this.launcherSupplier = launcherSupplier;
38-
this.sessionListener = sessionListener;
39+
this.sessionListenerSupplier = sessionListenerSupplier;
3940
this.interceptorFactory = interceptorFactory;
4041
}
4142

@@ -71,8 +72,8 @@ public void execute(TestPlan testPlan, TestExecutionListener... listeners) {
7172
}
7273

7374
private LauncherSession createSession() {
74-
LauncherSession session = new DefaultLauncherSession(launcherSupplier, interceptorFactory.get(),
75-
sessionListener);
75+
LauncherSession session = new DefaultLauncherSession(interceptorFactory.get(), sessionListenerSupplier,
76+
launcherSupplier);
7677
Launcher launcher = session.getLauncher();
7778
listenerRegistry.launcherDiscoveryListeners.getListeners().forEach(
7879
launcher::registerLauncherDiscoveryListeners);

0 commit comments

Comments
 (0)