16
16
17
17
package org .springframework .http .codec ;
18
18
19
+ import java .nio .charset .StandardCharsets ;
19
20
import java .util .Arrays ;
20
21
import java .util .Collections ;
21
22
import java .util .List ;
28
29
import org .mockito .MockitoAnnotations ;
29
30
import reactor .core .publisher .Flux ;
30
31
import reactor .core .publisher .Mono ;
32
+ import reactor .test .StepVerifier ;
31
33
32
34
import org .springframework .core .codec .Encoder ;
35
+ import org .springframework .core .io .buffer .DataBuffer ;
36
+ import org .springframework .core .io .buffer .DefaultDataBufferFactory ;
37
+ import org .springframework .core .io .buffer .support .DataBufferTestUtils ;
33
38
import org .springframework .http .MediaType ;
34
39
import org .springframework .mock .http .server .reactive .test .MockServerHttpResponse ;
35
40
import org .springframework .util .MimeType ;
50
55
/**
51
56
* Unit tests for {@link EncoderHttpMessageWriter}.
52
57
* @author Rossen Stoyanchev
58
+ * @author Brian Clozel
53
59
*/
54
60
public class EncoderHttpMessageWriterTests {
55
61
@@ -75,13 +81,13 @@ public void setUp() throws Exception {
75
81
76
82
77
83
@ Test
78
- public void getWritableMediaTypes () throws Exception {
84
+ public void getWritableMediaTypes () {
79
85
HttpMessageWriter <?> writer = getWriter (MimeTypeUtils .TEXT_HTML , MimeTypeUtils .TEXT_XML );
80
86
assertEquals (Arrays .asList (TEXT_HTML , TEXT_XML ), writer .getWritableMediaTypes ());
81
87
}
82
88
83
89
@ Test
84
- public void canWrite () throws Exception {
90
+ public void canWrite () {
85
91
HttpMessageWriter <?> writer = getWriter (MimeTypeUtils .TEXT_HTML );
86
92
when (this .encoder .canEncode (forClass (String .class ), TEXT_HTML )).thenReturn (true );
87
93
@@ -90,7 +96,7 @@ public void canWrite() throws Exception {
90
96
}
91
97
92
98
@ Test
93
- public void useNegotiatedMediaType () throws Exception {
99
+ public void useNegotiatedMediaType () {
94
100
HttpMessageWriter <String > writer = getWriter (MimeTypeUtils .ALL );
95
101
writer .write (Mono .just ("body" ), forClass (String .class ), TEXT_PLAIN , this .response , NO_HINTS );
96
102
@@ -99,7 +105,7 @@ public void useNegotiatedMediaType() throws Exception {
99
105
}
100
106
101
107
@ Test
102
- public void useDefaultMediaType () throws Exception {
108
+ public void useDefaultMediaType () {
103
109
testDefaultMediaType (null );
104
110
testDefaultMediaType (new MediaType ("text" , "*" ));
105
111
testDefaultMediaType (new MediaType ("*" , "*" ));
@@ -108,7 +114,6 @@ public void useDefaultMediaType() throws Exception {
108
114
109
115
private void testDefaultMediaType (MediaType negotiatedMediaType ) {
110
116
111
- this .response = new MockServerHttpResponse ();
112
117
this .mediaTypeCaptor = ArgumentCaptor .forClass (MediaType .class );
113
118
114
119
MimeType defaultContentType = MimeTypeUtils .TEXT_XML ;
@@ -120,7 +125,7 @@ private void testDefaultMediaType(MediaType negotiatedMediaType) {
120
125
}
121
126
122
127
@ Test
123
- public void useDefaultMediaTypeCharset () throws Exception {
128
+ public void useDefaultMediaTypeCharset () {
124
129
HttpMessageWriter <String > writer = getWriter (TEXT_PLAIN_UTF_8 , TEXT_HTML );
125
130
writer .write (Mono .just ("body" ), forClass (String .class ), TEXT_HTML , response , NO_HINTS );
126
131
@@ -129,7 +134,7 @@ public void useDefaultMediaTypeCharset() throws Exception {
129
134
}
130
135
131
136
@ Test
132
- public void useNegotiatedMediaTypeCharset () throws Exception {
137
+ public void useNegotiatedMediaTypeCharset () {
133
138
134
139
MediaType negotiatedMediaType = new MediaType ("text" , "html" , ISO_8859_1 );
135
140
@@ -141,7 +146,7 @@ public void useNegotiatedMediaTypeCharset() throws Exception {
141
146
}
142
147
143
148
@ Test
144
- public void useHttpOutputMessageMediaType () throws Exception {
149
+ public void useHttpOutputMessageMediaType () {
145
150
146
151
MediaType outputMessageMediaType = MediaType .TEXT_HTML ;
147
152
this .response .getHeaders ().setContentType (outputMessageMediaType );
@@ -153,11 +158,35 @@ public void useHttpOutputMessageMediaType() throws Exception {
153
158
assertEquals (outputMessageMediaType , this .mediaTypeCaptor .getValue ());
154
159
}
155
160
161
+ @ Test
162
+ public void setContentLengthForMonoBody () {
163
+
164
+ DefaultDataBufferFactory factory = new DefaultDataBufferFactory ();
165
+ DataBuffer buffer = factory .wrap ("body" .getBytes (StandardCharsets .UTF_8 ));
166
+ HttpMessageWriter <String > writer = getWriter (Flux .just (buffer ), MimeTypeUtils .TEXT_PLAIN );
167
+
168
+ writer .write (Mono .just ("body" ), forClass (String .class ), TEXT_PLAIN , this .response , NO_HINTS ).block ();
169
+
170
+ assertEquals (4 , this .response .getHeaders ().getContentLength ());
171
+ }
172
+
173
+ @ Test // SPR-17220
174
+ public void emptyBodyWritten () {
175
+ HttpMessageWriter <String > writer = getWriter (MimeTypeUtils .TEXT_PLAIN );
176
+ writer .write (Mono .empty (), forClass (String .class ), TEXT_PLAIN , this .response , NO_HINTS ).block ();
177
+ StepVerifier .create (this .response .getBody ()).expectNextCount (1 ).verifyComplete ();
178
+ assertEquals (0 , this .response .getHeaders ().getContentLength ());
179
+ }
180
+
156
181
157
182
private HttpMessageWriter <String > getWriter (MimeType ... mimeTypes ) {
183
+ return getWriter (Flux .empty (), mimeTypes );
184
+ }
185
+
186
+ private HttpMessageWriter <String > getWriter (Flux <DataBuffer > encodedStream , MimeType ... mimeTypes ) {
158
187
List <MimeType > typeList = Arrays .asList (mimeTypes );
159
188
when (this .encoder .getEncodableMimeTypes ()).thenReturn (typeList );
160
- when (this .encoder .encode (any (), any (), any (), this .mediaTypeCaptor .capture (), any ())).thenReturn (Flux . empty () );
189
+ when (this .encoder .encode (any (), any (), any (), this .mediaTypeCaptor .capture (), any ())).thenReturn (encodedStream );
161
190
return new EncoderHttpMessageWriter <>(this .encoder );
162
191
}
163
192
0 commit comments