@@ -95,21 +95,21 @@ macro_rules! t {
95
95
fn $name( ) {
96
96
let c = vec![ $( (
97
97
__CReq {
98
- $( $c_req_prop: __internal_req_res_prop !( $c_req_prop: $c_req_val) , ) *
98
+ $( $c_req_prop: __internal_map_prop !( $c_req_prop: $c_req_val) , ) *
99
99
..Default :: default ( )
100
100
} ,
101
101
__CRes {
102
- $( $c_res_prop: __internal_req_res_prop !( $c_res_prop: $c_res_val) , ) *
102
+ $( $c_res_prop: __internal_eq_prop !( $c_res_prop: $c_res_val) , ) *
103
103
..Default :: default ( )
104
104
}
105
105
) , ) * ] ;
106
106
let s = vec![ $( (
107
107
__SReq {
108
- $( $s_req_prop: __internal_req_res_prop !( $s_req_prop: $s_req_val) , ) *
108
+ $( $s_req_prop: __internal_eq_prop !( $s_req_prop: $s_req_val) , ) *
109
109
..Default :: default ( )
110
110
} ,
111
111
__SRes {
112
- $( $s_res_prop: __internal_req_res_prop !( $s_res_prop: $s_res_val) , ) *
112
+ $( $s_res_prop: __internal_map_prop !( $s_res_prop: $s_res_val) , ) *
113
113
..Default :: default ( )
114
114
}
115
115
) , ) * ] ;
@@ -157,64 +157,140 @@ macro_rules! t {
157
157
) ;
158
158
}
159
159
160
- macro_rules! __internal_req_res_prop {
161
- ( method: $prop_val: expr) => (
162
- $prop_val
163
- ) ;
164
- ( status: $prop_val: expr) => (
165
- StatusCode :: from_u16( $prop_val) . expect( "status code" )
166
- ) ;
160
+ macro_rules! __internal_map_prop {
167
161
( headers: $map: tt) => ( {
168
162
#[ allow( unused_mut) ]
169
163
{
170
164
let mut headers = HeaderMap :: new( ) ;
171
- __internal_headers!( headers, $map) ;
165
+ __internal_headers_map!( headers, $map) ;
166
+ headers
167
+ }
168
+ } ) ;
169
+ ( $name: tt: $val: tt) => ( {
170
+ __internal_req_res_prop!( $name: $val)
171
+ } ) ;
172
+ }
173
+
174
+ macro_rules! __internal_eq_prop {
175
+ ( headers: $map: tt) => ( {
176
+ #[ allow( unused_mut) ]
177
+ {
178
+ let mut headers = Vec :: new( ) ;
179
+ __internal_headers_eq!( headers, $map) ;
172
180
headers
173
181
}
174
182
} ) ;
183
+ ( $name: tt: $val: tt) => ( {
184
+ __internal_req_res_prop!( $name: $val)
185
+ } ) ;
186
+ }
187
+
188
+ macro_rules! __internal_req_res_prop {
189
+ ( method: $prop_val: expr) => (
190
+ $prop_val
191
+ ) ;
192
+ ( status: $prop_val: expr) => (
193
+ StatusCode :: from_u16( $prop_val) . expect( "status code" )
194
+ ) ;
175
195
( $prop_name: ident: $prop_val: expr) => (
176
196
From :: from( $prop_val)
177
197
)
178
198
}
179
199
180
- macro_rules! __internal_headers {
200
+ macro_rules! __internal_headers_map {
181
201
( $headers: ident, { $( $name: expr => $val: expr, ) * } ) => {
182
202
$(
183
203
$headers. insert( $name, $val. to_string( ) . parse( ) . expect( "header value" ) ) ;
184
204
) *
185
205
}
186
206
}
187
207
188
- #[ derive( Clone , Debug , Default ) ]
208
+ macro_rules! __internal_headers_eq {
209
+ ( @pat $name: expr, $pat: pat) => {
210
+ :: std:: sync:: Arc :: new( move |__hdrs: & :: hyper:: HeaderMap | {
211
+ match __hdrs. get( $name) {
212
+ $pat => ( ) ,
213
+ other => panic!( "headers[{}] was not {}: {:?}" , stringify!( $name) , stringify!( $pat) , other) ,
214
+ }
215
+ } ) as :: std:: sync:: Arc <Fn ( & :: hyper:: HeaderMap ) + Send + Sync >
216
+ } ;
217
+ ( @val $name: expr, NONE ) => {
218
+ __internal_headers_eq!( @pat $name, None ) ;
219
+ } ;
220
+ ( @val $name: expr, SOME ) => {
221
+ __internal_headers_eq!( @pat $name, Some ( _) ) ;
222
+ } ;
223
+ ( @val $name: expr, $val: expr) => ( {
224
+ let __val = Option :: from( $val) ;
225
+ :: std:: sync:: Arc :: new( move |__hdrs: & :: hyper:: HeaderMap | {
226
+ if let Some ( ref val) = __val {
227
+ assert_eq!( __hdrs. get( $name) . expect( stringify!( $name) ) , val. to_string( ) . as_str( ) , stringify!( $name) ) ;
228
+ } else {
229
+ assert_eq!( __hdrs. get( $name) , None , stringify!( $name) ) ;
230
+ }
231
+ } ) as :: std:: sync:: Arc <Fn ( & :: hyper:: HeaderMap ) + Send + Sync >
232
+ } ) ;
233
+ ( $headers: ident, { $( $name: expr => $val: tt, ) * } ) => {
234
+ $(
235
+ $headers. push( __internal_headers_eq!( @val $name, $val) ) ;
236
+ ) *
237
+ }
238
+ }
239
+
240
+ #[ derive( Clone , Debug ) ]
189
241
pub struct __CReq {
190
242
pub method : & ' static str ,
191
243
pub uri : & ' static str ,
192
244
pub headers : HeaderMap ,
193
245
pub body : Vec < u8 > ,
194
246
}
195
247
196
- #[ derive( Clone , Debug , Default ) ]
248
+ impl Default for __CReq {
249
+ fn default ( ) -> __CReq {
250
+ __CReq {
251
+ method : "GET" ,
252
+ uri : "/" ,
253
+ headers : HeaderMap :: new ( ) ,
254
+ body : Vec :: new ( ) ,
255
+ }
256
+ }
257
+ }
258
+
259
+ #[ derive( Clone , Default ) ]
197
260
pub struct __CRes {
198
261
pub status : hyper:: StatusCode ,
199
262
pub body : Vec < u8 > ,
200
- pub headers : HeaderMap ,
263
+ pub headers : __HeadersEq ,
201
264
}
202
265
203
- #[ derive( Clone , Debug , Default ) ]
266
+ #[ derive( Clone ) ]
204
267
pub struct __SReq {
205
268
pub method : & ' static str ,
206
269
pub uri : & ' static str ,
207
- pub headers : HeaderMap ,
270
+ pub headers : __HeadersEq ,
208
271
pub body : Vec < u8 > ,
209
272
}
210
273
274
+ impl Default for __SReq {
275
+ fn default ( ) -> __SReq {
276
+ __SReq {
277
+ method : "GET" ,
278
+ uri : "/" ,
279
+ headers : Vec :: new ( ) ,
280
+ body : Vec :: new ( ) ,
281
+ }
282
+ }
283
+ }
284
+
211
285
#[ derive( Clone , Debug , Default ) ]
212
286
pub struct __SRes {
213
287
pub status : hyper:: StatusCode ,
214
288
pub body : Vec < u8 > ,
215
289
pub headers : HeaderMap ,
216
290
}
217
291
292
+ pub type __HeadersEq = Vec < Arc < Fn ( & HeaderMap ) + Send + Sync > > ;
293
+
218
294
pub struct __TestConfig {
219
295
pub client_version : usize ,
220
296
pub client_msgs : Vec < ( __CReq , __CRes ) > ,
@@ -257,20 +333,17 @@ pub fn __run_test(cfg: __TestConfig) {
257
333
. unwrap ( )
258
334
. remove ( 0 ) ;
259
335
260
- assert_eq ! ( req. uri( ) . path( ) , sreq. uri) ;
261
- assert_eq ! ( req. method( ) , & sreq. method) ;
262
- assert_eq ! ( req. version( ) , version) ;
263
- for ( name, value) in & sreq. headers {
264
- assert_eq ! (
265
- req. headers( ) [ name] ,
266
- value
267
- ) ;
336
+ assert_eq ! ( req. uri( ) . path( ) , sreq. uri, "client path" ) ;
337
+ assert_eq ! ( req. method( ) , & sreq. method, "client method" ) ;
338
+ assert_eq ! ( req. version( ) , version, "client version" ) ;
339
+ for func in & sreq. headers {
340
+ func ( & req. headers ( ) ) ;
268
341
}
269
342
let sbody = sreq. body ;
270
343
req. into_body ( )
271
344
. concat2 ( )
272
345
. map ( move |body| {
273
- assert_eq ! ( body. as_ref( ) , sbody. as_slice( ) ) ;
346
+ assert_eq ! ( body. as_ref( ) , sbody. as_slice( ) , "client body" ) ;
274
347
275
348
let mut res = Response :: builder ( )
276
349
. status ( sres. status )
@@ -339,18 +412,15 @@ pub fn __run_test(cfg: __TestConfig) {
339
412
340
413
client. request ( req)
341
414
. and_then ( move |res| {
342
- assert_eq ! ( res. status( ) , cstatus) ;
343
- assert_eq ! ( res. version( ) , version) ;
344
- for ( name, value) in & cheaders {
345
- assert_eq ! (
346
- res. headers( ) [ name] ,
347
- value
348
- ) ;
415
+ assert_eq ! ( res. status( ) , cstatus, "server status" ) ;
416
+ assert_eq ! ( res. version( ) , version, "server version" ) ;
417
+ for func in & cheaders {
418
+ func ( & res. headers ( ) ) ;
349
419
}
350
420
res. into_body ( ) . concat2 ( )
351
421
} )
352
422
. map ( move |body| {
353
- assert_eq ! ( body. as_ref( ) , cbody. as_slice( ) ) ;
423
+ assert_eq ! ( body. as_ref( ) , cbody. as_slice( ) , "server body" ) ;
354
424
} )
355
425
. map_err ( |e| panic ! ( "client error: {}" , e) )
356
426
} ) ;
0 commit comments