Skip to content

Commit 7a8a2d9

Browse files
committed
Fix HttpMessageWriter tests
Issue: SPR-17419
1 parent 256a6fe commit 7a8a2d9

File tree

3 files changed

+107
-53
lines changed

3 files changed

+107
-53
lines changed

spring-web/src/test/java/org/springframework/http/codec/FormHttpMessageWriterTests.java

+12-8
Original file line numberDiff line numberDiff line change
@@ -20,22 +20,22 @@
2020

2121
import org.junit.Test;
2222
import reactor.core.publisher.Mono;
23+
import reactor.test.StepVerifier;
2324

2425
import org.springframework.core.ResolvableType;
26+
import org.springframework.core.io.buffer.AbstractDataBufferAllocatingTestCase;
2527
import org.springframework.http.HttpHeaders;
2628
import org.springframework.http.MediaType;
2729
import org.springframework.mock.http.server.reactive.test.MockServerHttpResponse;
2830
import org.springframework.util.LinkedMultiValueMap;
2931
import org.springframework.util.MultiValueMap;
3032

31-
import static org.junit.Assert.assertEquals;
32-
import static org.junit.Assert.assertFalse;
33-
import static org.junit.Assert.assertTrue;
33+
import static org.junit.Assert.*;
3434

3535
/**
3636
* @author Sebastien Deleuze
3737
*/
38-
public class FormHttpMessageWriterTests {
38+
public class FormHttpMessageWriterTests extends AbstractDataBufferAllocatingTestCase {
3939

4040
private final FormHttpMessageWriter writer = new FormHttpMessageWriter();
4141

@@ -75,14 +75,18 @@ public void writeForm() {
7575
body.add("name 2", "value 2+1");
7676
body.add("name 2", "value 2+2");
7777
body.add("name 3", null);
78-
MockServerHttpResponse response = new MockServerHttpResponse();
78+
MockServerHttpResponse response = new MockServerHttpResponse(this.bufferFactory);
7979
this.writer.write(Mono.just(body), null, MediaType.APPLICATION_FORM_URLENCODED, response, null).block();
8080

81-
String responseBody = response.getBodyAsString().block();
82-
assertEquals("name+1=value+1&name+2=value+2%2B1&name+2=value+2%2B2&name+3", responseBody);
81+
String expected = "name+1=value+1&name+2=value+2%2B1&name+2=value+2%2B2&name+3";
82+
StepVerifier.create(response.getBody())
83+
.consumeNextWith(stringConsumer(
84+
expected))
85+
.expectComplete()
86+
.verify();
8387
HttpHeaders headers = response.getHeaders();
8488
assertEquals("application/x-www-form-urlencoded;charset=UTF-8", headers.getContentType().toString());
85-
assertEquals(responseBody.getBytes().length, headers.getContentLength());
89+
assertEquals(expected.length(), headers.getContentLength());
8690
}
8791

8892
}

spring-web/src/test/java/org/springframework/http/codec/ServerSentEventHttpMessageWriterTests.java

+88-43
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import java.util.Map;
2424

2525
import com.fasterxml.jackson.databind.ObjectMapper;
26+
import org.junit.Before;
2627
import org.junit.Test;
2728
import org.reactivestreams.Publisher;
2829
import reactor.core.publisher.Flux;
@@ -31,6 +32,8 @@
3132

3233
import org.springframework.core.ResolvableType;
3334
import org.springframework.core.io.buffer.AbstractDataBufferAllocatingTestCase;
35+
import org.springframework.core.io.buffer.DataBufferUtils;
36+
import org.springframework.core.io.buffer.support.DataBufferTestUtils;
3437
import org.springframework.http.MediaType;
3538
import org.springframework.http.codec.json.Jackson2JsonEncoder;
3639
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
@@ -45,13 +48,23 @@
4548
* @author Sebastien Deleuze
4649
* @author Rossen Stoyanchev
4750
*/
51+
@SuppressWarnings("rawtypes")
4852
public class ServerSentEventHttpMessageWriterTests extends AbstractDataBufferAllocatingTestCase {
4953

5054
private static final Map<String, Object> HINTS = Collections.emptyMap();
5155

5256
private ServerSentEventHttpMessageWriter messageWriter =
5357
new ServerSentEventHttpMessageWriter(new Jackson2JsonEncoder());
5458

59+
private MockServerHttpResponse outputMessage;
60+
61+
62+
@Before
63+
public void setUp() {
64+
this.outputMessage = new MockServerHttpResponse(this.bufferFactory);
65+
}
66+
67+
5568

5669
@Test
5770
public void canWrite() {
@@ -72,53 +85,44 @@ public void writeServerSentEvent() {
7285
.comment("bla\nbla bla\nbla bla bla").retry(Duration.ofMillis(123L)).build();
7386

7487
Mono<ServerSentEvent> source = Mono.just(event);
75-
MockServerHttpResponse outputMessage = new MockServerHttpResponse();
7688
testWrite(source, outputMessage, ServerSentEvent.class);
7789

78-
StepVerifier.create(outputMessage.getBodyAsString())
79-
.expectNext("id:c42\nevent:foo\nretry:123\n:bla\n:bla bla\n:bla bla bla\ndata:bar\n\n")
90+
StepVerifier.create(outputMessage.getBody())
91+
.consumeNextWith(stringConsumer("id:c42\nevent:foo\nretry:123\n:bla\n:bla bla\n:bla bla bla\ndata:"))
92+
.consumeNextWith(stringConsumer("bar\n"))
93+
.consumeNextWith(stringConsumer("\n"))
8094
.expectComplete()
8195
.verify();
8296
}
8397

84-
@Test
85-
@SuppressWarnings("rawtypes")
86-
public void writeServerSentEventError() {
87-
ServerSentEvent<?> event = ServerSentEvent.builder().data("bar").id("c42").event("foo")
88-
.comment("bla\nbla bla\nbla bla bla").retry(Duration.ofMillis(123L)).build();
89-
90-
Flux<ServerSentEvent> source = Flux.concat(
91-
Flux.just(event),
92-
Flux.error(new RuntimeException()));
93-
MockServerHttpResponse outputMessage = new MockServerHttpResponse();
94-
95-
Mono<Void> result = this.messageWriter.write(source, forClass(ServerSentEvent.class),
96-
MediaType.TEXT_EVENT_STREAM, outputMessage, HINTS);
97-
98-
StepVerifier.create(result)
99-
.verifyError(RuntimeException.class);
100-
}
101-
10298
@Test
10399
public void writeString() {
104100
Flux<String> source = Flux.just("foo", "bar");
105-
MockServerHttpResponse outputMessage = new MockServerHttpResponse();
106101
testWrite(source, outputMessage, String.class);
107102

108-
StepVerifier.create(outputMessage.getBodyAsString())
109-
.expectNext("data:foo\n\ndata:bar\n\n")
103+
StepVerifier.create(outputMessage.getBody())
104+
.consumeNextWith(stringConsumer("data:"))
105+
.consumeNextWith(stringConsumer("foo\n"))
106+
.consumeNextWith(stringConsumer("\n"))
107+
.consumeNextWith(stringConsumer("data:"))
108+
.consumeNextWith(stringConsumer("bar\n"))
109+
.consumeNextWith(stringConsumer("\n"))
110110
.expectComplete()
111111
.verify();
112112
}
113113

114114
@Test
115115
public void writeMultiLineString() {
116116
Flux<String> source = Flux.just("foo\nbar", "foo\nbaz");
117-
MockServerHttpResponse outputMessage = new MockServerHttpResponse();
118117
testWrite(source, outputMessage, String.class);
119118

120-
StepVerifier.create(outputMessage.getBodyAsString())
121-
.expectNext("data:foo\ndata:bar\n\ndata:foo\ndata:baz\n\n")
119+
StepVerifier.create(outputMessage.getBody())
120+
.consumeNextWith(stringConsumer("data:"))
121+
.consumeNextWith(stringConsumer("foo\ndata:bar\n"))
122+
.consumeNextWith(stringConsumer("\n"))
123+
.consumeNextWith(stringConsumer("data:"))
124+
.consumeNextWith(stringConsumer("foo\ndata:baz\n"))
125+
.consumeNextWith(stringConsumer("\n"))
122126
.expectComplete()
123127
.verify();
124128
}
@@ -128,22 +132,36 @@ public void writeStringWithCustomCharset() {
128132
Flux<String> source = Flux.just("\u00A3");
129133
Charset charset = StandardCharsets.ISO_8859_1;
130134
MediaType mediaType = new MediaType("text", "event-stream", charset);
131-
MockServerHttpResponse outputMessage = new MockServerHttpResponse();
132135
testWrite(source, mediaType, outputMessage, String.class);
133136

134137
assertEquals(mediaType, outputMessage.getHeaders().getContentType());
135-
StepVerifier.create(outputMessage.getBodyAsString()).expectNext("data:\u00A3\n\n").verifyComplete();
138+
StepVerifier.create(outputMessage.getBody())
139+
.consumeNextWith(stringConsumer("data:"))
140+
.consumeNextWith(dataBuffer -> {
141+
String value =
142+
DataBufferTestUtils.dumpString(dataBuffer, charset);
143+
DataBufferUtils.release(dataBuffer);
144+
assertEquals("\u00A3\n", value);
145+
})
146+
.consumeNextWith(stringConsumer("\n"))
147+
.expectComplete()
148+
.verify();
136149
}
137150

138151
@Test
139152
public void writePojo() {
140153
Flux<Pojo> source = Flux.just(new Pojo("foofoo", "barbar"), new Pojo("foofoofoo", "barbarbar"));
141-
MockServerHttpResponse outputMessage = new MockServerHttpResponse();
142154
testWrite(source, outputMessage, Pojo.class);
143155

144-
StepVerifier.create(outputMessage.getBodyAsString())
145-
.expectNext("data:{\"foo\":\"foofoo\",\"bar\":\"barbar\"}\n\n" +
146-
"data:{\"foo\":\"foofoofoo\",\"bar\":\"barbarbar\"}\n\n")
156+
StepVerifier.create(outputMessage.getBody())
157+
.consumeNextWith(stringConsumer("data:"))
158+
.consumeNextWith(stringConsumer("{\"foo\":\"foofoo\",\"bar\":\"barbar\"}"))
159+
.consumeNextWith(stringConsumer("\n"))
160+
.consumeNextWith(stringConsumer("\n"))
161+
.consumeNextWith(stringConsumer("data:"))
162+
.consumeNextWith(stringConsumer("{\"foo\":\"foofoofoo\",\"bar\":\"barbarbar\"}"))
163+
.consumeNextWith(stringConsumer("\n"))
164+
.consumeNextWith(stringConsumer("\n"))
147165
.expectComplete()
148166
.verify();
149167
}
@@ -154,16 +172,21 @@ public void writePojoWithPrettyPrint() {
154172
this.messageWriter = new ServerSentEventHttpMessageWriter(new Jackson2JsonEncoder(mapper));
155173

156174
Flux<Pojo> source = Flux.just(new Pojo("foofoo", "barbar"), new Pojo("foofoofoo", "barbarbar"));
157-
MockServerHttpResponse outputMessage = new MockServerHttpResponse();
158175
testWrite(source, outputMessage, Pojo.class);
159176

160-
StepVerifier.create(outputMessage.getBodyAsString())
161-
.expectNext("data:{\n" +
177+
StepVerifier.create(outputMessage.getBody())
178+
.consumeNextWith(stringConsumer("data:"))
179+
.consumeNextWith(stringConsumer("{\n" +
162180
"data: \"foo\" : \"foofoo\",\n" +
163-
"data: \"bar\" : \"barbar\"\n" + "data:}\n\n" +
164-
"data:{\n" +
181+
"data: \"bar\" : \"barbar\"\n" + "data:}"))
182+
.consumeNextWith(stringConsumer("\n"))
183+
.consumeNextWith(stringConsumer("\n"))
184+
.consumeNextWith(stringConsumer("data:"))
185+
.consumeNextWith(stringConsumer("{\n" +
165186
"data: \"foo\" : \"foofoofoo\",\n" +
166-
"data: \"bar\" : \"barbarbar\"\n" + "data:}\n\n")
187+
"data: \"bar\" : \"barbarbar\"\n" + "data:}"))
188+
.consumeNextWith(stringConsumer("\n"))
189+
.consumeNextWith(stringConsumer("\n"))
167190
.expectComplete()
168191
.verify();
169192
}
@@ -173,13 +196,35 @@ public void writePojoWithCustomEncoding() {
173196
Flux<Pojo> source = Flux.just(new Pojo("foo\uD834\uDD1E", "bar\uD834\uDD1E"));
174197
Charset charset = StandardCharsets.UTF_16LE;
175198
MediaType mediaType = new MediaType("text", "event-stream", charset);
176-
MockServerHttpResponse outputMessage = new MockServerHttpResponse();
177199
testWrite(source, mediaType, outputMessage, Pojo.class);
178200

179201
assertEquals(mediaType, outputMessage.getHeaders().getContentType());
180-
StepVerifier.create(outputMessage.getBodyAsString())
181-
.expectNext("data:{\"foo\":\"foo\uD834\uDD1E\",\"bar\":\"bar\uD834\uDD1E\"}\n\n")
182-
.verifyComplete();
202+
StepVerifier.create(outputMessage.getBody())
203+
.consumeNextWith(dataBuffer1 -> {
204+
String value1 =
205+
DataBufferTestUtils.dumpString(dataBuffer1, charset);
206+
DataBufferUtils.release(dataBuffer1);
207+
assertEquals("data:", value1);
208+
})
209+
.consumeNextWith(dataBuffer -> {
210+
String value = DataBufferTestUtils.dumpString(dataBuffer, charset);
211+
DataBufferUtils.release(dataBuffer);
212+
assertEquals("{\"foo\":\"foo\uD834\uDD1E\",\"bar\":\"bar\uD834\uDD1E\"}", value);
213+
})
214+
.consumeNextWith(dataBuffer2 -> {
215+
String value2 =
216+
DataBufferTestUtils.dumpString(dataBuffer2, charset);
217+
DataBufferUtils.release(dataBuffer2);
218+
assertEquals("\n", value2);
219+
})
220+
.consumeNextWith(dataBuffer3 -> {
221+
String value3 =
222+
DataBufferTestUtils.dumpString(dataBuffer3, charset);
223+
DataBufferUtils.release(dataBuffer3);
224+
assertEquals("\n", value3);
225+
})
226+
.expectComplete()
227+
.verify();
183228
}
184229

185230

spring-web/src/test/java/org/springframework/mock/http/server/reactive/test/MockServerHttpResponse.java

+7-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2017 the original author or authors.
2+
* Copyright 2002-2018 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -27,6 +27,7 @@
2727
import reactor.core.publisher.Mono;
2828

2929
import org.springframework.core.io.buffer.DataBuffer;
30+
import org.springframework.core.io.buffer.DataBufferFactory;
3031
import org.springframework.core.io.buffer.DataBufferUtils;
3132
import org.springframework.core.io.buffer.DefaultDataBufferFactory;
3233
import org.springframework.http.HttpHeaders;
@@ -54,7 +55,11 @@ public class MockServerHttpResponse extends AbstractServerHttpResponse {
5455

5556

5657
public MockServerHttpResponse() {
57-
super(new DefaultDataBufferFactory());
58+
this(new DefaultDataBufferFactory());
59+
}
60+
61+
public MockServerHttpResponse(DataBufferFactory dataBufferFactory) {
62+
super(dataBufferFactory);
5863
this.writeHandler = body -> {
5964
this.body = body.cache();
6065
return this.body.then();

0 commit comments

Comments
 (0)