Skip to content

Commit f2ad464

Browse files
committed
Closes wiremock#2294 - adds a beforeResponseSent serve event listener hook
1 parent 3a07236 commit f2ad464

File tree

3 files changed

+51
-9
lines changed

3 files changed

+51
-9
lines changed

src/main/java/com/github/tomakehurst/wiremock/extension/ServeEventListener.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public interface ServeEventListener extends Extension {
2222
enum RequestPhase {
2323
BEFORE_MATCH,
2424
AFTER_MATCH,
25+
BEFORE_RESPONSE_SENT,
2526
AFTER_COMPLETE
2627
}
2728

@@ -33,6 +34,9 @@ default void onEvent(RequestPhase requestPhase, ServeEvent serveEvent, Parameter
3334
case AFTER_MATCH:
3435
afterMatch(serveEvent, parameters);
3536
break;
37+
case BEFORE_RESPONSE_SENT:
38+
beforeResponseSent(serveEvent, parameters);
39+
break;
3640
case AFTER_COMPLETE:
3741
afterComplete(serveEvent, parameters);
3842
break;
@@ -43,6 +47,8 @@ default void beforeMatch(ServeEvent serveEvent, Parameters parameters) {}
4347

4448
default void afterMatch(ServeEvent serveEvent, Parameters parameters) {}
4549

50+
default void beforeResponseSent(ServeEvent serveEvent, Parameters parameters) {}
51+
4652
default void afterComplete(ServeEvent serveEvent, Parameters parameters) {}
4753

4854
default boolean applyGlobally() {

src/main/java/com/github/tomakehurst/wiremock/http/StubRequestHandler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,8 @@ protected void beforeResponseSent(ServeEvent serveEvent, Response response) {
8686
}
8787

8888
requestJournal.requestReceived(serveEvent);
89+
90+
triggerListeners(BEFORE_RESPONSE_SENT, serveEvent);
8991
}
9092

9193
private void appendNonMatchSubEvent(ServeEvent serveEvent) {

src/test/java/com/github/tomakehurst/wiremock/ServeEventListenerExtensionTest.java

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import static org.awaitility.Awaitility.await;
2828
import static org.hamcrest.MatcherAssert.assertThat;
2929
import static org.hamcrest.Matchers.*;
30+
import static org.junit.jupiter.api.Assertions.assertTrue;
3031

3132
import com.fasterxml.jackson.annotation.JsonProperty;
3233
import com.github.tomakehurst.wiremock.admin.Router;
@@ -44,6 +45,7 @@
4445
import java.util.concurrent.Callable;
4546
import java.util.concurrent.CompletableFuture;
4647
import java.util.concurrent.ConcurrentHashMap;
48+
import java.util.concurrent.atomic.AtomicBoolean;
4749
import java.util.concurrent.atomic.AtomicInteger;
4850
import org.junit.jupiter.api.AfterEach;
4951
import org.junit.jupiter.api.Test;
@@ -67,8 +69,8 @@ public void cleanup() {
6769
}
6870

6971
@Test
70-
void eventTriggeredBeforeMatching() throws Exception {
71-
final CompletableFuture<Void> completed = new CompletableFuture<>();
72+
void eventSynchronouslyTriggeredBeforeMatching() {
73+
AtomicBoolean completed = new AtomicBoolean(false);
7274
initWithOptions(
7375
options()
7476
.dynamicPort()
@@ -82,7 +84,7 @@ public void beforeMatch(ServeEvent serveEvent, Parameters parameters) {
8284
assertThat(serveEvent.getStubMapping(), nullValue());
8385
assertThat(serveEvent.getResponse(), nullValue());
8486

85-
completed.complete(null);
87+
completed.set(true);
8688
}
8789

8890
@Override
@@ -95,12 +97,12 @@ public String getName() {
9597

9698
client.get("/get-this");
9799

98-
completed.get(2, SECONDS);
100+
assertTrue(completed.get());
99101
}
100102

101103
@Test
102-
void eventTriggeredAfterMatching() throws Exception {
103-
final CompletableFuture<Void> completed = new CompletableFuture<>();
104+
void eventSynchronouslyTriggeredAfterMatching() {
105+
AtomicBoolean completed = new AtomicBoolean(false);
104106
initWithOptions(
105107
options()
106108
.dynamicPort()
@@ -114,7 +116,7 @@ public void afterMatch(ServeEvent serveEvent, Parameters parameters) {
114116
assertThat(serveEvent.getStubMapping(), notNullValue());
115117
assertThat(serveEvent.getResponse(), nullValue());
116118

117-
completed.complete(null);
119+
completed.set(true);
118120
}
119121

120122
@Override
@@ -127,11 +129,43 @@ public String getName() {
127129

128130
client.get("/get-this");
129131

130-
completed.get(2, SECONDS);
132+
assertTrue(completed.get());
133+
}
134+
135+
@Test
136+
void eventSynchronouslyTriggeredBeforeResponseSent() {
137+
AtomicBoolean completed = new AtomicBoolean(false);
138+
initWithOptions(
139+
options()
140+
.dynamicPort()
141+
.extensions(
142+
new ServeEventListener() {
143+
144+
@Override
145+
public void beforeResponseSent(ServeEvent serveEvent, Parameters parameters) {
146+
assertThat(serveEvent.getRequest().getUrl(), is("/get-this"));
147+
assertThat(serveEvent.getResponseDefinition(), notNullValue());
148+
assertThat(serveEvent.getStubMapping(), notNullValue());
149+
assertThat(serveEvent.getResponse().getStatus(), is(200));
150+
151+
completed.set(true);
152+
}
153+
154+
@Override
155+
public String getName() {
156+
return "before-resposnse-sent";
157+
}
158+
}));
159+
160+
wm.stubFor(any(anyUrl()).willReturn(ok()));
161+
162+
client.get("/get-this");
163+
164+
assertTrue(completed.get());
131165
}
132166

133167
@Test
134-
void eventTriggeredAfterCompletion() throws Exception {
168+
void eventAsynchronouslyTriggeredAfterCompletion() throws Exception {
135169
final CompletableFuture<Void> completed = new CompletableFuture<>();
136170
initWithOptions(
137171
options()

0 commit comments

Comments
 (0)