From a27e6812b9db98fd8f375f2b4b497e4bafc1871e Mon Sep 17 00:00:00 2001 From: Pyfisch Date: Sun, 26 Apr 2015 19:16:44 +0200 Subject: [PATCH] test(headers): Add tests for single value headers. --- src/header/common/accept_charset.rs | 14 -------------- src/header/common/access_control_max_age.rs | 4 +++- src/header/common/access_control_request_method.rs | 2 ++ src/header/common/content_length.rs | 5 +++++ src/header/common/content_type.rs | 9 +++++++++ src/header/common/date.rs | 4 ++++ src/header/common/etag.rs | 6 ++++++ src/header/common/expires.rs | 5 +++++ src/header/common/if_modified_since.rs | 5 +++++ src/header/common/if_unmodified_since.rs | 5 +++++ src/header/common/last_modified.rs | 4 ++++ src/header/common/location.rs | 6 ++++++ src/header/common/mod.rs | 11 ++++++++++- src/header/common/referer.rs | 5 +++++ src/header/common/server.rs | 5 +++++ src/header/common/user_agent.rs | 5 +++++ 16 files changed, 79 insertions(+), 16 deletions(-) diff --git a/src/header/common/accept_charset.rs b/src/header/common/accept_charset.rs index 53ae264c..1fc044ae 100644 --- a/src/header/common/accept_charset.rs +++ b/src/header/common/accept_charset.rs @@ -21,17 +21,3 @@ header! { test_header!(test1, vec![b"iso-8859-5, unicode-1-1;q=0.8"]); } } - - -#[test] -fn test_parse_header() { - use header::{self, q}; - let a: AcceptCharset = header::Header::parse_header( - [b"iso-8859-5, iso-8859-6;q=0.8".to_vec()].as_ref()).unwrap(); - let b = AcceptCharset(vec![ - QualityItem { item: Charset::Iso_8859_5, quality: q(1.0) }, - QualityItem { item: Charset::Iso_8859_6, quality: q(0.8) }, - ]); - assert_eq!(format!("{}", a), format!("{}", b)); - assert_eq!(a, b); -} diff --git a/src/header/common/access_control_max_age.rs b/src/header/common/access_control_max_age.rs index b5a9aec2..036f14e1 100644 --- a/src/header/common/access_control_max_age.rs +++ b/src/header/common/access_control_max_age.rs @@ -5,4 +5,6 @@ header! { #[doc="The `Access-Control-Max-Age` header indicates how long the results of a"] #[doc="preflight request can be cached in a preflight result cache."] (AccessControlMaxAge, "Access-Control-Max-Age") => [u32] -} \ No newline at end of file + + test_access_control_max_age {} +} diff --git a/src/header/common/access_control_request_method.rs b/src/header/common/access_control_request_method.rs index de97ec18..30f0c152 100644 --- a/src/header/common/access_control_request_method.rs +++ b/src/header/common/access_control_request_method.rs @@ -7,4 +7,6 @@ header! { #[doc="The `Access-Control-Request-Method` header indicates which method will be"] #[doc="used in the actual request as part of the preflight request."] (AccessControlRequestMethod, "Access-Control-Request-Method") => [Method] + + test_access_control_request_method {} } diff --git a/src/header/common/content_length.rs b/src/header/common/content_length.rs index ac630880..4c9d3946 100644 --- a/src/header/common/content_length.rs +++ b/src/header/common/content_length.rs @@ -16,6 +16,11 @@ header! { #[doc="Content-Length = 1*DIGIT"] #[doc="```"] (ContentLength, "Content-Length") => [u64] + + test_content_length { + // Testcase from RFC + test_header!(test1, vec![b"3495"], Some(HeaderField(3495))); + } } bench_header!(bench, ContentLength, { vec![b"42349984".to_vec()] }); diff --git a/src/header/common/content_type.rs b/src/header/common/content_type.rs index 427de5ee..89f4bff3 100644 --- a/src/header/common/content_type.rs +++ b/src/header/common/content_type.rs @@ -17,6 +17,15 @@ header! { #[doc="Content-Type = media-type"] #[doc="```"] (ContentType, "Content-Type") => [Mime] + + test_content_type { + test_header!( + test1, + // FIXME: Should be b"text/html; charset=ISO-8859-4" but mime crate lowercases + // the whole value so parsing and formatting the value gives a different result + vec![b"text/html; charset=iso-8859-4"], + Some(HeaderField(Mime(TopLevel::Text, SubLevel::Html, vec![(Attr::Charset, Value::Ext("iso-8859-4".to_string()))])))); + } } bench_header!(bench, ContentType, { vec![b"application/json; charset=utf-8".to_vec()] }); diff --git a/src/header/common/date.rs b/src/header/common/date.rs index 70fcb5fe..8bba6769 100644 --- a/src/header/common/date.rs +++ b/src/header/common/date.rs @@ -11,6 +11,10 @@ header! { #[doc="Date = HTTP-date"] #[doc="```"] (Date, "Date") => [HttpDate] + + test_date { + test_header!(test1, vec![b"Tue, 15 Nov 1994 08:12:31 GMT"]); + } } bench_header!(imf_fixdate, Date, { vec![b"Sun, 07 Nov 1994 08:48:37 GMT".to_vec()] }); diff --git a/src/header/common/etag.rs b/src/header/common/etag.rs index 7d30041f..fbd65e29 100644 --- a/src/header/common/etag.rs +++ b/src/header/common/etag.rs @@ -18,6 +18,12 @@ header! { #[doc="ETag = entity-tag"] #[doc="```"] (ETag, "ETag") => [EntityTag] + + test_etag { + test_header!(test1, vec![b"\"xyzzy\""], Some(HeaderField(EntityTag::new(false, "xyzzy".to_string())))); + test_header!(test2, vec![b"W/\"xyzzy\""], Some(HeaderField(EntityTag::new(true, "xyzzy".to_string())))); + test_header!(test3, vec![b"\"\""], Some(HeaderField(EntityTag::new(false, "".to_string())))); + } } #[cfg(test)] diff --git a/src/header/common/expires.rs b/src/header/common/expires.rs index 613ef6a0..aa080d5e 100644 --- a/src/header/common/expires.rs +++ b/src/header/common/expires.rs @@ -15,6 +15,11 @@ header! { #[doc="Expires = HTTP-date"] #[doc="```"] (Expires, "Expires") => [HttpDate] + + test_expires { + // Testcase from RFC + test_header!(test1, vec![b"Thu, 01 Dec 1994 16:00:00 GMT"]); + } } bench_header!(imf_fixdate, Expires, { vec![b"Sun, 07 Nov 1994 08:48:37 GMT".to_vec()] }); diff --git a/src/header/common/if_modified_since.rs b/src/header/common/if_modified_since.rs index b8453203..67241b84 100644 --- a/src/header/common/if_modified_since.rs +++ b/src/header/common/if_modified_since.rs @@ -15,6 +15,11 @@ header! { #[doc="If-Unmodified-Since = HTTP-date"] #[doc="```"] (IfModifiedSince, "If-Modified-Since") => [HttpDate] + + test_if_modified_since { + // Testcase from RFC + test_header!(test1, vec![b"Sat, 29 Oct 1994 19:43:31 GMT"]); + } } bench_header!(imf_fixdate, IfModifiedSince, { vec![b"Sun, 07 Nov 1994 08:48:37 GMT".to_vec()] }); diff --git a/src/header/common/if_unmodified_since.rs b/src/header/common/if_unmodified_since.rs index 200d030d..9fd3afbd 100644 --- a/src/header/common/if_unmodified_since.rs +++ b/src/header/common/if_unmodified_since.rs @@ -15,6 +15,11 @@ header! { #[doc="If-Unmodified-Since = HTTP-date"] #[doc="```"] (IfUnmodifiedSince, "If-Unmodified-Since") => [HttpDate] + + test_if_unmodified_since { + // Testcase from RFC + test_header!(test1, vec![b"Sat, 29 Oct 1994 19:43:31 GMT"]); + } } bench_header!(imf_fixdate, IfUnmodifiedSince, { vec![b"Sun, 07 Nov 1994 08:48:37 GMT".to_vec()] }); diff --git a/src/header/common/last_modified.rs b/src/header/common/last_modified.rs index cf3f0cf5..e203b20b 100644 --- a/src/header/common/last_modified.rs +++ b/src/header/common/last_modified.rs @@ -13,6 +13,10 @@ header! { #[doc="Expires = HTTP-date"] #[doc="```"] (LastModified, "Last-Modified") => [HttpDate] + + test_last_modified { + // Testcase from RFC + test_header!(test1, vec![b"Sat, 29 Oct 1994 19:43:31 GMT"]);} } bench_header!(imf_fixdate, LastModified, { vec![b"Sun, 07 Nov 1994 08:48:37 GMT".to_vec()] }); diff --git a/src/header/common/location.rs b/src/header/common/location.rs index f5d23023..4ff45fdf 100644 --- a/src/header/common/location.rs +++ b/src/header/common/location.rs @@ -14,6 +14,12 @@ header! { // TODO: Use URL (Location, "Location") => [String] + test_location { + // Testcase from RFC + test_header!(test1, vec![b"/People.html#tim"]); + test_header!(test2, vec![b"http://www.example.net/index.html"]); + } + } bench_header!(bench, Location, { vec![b"http://foo.com/hello:3000".to_vec()] }); diff --git a/src/header/common/mod.rs b/src/header/common/mod.rs index b69e54e7..f1218f43 100644 --- a/src/header/common/mod.rs +++ b/src/header/common/mod.rs @@ -202,7 +202,7 @@ macro_rules! header { } }; // Single value header - ($(#[$a:meta])*($id:ident, $n:expr) => [$value:ty]) => { + ($(#[$a:meta])*($id:ident, $n:expr) => [$value:ty] $tm:ident{$($tf:item)*}) => { $(#[$a])* #[derive(Clone, Debug, PartialEq)] pub struct $id(pub $value); @@ -225,6 +225,15 @@ macro_rules! header { ::std::fmt::Display::fmt(&**self, f) } } + #[allow(unused_imports)] + mod $tm{ + use std::str; + use $crate::header::*; + use $crate::mime::*; + use $crate::method::Method; + use super::$id as HeaderField; + $($tf)* + } }; // List header, one or more items with "*" option ($(#[$a:meta])*($id:ident, $n:expr) => {Any / ($item:ty)+} $tm:ident{$($tf:item)*}) => { diff --git a/src/header/common/referer.rs b/src/header/common/referer.rs index ab720537..06dbeeff 100644 --- a/src/header/common/referer.rs +++ b/src/header/common/referer.rs @@ -14,6 +14,11 @@ header! { #[doc="```"] // TODO: Use URL (Referer, "Referer") => [String] + + test_referer { + // Testcase from the RFC + test_header!(test1, vec![b"http://www.example.org/hypertext/Overview.html"]); + } } bench_header!(bench, Referer, { vec![b"http://foo.com/hello:3000".to_vec()] }); diff --git a/src/header/common/server.rs b/src/header/common/server.rs index 476d4bc0..9f795c68 100644 --- a/src/header/common/server.rs +++ b/src/header/common/server.rs @@ -15,6 +15,11 @@ header! { #[doc="```"] // TODO: Maybe parse as defined in the spec? (Server, "Server") => [String] + + test_server { + // Testcase from RFC + test_header!(test1, vec![b"CERN/3.0 libwww/2.17"]); + } } bench_header!(bench, Server, { vec![b"Some String".to_vec()] }); diff --git a/src/header/common/user_agent.rs b/src/header/common/user_agent.rs index 2a481e9b..2592bcda 100644 --- a/src/header/common/user_agent.rs +++ b/src/header/common/user_agent.rs @@ -18,6 +18,11 @@ header! { #[doc="```"] // TODO: Maybe write parsing according to the spec? (Split the String) (UserAgent, "User-Agent") => [String] + + test_user_agent { + // Testcase from RFC + test_header!(test1, vec![b"CERN-LineMode/2.15 libwww/2.17b3"]); + } } #[test] fn test_format() {