1
1
#![ cfg( feature = "internals" ) ]
2
2
3
- use crate :: test_util:: { assert_starts_with, TestServer } ;
4
- use beatrice:: Response ;
3
+ use crate :: test_util:: { assert_starts_with, check_elapsed , TestServer } ;
4
+ use beatrice:: { ContentType , Response } ;
5
5
use serde_json:: json;
6
+ use std:: io:: Read ;
7
+ use std:: time:: { Duration , Instant } ;
6
8
7
9
mod test_util;
8
10
@@ -16,7 +18,7 @@ fn panics() {
16
18
}
17
19
18
20
#[ test]
19
- fn return_empty ( ) {
21
+ fn empty ( ) {
20
22
let server = TestServer :: start ( |_req| Response :: new ( 200 ) ) . unwrap ( ) ;
21
23
assert_eq ! (
22
24
server. exchange( "M / HTTP/1.1\r \n \r \n " ) . unwrap( ) ,
@@ -54,6 +56,82 @@ fn text() {
54
56
) ;
55
57
}
56
58
59
+ #[ test]
60
+ fn with_status ( ) {
61
+ let server = TestServer :: start ( |_req| Response :: new ( 200 ) . with_status ( 201 ) ) . unwrap ( ) ;
62
+ assert_eq ! (
63
+ server. exchange( "M / HTTP/1.1\r \n \r \n " ) . unwrap( ) ,
64
+ "HTTP/1.1 201 Created\r \n \r \n " ,
65
+ ) ;
66
+ }
67
+
68
+ #[ test]
69
+ fn with_type ( ) {
70
+ let server =
71
+ TestServer :: start ( |_req| Response :: new ( 200 ) . with_type ( ContentType :: EventStream ) ) . unwrap ( ) ;
72
+ assert_eq ! (
73
+ server. exchange( "M / HTTP/1.1\r \n \r \n " ) . unwrap( ) ,
74
+ "HTTP/1.1 200 OK\r \n content-type: text/event-stream\r \n \r \n " ,
75
+ ) ;
76
+ }
77
+
78
+ #[ test]
79
+ fn with_type_and_body ( ) {
80
+ let server =
81
+ TestServer :: start ( |_req| Response :: text ( 200 , "yo" ) . with_type ( ContentType :: Markdown ) )
82
+ . unwrap ( ) ;
83
+ assert_eq ! (
84
+ server. exchange( "M / HTTP/1.1\r \n \r \n " ) . unwrap( ) ,
85
+ "HTTP/1.1 200 OK\r \n content-type: text/markdown; charset=UTF-8\r \n content-length: 2\r \n \r \n yo" ,
86
+ ) ;
87
+ }
88
+
89
+ #[ test]
90
+ fn with_body ( ) {
91
+ let server = TestServer :: start ( |_req| Response :: new ( 200 ) . with_body ( "abc" ) ) . unwrap ( ) ;
92
+ assert_eq ! (
93
+ server. exchange( "M / HTTP/1.1\r \n \r \n " ) . unwrap( ) ,
94
+ "HTTP/1.1 200 OK\r \n content-length: 3\r \n \r \n abc" ,
95
+ ) ;
96
+ }
97
+
98
+ #[ test]
99
+ fn with_header ( ) {
100
+ let server = TestServer :: start ( |_req| Response :: new ( 200 ) . with_header ( "h1" , "v1" ) ) . unwrap ( ) ;
101
+ assert_eq ! (
102
+ server. exchange( "M / HTTP/1.1\r \n \r \n " ) . unwrap( ) ,
103
+ "HTTP/1.1 200 OK\r \n h1: v1\r \n \r \n " ,
104
+ ) ;
105
+ }
106
+
107
+ #[ test]
108
+ fn with_duplicate_header ( ) {
109
+ let server = TestServer :: start ( |_req| {
110
+ Response :: new ( 200 )
111
+ . with_header ( "h1" , "v1" )
112
+ . with_header ( "h1" , "v2" )
113
+ } )
114
+ . unwrap ( ) ;
115
+ assert_eq ! (
116
+ server. exchange( "M / HTTP/1.1\r \n \r \n " ) . unwrap( ) ,
117
+ "HTTP/1.1 200 OK\r \n h1: v2\r \n \r \n " ,
118
+ ) ;
119
+ }
120
+
121
+ #[ test]
122
+ fn with_duplicate_header_different_case ( ) {
123
+ let server = TestServer :: start ( |_req| {
124
+ Response :: new ( 200 )
125
+ . with_header ( "h1" , "v1" )
126
+ . with_header ( "H1" , "v2" )
127
+ } )
128
+ . unwrap ( ) ;
129
+ assert_eq ! (
130
+ server. exchange( "M / HTTP/1.1\r \n \r \n " ) . unwrap( ) ,
131
+ "HTTP/1.1 200 OK\r \n h1: v2\r \n \r \n " ,
132
+ ) ;
133
+ }
134
+
57
135
#[ test]
58
136
fn method_not_allowed_405 ( ) {
59
137
let server = TestServer :: start ( |_req| Response :: method_not_allowed_405 ( & [ "GET" ] ) ) . unwrap ( ) ;
@@ -91,3 +169,90 @@ fn return_drop() {
91
169
let server = TestServer :: start ( |_req| Response :: Drop ) . unwrap ( ) ;
92
170
assert_eq ! ( server. exchange( "M / HTTP/1.1\r \n \r \n " ) . unwrap( ) , "" ) ;
93
171
}
172
+
173
+ #[ test]
174
+ fn small_body ( ) {
175
+ let server = TestServer :: start ( |req| {
176
+ if req. body ( ) . is_pending ( ) {
177
+ return Response :: GetBodyAndReprocess ( 100 , req) ;
178
+ } else {
179
+ let len = req. body ( ) . reader ( ) . unwrap ( ) . bytes ( ) . count ( ) ;
180
+ Response :: text ( 200 , format ! ( "body len={}" , len) )
181
+ }
182
+ } )
183
+ . unwrap ( ) ;
184
+ assert_eq ! (
185
+ server
186
+ . exchange( "M / HTTP/1.1\r \n content-length:3\r \n \r \n abc" )
187
+ . unwrap( ) ,
188
+ "HTTP/1.1 200 OK\r \n content-type: text/plain; charset=UTF-8\r \n content-length: 10\r \n \r \n body len=3" ,
189
+ ) ;
190
+ }
191
+
192
+ #[ test]
193
+ fn large_body ( ) {
194
+ let server = TestServer :: start ( |req| {
195
+ if req. body ( ) . is_pending ( ) {
196
+ return Response :: GetBodyAndReprocess ( 100 , req) ;
197
+ } else {
198
+ let len = req. body ( ) . reader ( ) . unwrap ( ) . bytes ( ) . count ( ) ;
199
+ Response :: text ( 200 , format ! ( "body len={}" , len) )
200
+ }
201
+ } )
202
+ . unwrap ( ) ;
203
+ assert_eq ! (
204
+ server
205
+ . exchange(
206
+ "M / HTTP/1.1\r \n content-length:65537\r \n \r \n "
207
+ . chars( )
208
+ . chain( std:: iter:: repeat( 'a' ) . take( 65537 ) )
209
+ . collect:: <String >( )
210
+ )
211
+ . unwrap( ) ,
212
+ "HTTP/1.1 200 OK\r \n content-type: text/plain; charset=UTF-8\r \n content-length: 10\r \n \r \n body len=3" ,
213
+ ) ;
214
+ }
215
+
216
+ #[ test]
217
+ fn body_not_pending ( ) {
218
+ let server = TestServer :: start ( |req| Response :: GetBodyAndReprocess ( 100 , req) ) . unwrap ( ) ;
219
+ assert_eq ! (
220
+ server
221
+ . exchange( "M / HTTP/1.1\r \n content-length:3\r \n \r \n abc" )
222
+ . unwrap( ) ,
223
+ "HTTP/1.1 500 Internal Server Error\r \n content-type: text/plain; charset=UTF-8\r \n content-length: 21\r \n \r \n Internal server error" ,
224
+ ) ;
225
+ }
226
+
227
+ #[ test]
228
+ fn already_got_body ( ) {
229
+ let server = TestServer :: start ( |req| Response :: GetBodyAndReprocess ( 100 , req) ) . unwrap ( ) ;
230
+ assert_eq ! (
231
+ server
232
+ . exchange( "M / HTTP/1.1\r \n content-length:3\r \n expect:100-continue\r \n \r \n abc" )
233
+ . unwrap( ) ,
234
+ "HTTP/1.1 500 Internal Server Error\r \n content-type: text/plain; charset=UTF-8\r \n content-length: 21\r \n \r \n Internal server error" ,
235
+ ) ;
236
+ }
237
+
238
+ #[ test]
239
+ fn fast_reply ( ) {
240
+ let server = TestServer :: start ( |_req| Response :: new ( 200 ) ) . unwrap ( ) ;
241
+ let before = Instant :: now ( ) ;
242
+ let reply = server. exchange ( "M / HTTP/1.1\r \n \r \n " ) . unwrap ( ) ;
243
+ check_elapsed ( before, 0 ..100 ) . unwrap ( ) ;
244
+ assert_eq ! ( reply, "HTTP/1.1 200 OK\r \n \r \n " , ) ;
245
+ }
246
+
247
+ #[ test]
248
+ fn slow_reply ( ) {
249
+ let server = TestServer :: start ( |_req| {
250
+ std:: thread:: sleep ( Duration :: from_millis ( 100 ) ) ;
251
+ Response :: new ( 200 )
252
+ } )
253
+ . unwrap ( ) ;
254
+ let before = Instant :: now ( ) ;
255
+ let reply = server. exchange ( "M / HTTP/1.1\r \n \r \n " ) . unwrap ( ) ;
256
+ check_elapsed ( before, 100 ..200 ) . unwrap ( ) ;
257
+ assert_eq ! ( reply, "HTTP/1.1 200 OK\r \n \r \n " , ) ;
258
+ }
0 commit comments