refactor(tests): use macro to assign request properties

This commit is contained in:
Sean McArthur
2019-02-27 16:13:48 -08:00
parent 4cf22dfa21
commit 2b0a5eaa04

View File

@@ -36,11 +36,16 @@ macro_rules! test {
expected: $server_expected:expr, expected: $server_expected:expr,
reply: $server_reply:expr, reply: $server_reply:expr,
client: client:
request: request: {$(
$c_req_prop:ident: $c_req_val: tt,
)*},
/*
method: $client_method:ident, method: $client_method:ident,
url: $client_url:expr, url: $client_url:expr,
headers: { $($request_header_name:expr => $request_header_val:expr,)* }, headers: { $($request_header_name:expr => $request_header_val:expr,)* },
body: $request_body:expr, body: $request_body:expr,
},
*/
response: response:
status: $client_status:ident, status: $client_status:ident,
@@ -54,11 +59,9 @@ macro_rules! test {
reply: $server_reply, reply: $server_reply,
client: client:
set_host: true, set_host: true,
request: request: {$(
method: $client_method, $c_req_prop: $c_req_val,
url: $client_url, )*},
headers: { $($request_header_name => $request_header_val,)* },
body: $request_body,
response: response:
status: $client_status, status: $client_status,
@@ -73,11 +76,9 @@ macro_rules! test {
reply: $server_reply:expr, reply: $server_reply:expr,
client: client:
set_host: $set_host:expr, set_host: $set_host:expr,
request: request: {$(
method: $client_method:ident, $c_req_prop:ident: $c_req_val:tt,
url: $client_url:expr, )*},
headers: { $($request_header_name:expr => $request_header_val:expr,)* },
body: $request_body:expr,
response: response:
status: $client_status:ident, status: $client_status:ident,
@@ -92,11 +93,9 @@ macro_rules! test {
client: client:
set_host: $set_host, set_host: $set_host,
title_case_headers: false, title_case_headers: false,
request: request: {$(
method: $client_method, $c_req_prop: $c_req_val,
url: $client_url, )*},
headers: { $($request_header_name => $request_header_val,)* },
body: $request_body,
response: response:
status: $client_status, status: $client_status,
@@ -112,11 +111,9 @@ macro_rules! test {
client: client:
set_host: $set_host:expr, set_host: $set_host:expr,
title_case_headers: $title_case_headers:expr, title_case_headers: $title_case_headers:expr,
request: request: {$(
method: $client_method:ident, $c_req_prop:ident: $c_req_val:tt,
url: $client_url:expr, )*},
headers: { $($request_header_name:expr => $request_header_val:expr,)* },
body: $request_body:expr,
response: response:
status: $client_status:ident, status: $client_status:ident,
@@ -138,17 +135,23 @@ macro_rules! test {
client: client:
set_host: $set_host, set_host: $set_host,
title_case_headers: $title_case_headers, title_case_headers: $title_case_headers,
request: request: {$(
method: $client_method, $c_req_prop: $c_req_val,
url: $client_url, )*},
headers: { $($request_header_name => $request_header_val,)* },
body: $request_body,
}.expect("test"); }.expect("test");
assert_eq!(res.status(), StatusCode::$client_status); assert_eq!(res.status(), StatusCode::$client_status);
$( $(
assert_eq!(res.headers()[$response_header_name], $response_header_val); assert_eq!(
res
.headers()
.get($response_header_name)
.expect(concat!("response header '", stringify!($response_header_name), "'")),
$response_header_val,
"response header '{}'",
stringify!($response_header_name),
);
)* )*
let body = rt.block_on(res let body = rt.block_on(res
@@ -167,11 +170,9 @@ macro_rules! test {
expected: $server_expected:expr, expected: $server_expected:expr,
reply: $server_reply:expr, reply: $server_reply:expr,
client: client:
request: request: {$(
method: $client_method:ident, $c_req_prop:ident: $c_req_val:tt,
url: $client_url:expr, )*},
headers: { $($request_header_name:expr => $request_header_val:expr,)* },
body: $request_body:expr,
error: $err:expr, error: $err:expr,
) => ( ) => (
@@ -190,11 +191,9 @@ macro_rules! test {
client: client:
set_host: true, set_host: true,
title_case_headers: false, title_case_headers: false,
request: request: {$(
method: $client_method, $c_req_prop: $c_req_val,
url: $client_url, )*},
headers: { $($request_header_name => $request_header_val,)* },
body: $request_body,
}.unwrap_err(); }.unwrap_err();
fn infer_closure<F: FnOnce(&::hyper::Error) -> bool>(f: F) -> F { f } fn infer_closure<F: FnOnce(&::hyper::Error) -> bool>(f: F) -> F { f }
@@ -216,11 +215,9 @@ macro_rules! test {
client: client:
set_host: $set_host:expr, set_host: $set_host:expr,
title_case_headers: $title_case_headers:expr, title_case_headers: $title_case_headers:expr,
request: request: {$(
method: $client_method:ident, $c_req_prop:ident: $c_req_val:tt,
url: $client_url:expr, )*},
headers: { $($request_header_name:expr => $request_header_val:expr,)* },
body: $request_body:expr,
) => ({ ) => ({
let server = TcpListener::bind("127.0.0.1:0").expect("bind"); let server = TcpListener::bind("127.0.0.1:0").expect("bind");
let addr = server.local_addr().expect("local_addr"); let addr = server.local_addr().expect("local_addr");
@@ -232,18 +229,13 @@ macro_rules! test {
.http1_title_case_headers($title_case_headers) .http1_title_case_headers($title_case_headers)
.build(connector); .build(connector);
let body = if let Some(body) = $request_body { #[allow(unused_assignments)]
let body: &'static str = body; let mut body = Body::empty();
body.into() let mut req_builder = Request::builder();
} else {
Body::empty()
};
let req = Request::builder()
.method(Method::$client_method)
.uri(&*format!($client_url, addr=addr))
$( $(
.header($request_header_name, $request_header_val) test!(@client_request; req_builder, body, addr, $c_req_prop: $c_req_val);
)* )*
let req = req_builder
.body(body) .body(body)
.expect("request builder"); .expect("request builder");
@@ -286,6 +278,42 @@ macro_rules! test {
resp resp
}) })
}); });
(
@client_request;
$req_builder:ident,
$body:ident,
$addr:ident,
$c_req_prop:ident: $c_req_val:tt
) => ({
__client_req_prop!($req_builder, $body, $addr, $c_req_prop: $c_req_val)
});
}
macro_rules! __client_req_prop {
($req_builder:ident, $body:ident, $addr:ident, headers: $map:tt) => ({
__client_req_header!($req_builder, $map)
});
($req_builder:ident, $body:ident, $addr:ident, method: $method:ident) => ({
$req_builder.method(Method::$method);
});
($req_builder:ident, $body:ident, $addr:ident, url: $url:expr) => ({
$req_builder.uri(format!($url, addr=$addr));
});
($req_builder:ident, $body:ident, $addr:ident, body: $body_e:expr) => ({
$body = $body_e.into();
});
}
macro_rules! __client_req_header {
($req_builder:ident, { $($name:expr => $val:expr,)* }) => {
$(
$req_builder.header($name, $val);
)*
}
} }
static REPLY_OK: &'static str = "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n"; static REPLY_OK: &'static str = "HTTP/1.1 200 OK\r\nContent-Length: 0\r\n\r\n";
@@ -298,11 +326,10 @@ test! {
reply: REPLY_OK, reply: REPLY_OK,
client: client:
request: request: {
method: GET, method: GET,
url: "http://{addr}/", url: "http://{addr}/",
headers: {}, },
body: None,
response: response:
status: OK, status: OK,
headers: { headers: {
@@ -319,11 +346,10 @@ test! {
reply: REPLY_OK, reply: REPLY_OK,
client: client:
request: request: {
method: GET, method: GET,
url: "http://{addr}/foo?key=val#dont_send_me", url: "http://{addr}/foo?key=val#dont_send_me",
headers: {}, },
body: None,
response: response:
status: OK, status: OK,
headers: { headers: {
@@ -340,11 +366,11 @@ test! {
reply: REPLY_OK, reply: REPLY_OK,
client: client:
request: request: {
method: GET, method: GET,
url: "http://{addr}/", url: "http://{addr}/",
headers: {}, body: "", // not Body::empty
body: Some(""), },
response: response:
status: OK, status: OK,
headers: { headers: {
@@ -367,13 +393,14 @@ test! {
reply: REPLY_OK, reply: REPLY_OK,
client: client:
request: request: {
method: POST, method: POST,
url: "http://{addr}/length", url: "http://{addr}/length",
headers: { headers: {
"Content-Length" => "7", "Content-Length" => "7",
}, },
body: Some("foo bar"), body: "foo bar",
},
response: response:
status: OK, status: OK,
headers: {}, headers: {},
@@ -396,13 +423,14 @@ test! {
reply: REPLY_OK, reply: REPLY_OK,
client: client:
request: request: {
method: POST, method: POST,
url: "http://{addr}/chunks", url: "http://{addr}/chunks",
headers: { headers: {
"Transfer-Encoding" => "chunked", "Transfer-Encoding" => "chunked",
}, },
body: Some("foo bar baz"), body: "foo bar baz",
},
response: response:
status: OK, status: OK,
headers: {}, headers: {},
@@ -422,13 +450,13 @@ test! {
reply: REPLY_OK, reply: REPLY_OK,
client: client:
request: request: {
method: POST, method: POST,
url: "http://{addr}/empty", url: "http://{addr}/empty",
headers: { headers: {
"Content-Length" => "0", "Content-Length" => "0",
}, },
body: None, },
response: response:
status: OK, status: OK,
headers: {}, headers: {},
@@ -452,11 +480,10 @@ test! {
", ",
client: client:
request: request: {
method: HEAD, method: HEAD,
url: "http://{addr}/head", url: "http://{addr}/head",
headers: {}, },
body: None,
response: response:
status: OK, status: OK,
headers: {}, headers: {},
@@ -482,11 +509,10 @@ test! {
", ",
client: client:
request: request: {
method: GET, method: GET,
url: "http://{addr}/pipe", url: "http://{addr}/pipe",
headers: {}, },
body: None,
response: response:
status: OK, status: OK,
headers: {}, headers: {},
@@ -501,11 +527,10 @@ test! {
reply: "won't reply", reply: "won't reply",
client: client:
request: request: {
method: GET, method: GET,
url: "/relative-{addr}", url: "/relative-{addr}",
headers: {}, },
body: None,
error: |err| err.to_string() == "client requires absolute-form URIs", error: |err| err.to_string() == "client requires absolute-form URIs",
} }
@@ -523,11 +548,10 @@ test! {
", // unexpected eof before double CRLF ", // unexpected eof before double CRLF
client: client:
request: request: {
method: GET, method: GET,
url: "http://{addr}/err", url: "http://{addr}/err",
headers: {}, },
body: None,
error: |err| err.to_string() == "parsed HTTP message from remote is incomplete", error: |err| err.to_string() == "parsed HTTP message from remote is incomplete",
} }
@@ -546,11 +570,10 @@ test! {
", ",
client: client:
request: request: {
method: GET, method: GET,
url: "http://{addr}/err", url: "http://{addr}/err",
headers: {}, },
body: None,
// should get a Parse(Version) error // should get a Parse(Version) error
error: |err| err.is_parse(), error: |err| err.is_parse(),
@@ -576,13 +599,14 @@ test! {
", ",
client: client:
request: request: {
method: POST, method: POST,
url: "http://{addr}/continue", url: "http://{addr}/continue",
headers: { headers: {
"Content-Length" => "7", "Content-Length" => "7",
}, },
body: Some("foo bar"), body: "foo bar",
},
response: response:
status: OK, status: OK,
headers: {}, headers: {},
@@ -604,11 +628,10 @@ test! {
", ",
client: client:
request: request: {
method: CONNECT, method: CONNECT,
url: "{addr}", url: "{addr}",
headers: {}, },
body: None,
response: response:
status: OK, status: OK,
headers: {}, headers: {},
@@ -631,11 +654,10 @@ test! {
", ",
client: client:
request: request: {
method: CONNECT, method: CONNECT,
url: "http://{addr}", url: "http://{addr}",
headers: {}, },
body: None,
response: response:
status: OK, status: OK,
headers: {}, headers: {},
@@ -660,11 +682,10 @@ test! {
client: client:
set_host: false, set_host: false,
request: request: {
method: GET, method: GET,
url: "http://{addr}/no-host/{addr}", url: "http://{addr}/no-host/{addr}",
headers: {}, },
body: None,
response: response:
status: OK, status: OK,
headers: {}, headers: {},
@@ -690,13 +711,13 @@ test! {
client: client:
set_host: true, set_host: true,
title_case_headers: true, title_case_headers: true,
request: request: {
method: GET, method: GET,
url: "http://{addr}/", url: "http://{addr}/",
headers: { headers: {
"X-Test-Header" => "test", "X-Test-Header" => "test",
}, },
body: None, },
response: response:
status: OK, status: OK,
headers: {}, headers: {},