From 27d90fb6a815b42ef18c39d4a2f41efd660a730b Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Mon, 14 Nov 2016 14:43:34 +0100 Subject: [PATCH 01/14] Rewrite test_load_follows_a_redirect. --- tests/unit/net/http_loader.rs | 75 +++++++++++++---------------------- 1 file changed, 28 insertions(+), 47 deletions(-) diff --git a/tests/unit/net/http_loader.rs b/tests/unit/net/http_loader.rs index e7b2055fa3c..b7a679b46eb 100644 --- a/tests/unit/net/http_loader.rs +++ b/tests/unit/net/http_loader.rs @@ -132,18 +132,6 @@ impl HttpResponse for MockResponse { fn status_raw(&self) -> &RawStatus { &self.sr } } -fn redirect_to(host: String) -> MockResponse { - let mut headers = Headers::new(); - headers.set(Location(host.to_owned())); - - MockResponse::new( - headers, - StatusCode::MovedPermanently, - RawStatus(301, Cow::Borrowed("Moved Permanently")), - b"".to_vec() - ) -} - struct TestProvider { username: String, password: String, @@ -191,7 +179,6 @@ fn respond_404() -> MockResponse { } enum ResponseType { - Redirect(String), RedirectWithHeaders(String, Headers), Text(Vec), WithHeaders(Vec, Headers), @@ -211,9 +198,6 @@ impl MockRequest { fn response_for_request_type(t: ResponseType) -> Result { match t { - ResponseType::Redirect(location) => { - Ok(redirect_to(location)) - }, ResponseType::RedirectWithHeaders(location, headers) => { Ok(redirect_with_headers(location, headers)) }, @@ -1260,41 +1244,38 @@ fn test_load_succeeds_with_a_redirect_loop() { #[test] fn test_load_follows_a_redirect() { - struct Factory; + let post_handler = move |request: HyperRequest, response: HyperResponse| { + assert_eq!(request.method, Method::Get); + response.send(b"Yay!").unwrap(); + }; + let (mut post_server, post_url) = make_server(post_handler); - impl HttpRequestFactory for Factory { - type R = MockRequest; + let post_redirect_url = post_url.clone(); + let pre_handler = move |request: HyperRequest, mut response: HyperResponse| { + assert_eq!(request.method, Method::Get); + response.headers_mut().set(Location(post_redirect_url.to_string())); + *response.status_mut() = StatusCode::MovedPermanently; + response.send(b"").unwrap(); + }; + let (mut pre_server, pre_url) = make_server(pre_handler); - fn create(&self, url: ServoUrl, _: Method, _: Headers) -> Result { - if url.domain().unwrap() == "mozilla.com" { - Ok(MockRequest::new(ResponseType::Redirect("http://mozilla.org".to_owned()))) - } else if url.domain().unwrap() == "mozilla.org" { - Ok( - MockRequest::new( - ResponseType::Text( - <[_]>::to_vec("Yay!".as_bytes()) - ) - ) - ) - } else { - panic!("unexpected host {:?}", url) - } - } - } + let request = Request::from_init(RequestInit { + url: pre_url.clone(), + method: Method::Get, + destination: Destination::Document, + origin: pre_url.clone(), + pipeline_id: Some(TEST_PIPELINE_ID), + .. RequestInit::default() + }); + let response = fetch_sync(request, None); - let url = ServoUrl::parse("http://mozilla.com").unwrap(); - let load_data = LoadData::new(LoadContext::Browsing, url.clone(), &HttpTest); - let http_state = HttpState::new(); - let ui_provider = TestProvider::new(); + let _ = pre_server.close(); + let _ = post_server.close(); - match load(&load_data, &ui_provider, &http_state, None, &Factory, - DEFAULT_USER_AGENT.into(), &CancellationListener::new(None), None) { - Err(e) => panic!("expected to follow a redirect {:?}", e), - Ok(mut lr) => { - let response = read_response(&mut lr); - assert_eq!(response, "Yay!".to_owned()); - } - } + let response = response.to_actual(); + assert!(response.status.unwrap().is_success()); + assert_eq!(*response.body.lock().unwrap(), + ResponseBody::Done(b"Yay!".to_vec())); } struct DontConnectFactory; From 9f23949628525dc4af2fd168dbbd90c88e67fd6f Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Fri, 18 Nov 2016 12:00:31 +0100 Subject: [PATCH 02/14] Rewrite test_if_auth_creds_not_in_url_but_in_cache_it_sets_it. --- tests/unit/net/http_loader.rs | 52 ++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/tests/unit/net/http_loader.rs b/tests/unit/net/http_loader.rs index b7a679b46eb..8b4c5f8746a 100644 --- a/tests/unit/net/http_loader.rs +++ b/tests/unit/net/http_loader.rs @@ -1493,38 +1493,40 @@ fn test_redirect_from_x_to_x_provides_x_with_cookie_from_first_response() { #[test] fn test_if_auth_creds_not_in_url_but_in_cache_it_sets_it() { - let url = ServoUrl::parse("http://mozilla.com").unwrap(); + let handler = move |request: HyperRequest, response: HyperResponse| { + let expected = Authorization(Basic { + username: "username".to_owned(), + password: Some("test".to_owned()) + }); + assert_eq!(request.headers.get(), Some(&expected)); + response.send(b"").unwrap(); + }; + let (mut server, url) = make_server(handler); - let http_state = HttpState::new(); - let ui_provider = TestProvider::new(); + let request = Request::from_init(RequestInit { + url: url.clone(), + method: Method::Get, + body: None, + destination: Destination::Document, + origin: url.clone(), + pipeline_id: Some(TEST_PIPELINE_ID), + credentials_mode: CredentialsMode::Include, + .. RequestInit::default() + }); + let context = new_fetch_context(None); let auth_entry = AuthCacheEntry { - user_name: "username".to_owned(), - password: "test".to_owned(), - }; + user_name: "username".to_owned(), + password: "test".to_owned(), + }; - http_state.auth_cache.write().unwrap().entries.insert(url.origin().clone().ascii_serialization(), auth_entry); + context.state.auth_cache.write().unwrap().entries.insert(url.origin().clone().ascii_serialization(), auth_entry); - let mut load_data = LoadData::new(LoadContext::Browsing, url, &HttpTest); - load_data.credentials_flag = true; + let response = fetch(Rc::new(request), &mut None, &context); - let mut auth_header = Headers::new(); + let _ = server.close(); - auth_header.set( - Authorization( - Basic { - username: "username".to_owned(), - password: Some("test".to_owned()) - } - ) - ); - - let _ = load( - &load_data, &ui_provider, &http_state, - None, &AssertMustIncludeHeadersRequestFactory { - expected_headers: auth_header, - body: <[_]>::to_vec(&[]) - }, DEFAULT_USER_AGENT.into(), &CancellationListener::new(None), None); + assert!(response.status.unwrap().is_success()); } #[test] From 4c34e9aa89420fea91a0d4e5431479ccba6d9239 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Mon, 21 Nov 2016 10:42:37 +0100 Subject: [PATCH 03/14] Remove test_auth_ui_sets_header_on_401. The fetch stack does not yet support asking the user for credentials (#14305). --- tests/unit/net/http_loader.rs | 55 ----------------------------------- 1 file changed, 55 deletions(-) diff --git a/tests/unit/net/http_loader.rs b/tests/unit/net/http_loader.rs index 8b4c5f8746a..d3bf857d906 100644 --- a/tests/unit/net/http_loader.rs +++ b/tests/unit/net/http_loader.rs @@ -224,28 +224,6 @@ impl HttpRequest for MockRequest { } } -struct AssertAuthHeaderRequestFactory { - expected_headers: Headers, - body: Vec -} - -impl HttpRequestFactory for AssertAuthHeaderRequestFactory { - type R = MockRequest; - - fn create(&self, _: ServoUrl, _: Method, headers: Headers) -> Result { - let request = if headers.has::>() { - assert_headers_included(&self.expected_headers, &headers); - MockRequest::new(ResponseType::Text(self.body.clone())) - } else { - let mut headers = Headers::new(); - headers.set_raw("WWW-Authenticate", vec![b"Basic realm=\"Test realm\"".to_vec()]); - MockRequest::new(ResponseType::NeedsAuth(headers)) - }; - - Ok(request) - } -} - fn assert_headers_included(expected: &Headers, request: &Headers) { assert!(expected.len() != 0); for header in expected.iter() { @@ -1529,39 +1507,6 @@ fn test_if_auth_creds_not_in_url_but_in_cache_it_sets_it() { assert!(response.status.unwrap().is_success()); } -#[test] -fn test_auth_ui_sets_header_on_401() { - let url = ServoUrl::parse("http://mozilla.com").unwrap(); - let http_state = HttpState::new(); - let ui_provider = TestProvider { username: "test".to_owned(), password: "test".to_owned() }; - - let mut auth_header = Headers::new(); - - auth_header.set( - Authorization( - Basic { - username: "test".to_owned(), - password: Some("test".to_owned()) - } - ) - ); - - let load_data = LoadData::new(LoadContext::Browsing, url, &HttpTest); - - match load( - &load_data, &ui_provider, &http_state, - None, &AssertAuthHeaderRequestFactory { - expected_headers: auth_header, - body: <[_]>::to_vec(&[]) - }, DEFAULT_USER_AGENT.into(), &CancellationListener::new(None), None) { - Err(e) => panic!("response contained error {:?}", e), - Ok(response) => { - assert_eq!(response.metadata.status, - Some((200, b"OK".to_vec()))); - } - } -} - #[test] fn test_auth_ui_needs_www_auth() { let url = ServoUrl::parse("http://mozilla.com").unwrap(); From a8f7f3c1db4b6992a8364a5f621a589be743df0d Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Mon, 21 Nov 2016 10:48:42 +0100 Subject: [PATCH 04/14] Rewrite test_auth_ui_needs_www_auth. --- tests/unit/net/http_loader.rs | 58 +++++++++++------------------------ 1 file changed, 18 insertions(+), 40 deletions(-) diff --git a/tests/unit/net/http_loader.rs b/tests/unit/net/http_loader.rs index d3bf857d906..c7582ba6b4d 100644 --- a/tests/unit/net/http_loader.rs +++ b/tests/unit/net/http_loader.rs @@ -149,15 +149,6 @@ impl UIProvider for TestProvider { } } -fn basic_auth(headers: Headers) -> MockResponse { - MockResponse::new( - headers, - StatusCode::Unauthorized, - RawStatus(401, Cow::Borrowed("Unauthorized")), - b"".to_vec() - ) -} - fn redirect_with_headers(host: String, mut headers: Headers) -> MockResponse { headers.set(Location(host.to_string())); @@ -182,7 +173,6 @@ enum ResponseType { RedirectWithHeaders(String, Headers), Text(Vec), WithHeaders(Vec, Headers), - NeedsAuth(Headers), Dummy404 } @@ -207,9 +197,6 @@ fn response_for_request_type(t: ResponseType) -> Result ResponseType::WithHeaders(b, h) => { Ok(respond_with_headers(b, h)) }, - ResponseType::NeedsAuth(h) => { - Ok(basic_auth(h)) - }, ResponseType::Dummy404 => { Ok(respond_404()) } @@ -1509,37 +1496,28 @@ fn test_if_auth_creds_not_in_url_but_in_cache_it_sets_it() { #[test] fn test_auth_ui_needs_www_auth() { - let url = ServoUrl::parse("http://mozilla.com").unwrap(); - let http_state = HttpState::new(); - struct AuthProvider; - impl UIProvider for AuthProvider { - fn input_username_and_password(&self, _prompt: &str) -> (Option, Option) { - panic!("shouldn't be invoked") - } - } + let handler = move |_: HyperRequest, mut response: HyperResponse| { + *response.status_mut() = StatusCode::Unauthorized; + response.send(b"").unwrap(); + }; + let (mut server, url) = make_server(handler); - struct Factory; + let request = Request::from_init(RequestInit { + url: url.clone(), + method: Method::Get, + body: None, + destination: Destination::Document, + origin: url.clone(), + pipeline_id: Some(TEST_PIPELINE_ID), + credentials_mode: CredentialsMode::Include, + .. RequestInit::default() + }); - impl HttpRequestFactory for Factory { - type R = MockRequest; + let response = fetch_sync(request, None); - fn create(&self, _: ServoUrl, _: Method, _: Headers) -> Result { - Ok(MockRequest::new(ResponseType::NeedsAuth(Headers::new()))) - } - } + let _ = server.close(); - let load_data = LoadData::new(LoadContext::Browsing, url, &HttpTest); - - let response = load(&load_data, &AuthProvider, &http_state, - None, &Factory, DEFAULT_USER_AGENT.into(), - &CancellationListener::new(None), None); - match response { - Err(e) => panic!("response contained error {:?}", e), - Ok(response) => { - assert_eq!(response.metadata.status, - Some((401, "Unauthorized".as_bytes().to_vec()))); - } - } + assert_eq!(response.status.unwrap(), StatusCode::Unauthorized); } fn assert_referrer_header_matches(origin_info: &LoadOrigin, From 64d176d85162c0da28a81a9390f103e1b9f2a176 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Mon, 21 Nov 2016 11:10:51 +0100 Subject: [PATCH 05/14] Remove referrer policy unit tests. This code should be covered sufficiently by wpt tests. --- tests/unit/net/http_loader.rs | 444 +--------------------------------- 1 file changed, 1 insertion(+), 443 deletions(-) diff --git a/tests/unit/net/http_loader.rs b/tests/unit/net/http_loader.rs index c7582ba6b4d..1afb5a1aa1f 100644 --- a/tests/unit/net/http_loader.rs +++ b/tests/unit/net/http_loader.rs @@ -13,7 +13,7 @@ use flate2::write::{DeflateEncoder, GzEncoder}; use hyper::LanguageTag; use hyper::header::{Accept, AcceptEncoding, ContentEncoding, ContentLength, Cookie as CookieHeader}; use hyper::header::{AcceptLanguage, Authorization, Basic, Date}; -use hyper::header::{Encoding, Headers, Host, Location, Quality, QualityItem, Referer, SetCookie, qitem}; +use hyper::header::{Encoding, Headers, Host, Location, Quality, QualityItem, SetCookie, qitem}; use hyper::header::{StrictTransportSecurity, UserAgent}; use hyper::http::RawStatus; use hyper::method::Method; @@ -62,23 +62,6 @@ impl LoadOrigin for HttpTest { } } -struct LoadOriginInfo<'a> { - referrer_url: &'a str, - referrer_policy: Option, -} - -impl<'a> LoadOrigin for LoadOriginInfo<'a> { - fn referrer_url(&self) -> Option { - Some(ServoUrl::parse(self.referrer_url).unwrap()) - } - fn referrer_policy(&self) -> Option { - self.referrer_policy.clone() - } - fn pipeline_id(&self) -> Option { - None - } -} - fn respond_with(body: Vec) -> MockResponse { let headers = Headers::new(); respond_with_headers(body, headers) @@ -1520,431 +1503,6 @@ fn test_auth_ui_needs_www_auth() { assert_eq!(response.status.unwrap(), StatusCode::Unauthorized); } -fn assert_referrer_header_matches(origin_info: &LoadOrigin, - request_url: &str, - expected_referrer: &str) { - let url = ServoUrl::parse(request_url).unwrap(); - let ui_provider = TestProvider::new(); - - let load_data = LoadData::new(LoadContext::Browsing, - url.clone(), - origin_info); - - let mut referrer_headers = Headers::new(); - referrer_headers.set(Referer(expected_referrer.to_owned())); - - let http_state = HttpState::new(); - - let _ = load(&load_data.clone(), &ui_provider, &http_state, None, - &AssertMustIncludeHeadersRequestFactory { - expected_headers: referrer_headers, - body: <[_]>::to_vec(&[]) - }, DEFAULT_USER_AGENT.into(), - &CancellationListener::new(None), None); -} - -fn assert_referrer_header_not_included(origin_info: &LoadOrigin, request_url: &str) { - let url = ServoUrl::parse(request_url).unwrap(); - let ui_provider = TestProvider::new(); - - let load_data = LoadData::new(LoadContext::Browsing, - url.clone(), - origin_info); - - let http_state = HttpState::new(); - - let _ = load( - &load_data.clone(), &ui_provider, &http_state, None, - &AssertMustNotIncludeHeadersRequestFactory { - headers_not_expected: vec!["Referer".to_owned()], - body: <[_]>::to_vec(&[]) - }, DEFAULT_USER_AGENT.into(), &CancellationListener::new(None), None); -} - -#[test] -fn test_referrer_set_to_origin_with_origin_policy() { - let request_url = "http://mozilla.com"; - let referrer_url = "http://username:password@someurl.com/some/path#fragment"; - let referrer_policy = Some(ReferrerPolicy::Origin); - let expected_referrer = "http://someurl.com/"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_referrer_set_to_ref_url_with_sameorigin_policy_same_orig() { - let request_url = "http://mozilla.com"; - let referrer_url = "http://username:password@mozilla.com/some/path#fragment"; - let referrer_policy = Some(ReferrerPolicy::SameOrigin); - let expected_referrer = "http://mozilla.com/some/path"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_no_referrer_set_with_sameorigin_policy_cross_orig() { - let request_url = "http://mozilla.com"; - let referrer_url = "http://username:password@someurl.com/some/path#fragment"; - let referrer_policy = Some(ReferrerPolicy::SameOrigin); - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_not_included(&origin_info, request_url); -} - -#[test] -fn test_referrer_set_to_stripped_url_with_unsafeurl_policy() { - let request_url = "http://mozilla.com"; - let referrer_url = "http://username:password@someurl.com/some/path#fragment"; - let referrer_policy = Some(ReferrerPolicy::UnsafeUrl); - let expected_referrer = "http://someurl.com/some/path"; - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_referrer_with_originwhencrossorigin_policy_cross_orig() { - let request_url = "http://mozilla.com"; - let referrer_url = "http://username:password@someurl.com/some/path#fragment"; - let referrer_policy = Some(ReferrerPolicy::OriginWhenCrossOrigin); - let expected_referrer = "http://someurl.com/"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_referrer_with_originwhencrossorigin_policy_same_orig() { - let request_url = "http://mozilla.com"; - let referrer_url = "http://username:password@mozilla.com/some/path#fragment"; - let referrer_policy = Some(ReferrerPolicy::OriginWhenCrossOrigin); - let expected_referrer = "http://mozilla.com/some/path"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_http_to_https_considered_cross_origin_for_referrer_header_logic() { - let request_url = "https://mozilla.com"; - let referrer_url = "http://mozilla.com/some/path"; - let referrer_policy = Some(ReferrerPolicy::OriginWhenCrossOrigin); - let expected_referrer = "http://mozilla.com/"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_referrer_with_strictorigin_policy_http_to_https() { - let request_url = "https://mozilla.com"; - let referrer_url = "http://mozilla.com"; - let referrer_policy = Some(ReferrerPolicy::StrictOrigin); - let expected_referrer = "http://mozilla.com/"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_no_referrer_with_strictorigin_policy_https_to_http() { - let request_url = "http://mozilla.com"; - let referrer_url = "https://mozilla.com/some/path"; - let referrer_policy = Some(ReferrerPolicy::StrictOrigin); - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_not_included(&origin_info, request_url); -} - -#[test] -fn test_referrer_with_strictorigin_policy_http_to_http() { - let request_url = "http://mozilla.com/"; - let referrer_url = "http://mozilla.com/some/path"; - let referrer_policy = Some(ReferrerPolicy::StrictOrigin); - let expected_referrer = "http://mozilla.com/"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_referrer_with_strictorigin_policy_https_to_https() { - let request_url = "https://mozilla.com/"; - let referrer_url = "https://mozilla.com/some/path"; - let referrer_policy = Some(ReferrerPolicy::StrictOrigin); - let expected_referrer = "https://mozilla.com/"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_referrer_with_strictoriginwhencrossorigin_policy_https_to_https_same_origin() { - let request_url = "https://mozilla.com"; - let referrer_url = "https://mozilla.com/some/path"; - let referrer_policy = Some(ReferrerPolicy::StrictOriginWhenCrossOrigin); - let expected_referrer = "https://mozilla.com/some/path"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_referrer_with_strictoriginwhencrossorigin_policy_https_to_https_cross_origin() { - let request_url = "https://servo.mozilla.com"; - let referrer_url = "https://mozilla.com/some/path"; - let referrer_policy = Some(ReferrerPolicy::StrictOriginWhenCrossOrigin); - let expected_referrer = "https://mozilla.com/"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_referrer_set_with_strictoriginwhencrossorigin_policy_http_to_http_cross_orig() { - let request_url = "http://servo.mozilla.com"; - let referrer_url = "http://mozilla.com/some/path"; - let referrer_policy = Some(ReferrerPolicy::StrictOriginWhenCrossOrigin); - let expected_referrer = "http://mozilla.com/"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_referrer_set_with_strictoriginwhencrossorigin_policy_http_to_http_same_orig() { - let request_url = "http://mozilla.com"; - let referrer_url = "http://mozilla.com/some/path"; - let referrer_policy = Some(ReferrerPolicy::StrictOriginWhenCrossOrigin); - let expected_referrer = "http://mozilla.com/some/path"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_referrer_set_with_strictoriginwhencrossorigin_policy_http_to_https_cross_orig() { - let request_url = "https://servo.mozilla.com"; - let referrer_url = "http://mozilla.com/some/path"; - let referrer_policy = Some(ReferrerPolicy::StrictOriginWhenCrossOrigin); - let expected_referrer = "http://mozilla.com/"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_referrer_set_with_strictoriginwhencrossorigin_policy_http_to_https_same_orig() { - let request_url = "https://mozilla.com"; - let referrer_url = "http://mozilla.com/some/path"; - let referrer_policy = Some(ReferrerPolicy::StrictOriginWhenCrossOrigin); - let expected_referrer = "http://mozilla.com/"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_referrer_set_to_ref_url_with_noreferrerwhendowngrade_policy_https_to_https() { - let request_url = "https://mozilla.com"; - let referrer_url = "https://username:password@mozilla.com/some/path#fragment"; - let referrer_policy = Some(ReferrerPolicy::NoReferrerWhenDowngrade); - let expected_referrer = "https://mozilla.com/some/path"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy, - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_no_referrer_set_with_noreferrerwhendowngrade_policy_https_to_http() { - let request_url = "http://mozilla.com"; - let referrer_url = "https://username:password@mozilla.com/some/path#fragment"; - let referrer_policy = Some(ReferrerPolicy::NoReferrerWhenDowngrade); - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_not_included(&origin_info, request_url) -} - -#[test] -fn test_referrer_set_to_ref_url_with_noreferrerwhendowngrade_policy_http_to_https() { - let request_url = "https://mozilla.com"; - let referrer_url = "http://username:password@mozilla.com/some/path#fragment"; - let referrer_policy = Some(ReferrerPolicy::NoReferrerWhenDowngrade); - let expected_referrer = "http://mozilla.com/some/path"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_referrer_set_to_ref_url_with_noreferrerwhendowngrade_policy_http_to_http() { - let request_url = "http://mozilla.com"; - let referrer_url = "http://username:password@mozilla.com/some/path#fragment"; - let referrer_policy = Some(ReferrerPolicy::NoReferrerWhenDowngrade); - let expected_referrer = "http://mozilla.com/some/path"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_no_referrer_policy_follows_noreferrerwhendowngrade_https_to_https() { - let request_url = "https://mozilla.com"; - let referrer_url = "https://username:password@mozilla.com/some/path#fragment"; - let referrer_policy = None; - let expected_referrer = "https://mozilla.com/some/path"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_no_referrer_policy_follows_noreferrerwhendowngrade_https_to_http() { - let request_url = "http://mozilla.com"; - let referrer_url = "https://username:password@mozilla.com/some/path#fragment"; - let referrer_policy = None; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_not_included(&origin_info, request_url); -} - -#[test] -fn test_no_referrer_policy_follows_noreferrerwhendowngrade_http_to_https() { - let request_url = "https://mozilla.com"; - let referrer_url = "http://username:password@mozilla.com/some/path#fragment"; - let referrer_policy = None; - let expected_referrer = "http://mozilla.com/some/path"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_no_referrer_policy_follows_noreferrerwhendowngrade_http_to_http() { - let request_url = "http://mozilla.com"; - let referrer_url = "http://username:password@mozilla.com/some/path#fragment"; - let referrer_policy = None; - let expected_referrer = "http://mozilla.com/some/path"; - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy - }; - - assert_referrer_header_matches(&origin_info, request_url, expected_referrer); -} - -#[test] -fn test_no_referrer_set_with_noreferrer_policy() { - let request_url = "http://mozilla.com"; - let referrer_url = "http://someurl.com"; - let referrer_policy = Some(ReferrerPolicy::NoReferrer); - - let origin_info = LoadOriginInfo { - referrer_url: referrer_url, - referrer_policy: referrer_policy, - }; - - assert_referrer_header_not_included(&origin_info, request_url) -} - fn load_request_for_custom_response(expected_body: Vec) -> (Metadata, String) { use ipc_channel::ipc; let (sender, receiver) = ipc::channel().unwrap(); From 3da075ca736df30e2fa2bcfec84ff845364e8212 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Mon, 21 Nov 2016 11:16:55 +0100 Subject: [PATCH 06/14] Remove test for CustomResponseMediator. The fetch stack does not yet support this at all (#14306). --- tests/unit/net/http_loader.rs | 65 +---------------------------------- 1 file changed, 1 insertion(+), 64 deletions(-) diff --git a/tests/unit/net/http_loader.rs b/tests/unit/net/http_loader.rs index 1afb5a1aa1f..5e02839cea6 100644 --- a/tests/unit/net/http_loader.rs +++ b/tests/unit/net/http_loader.rs @@ -31,7 +31,7 @@ use net::resource_thread::{AuthCacheEntry, CancellationListener}; use net::test::{HttpRequest, HttpRequestFactory, HttpState, LoadError, UIProvider, load}; use net::test::{HttpResponse, LoadErrorType}; use net_traits::{CookieSource, IncludeSubdomains, LoadContext, LoadData}; -use net_traits::{CustomResponse, LoadOrigin, Metadata, NetworkError, ReferrerPolicy}; +use net_traits::{LoadOrigin, NetworkError, ReferrerPolicy}; use net_traits::hosts::replace_host_table; use net_traits::request::{Request, RequestInit, CredentialsMode, Destination}; use net_traits::response::ResponseBody; @@ -44,7 +44,6 @@ use std::rc::Rc; use std::sync::{Arc, Mutex, RwLock, mpsc}; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::mpsc::Receiver; -use std::thread; const DEFAULT_USER_AGENT: &'static str = "Test-agent"; @@ -143,20 +142,10 @@ fn redirect_with_headers(host: String, mut headers: Headers) -> MockResponse { ) } -fn respond_404() -> MockResponse { - MockResponse::new( - Headers::new(), - StatusCode::NotFound, - RawStatus(404, Cow::Borrowed("Not Found")), - b"".to_vec() - ) -} - enum ResponseType { RedirectWithHeaders(String, Headers), Text(Vec), WithHeaders(Vec, Headers), - Dummy404 } struct MockRequest { @@ -180,9 +169,6 @@ fn response_for_request_type(t: ResponseType) -> Result ResponseType::WithHeaders(b, h) => { Ok(respond_with_headers(b, h)) }, - ResponseType::Dummy404 => { - Ok(respond_404()) - } } } @@ -1503,55 +1489,6 @@ fn test_auth_ui_needs_www_auth() { assert_eq!(response.status.unwrap(), StatusCode::Unauthorized); } -fn load_request_for_custom_response(expected_body: Vec) -> (Metadata, String) { - use ipc_channel::ipc; - let (sender, receiver) = ipc::channel().unwrap(); - - struct Factory; - impl HttpRequestFactory for Factory { - type R = MockRequest; - fn create(&self, _: ServoUrl, _: Method, _: Headers) -> Result { - Ok(MockRequest::new(ResponseType::Dummy404)) - } - } - - let mock_response = CustomResponse::new( - Headers::new(), - RawStatus(200, Cow::Borrowed("OK")), - expected_body - ); - let url = ServoUrl::parse("http://mozilla.com").unwrap(); - let http_state = HttpState::new(); - let ui_provider = TestProvider::new(); - let load_data = LoadData::new(LoadContext::Browsing, url.clone(), &HttpTest); - - let join_handle = thread::spawn(move || { - let response = load(&load_data.clone(), &ui_provider, &http_state, - None, &Factory, DEFAULT_USER_AGENT.into(), &CancellationListener::new(None), Some(sender)); - match response { - Ok(mut response) => { - let metadata = response.metadata.clone(); - let body = read_response(&mut response); - (metadata, body) - } - Err(e) => panic!("Error Getting Response: {:?}", e) - } - }); - - let mediator = receiver.recv().unwrap(); - mediator.response_chan.send(Some(mock_response)).unwrap(); - let (metadata, body) = join_handle.join().unwrap(); - (metadata, body) -} - -#[test] -fn test_custom_response() { - let expected_body = b"Yay!".to_vec(); - let (metadata, body) = load_request_for_custom_response(expected_body.clone()); - assert_eq!(metadata.status, Some((200, b"OK".to_vec()))); - assert_eq!(body, String::from_utf8(expected_body).unwrap()); -} - #[test] fn test_content_blocked() { struct Factory; From b4178c7eaf327f30b076afb702362a08cd35f913 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Mon, 21 Nov 2016 11:27:45 +0100 Subject: [PATCH 07/14] Split test_content_blocked for readability. --- tests/unit/net/http_loader.rs | 38 ++++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/tests/unit/net/http_loader.rs b/tests/unit/net/http_loader.rs index 5e02839cea6..e1aff7e61c5 100644 --- a/tests/unit/net/http_loader.rs +++ b/tests/unit/net/http_loader.rs @@ -1501,12 +1501,33 @@ fn test_content_blocked() { } let blocked_url = ServoUrl::parse("http://mozilla.com").unwrap(); - let url_without_cookies = ServoUrl::parse("http://mozilla2.com").unwrap(); let mut http_state = HttpState::new(); let blocked_content_list = "[{ \"trigger\": { \"url-filter\": \"https?://mozilla.com\" }, \ - \"action\": { \"type\": \"block\" } },\ - { \"trigger\": { \"url-filter\": \"https?://mozilla2.com\" }, \ + \"action\": { \"type\": \"block\" } }]"; + http_state.blocked_content = Arc::new(parse_list(blocked_content_list).ok()); + assert!(http_state.blocked_content.is_some()); + + let ui_provider = TestProvider::new(); + + let load_data = LoadData::new(LoadContext::Browsing, blocked_url, &HttpTest); + + let response = load( + &load_data, &ui_provider, &http_state, + None, &Factory, + DEFAULT_USER_AGENT.into(), &CancellationListener::new(None), None); + match response { + Err(LoadError { error: LoadErrorType::ContentBlocked, .. }) => {}, + _ => panic!("request should have been blocked"), + } +} + +#[test] +fn test_cookies_blocked() { + let url_without_cookies = ServoUrl::parse("http://mozilla2.com").unwrap(); + let mut http_state = HttpState::new(); + + let blocked_content_list = "[{ \"trigger\": { \"url-filter\": \"https?://mozilla2.com\" }, \ \"action\": { \"type\": \"block-cookies\" } }]"; http_state.blocked_content = Arc::new(parse_list(blocked_content_list).ok()); assert!(http_state.blocked_content.is_some()); @@ -1535,15 +1556,4 @@ fn test_content_blocked() { Ok(_) => {}, _ => panic!("request should have succeeded without cookies"), } - - let load_data = LoadData::new(LoadContext::Browsing, blocked_url, &HttpTest); - - let response = load( - &load_data, &ui_provider, &http_state, - None, &Factory, - DEFAULT_USER_AGENT.into(), &CancellationListener::new(None), None); - match response { - Err(LoadError { error: LoadErrorType::ContentBlocked, .. }) => {}, - _ => panic!("request should have been blocked"), - } } From 2fa032109f05a508caf56f43038e2e480fb9d260 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Mon, 21 Nov 2016 11:35:55 +0100 Subject: [PATCH 08/14] Rewrite test_content_blocked. --- tests/unit/net/http_loader.rs | 46 +++++++++++++++++------------------ 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/tests/unit/net/http_loader.rs b/tests/unit/net/http_loader.rs index e1aff7e61c5..1349a5d45a5 100644 --- a/tests/unit/net/http_loader.rs +++ b/tests/unit/net/http_loader.rs @@ -1491,35 +1491,35 @@ fn test_auth_ui_needs_www_auth() { #[test] fn test_content_blocked() { - struct Factory; - impl HttpRequestFactory for Factory { - type R = MockRequest; + let handler = move |_: HyperRequest, response: HyperResponse| { + response.send(b"Yay!").unwrap(); + }; + let (mut server, url) = make_server(handler); - fn create(&self, _url: ServoUrl, _method: Method, _: Headers) -> Result { - Ok(MockRequest::new(ResponseType::Text(<[_]>::to_vec("Yay!".as_bytes())))) - } - } + let url_filter = url.as_str().replace("http://", "https?://"); + let blocked_content_list = format!("[{{ \ + \"trigger\": {{ \"url-filter\": \"{}\" }}, \ + \"action\": {{ \"type\": \"block\" }} \ + }}]", url_filter); - let blocked_url = ServoUrl::parse("http://mozilla.com").unwrap(); - let mut http_state = HttpState::new(); + let mut context = new_fetch_context(None); + context.state.blocked_content = Arc::new(Some(parse_list(&blocked_content_list).unwrap())); - let blocked_content_list = "[{ \"trigger\": { \"url-filter\": \"https?://mozilla.com\" }, \ - \"action\": { \"type\": \"block\" } }]"; - http_state.blocked_content = Arc::new(parse_list(blocked_content_list).ok()); - assert!(http_state.blocked_content.is_some()); + let request = Request::from_init(RequestInit { + url: url.clone(), + method: Method::Get, + body: None, + destination: Destination::Document, + origin: url.clone(), + .. RequestInit::default() + }); - let ui_provider = TestProvider::new(); + let response = fetch(Rc::new(request), &mut None, &context); - let load_data = LoadData::new(LoadContext::Browsing, blocked_url, &HttpTest); + let _ = server.close(); - let response = load( - &load_data, &ui_provider, &http_state, - None, &Factory, - DEFAULT_USER_AGENT.into(), &CancellationListener::new(None), None); - match response { - Err(LoadError { error: LoadErrorType::ContentBlocked, .. }) => {}, - _ => panic!("request should have been blocked"), - } + // TODO(#14307): this should fail. + assert!(response.status.unwrap().is_success()); } #[test] From ce89fcf3353ffaa90359cb98b4bef94edf6aa6bc Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Mon, 21 Nov 2016 11:40:41 +0100 Subject: [PATCH 09/14] Rewrite test_cookies_blocked. --- tests/unit/net/http_loader.rs | 48 ++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/tests/unit/net/http_loader.rs b/tests/unit/net/http_loader.rs index 1349a5d45a5..a930f777cde 100644 --- a/tests/unit/net/http_loader.rs +++ b/tests/unit/net/http_loader.rs @@ -1524,36 +1524,42 @@ fn test_content_blocked() { #[test] fn test_cookies_blocked() { - let url_without_cookies = ServoUrl::parse("http://mozilla2.com").unwrap(); - let mut http_state = HttpState::new(); + let handler = move |request: HyperRequest, response: HyperResponse| { + assert_eq!(request.headers.get::(), None); + response.send(b"hi").unwrap(); + }; + let (mut server, url) = make_server(handler); - let blocked_content_list = "[{ \"trigger\": { \"url-filter\": \"https?://mozilla2.com\" }, \ - \"action\": { \"type\": \"block-cookies\" } }]"; - http_state.blocked_content = Arc::new(parse_list(blocked_content_list).ok()); - assert!(http_state.blocked_content.is_some()); + let url_filter = url.as_str().replace("http://", "https?://"); + let blocked_content_list = format!("[{{ \ + \"trigger\": {{ \"url-filter\": \"{}\" }}, \ + \"action\": {{ \"type\": \"block-cookies\" }} \ + }}]", url_filter); + let mut context = new_fetch_context(None); + context.state.blocked_content = Arc::new(Some(parse_list(&blocked_content_list).unwrap())); { - let mut cookie_jar = http_state.cookie_jar.write().unwrap(); + let mut cookie_jar = context.state.cookie_jar.write().unwrap(); let cookie = Cookie::new_wrapped( - CookiePair::parse("mozillaIs=theBest;").unwrap(), - &url_without_cookies, + CookiePair::new("mozillaIs".to_owned(), "theBest".to_owned()), + &url, CookieSource::HTTP ).unwrap(); cookie_jar.push(cookie, CookieSource::HTTP); } - let ui_provider = TestProvider::new(); + let request = Request::from_init(RequestInit { + url: url.clone(), + method: Method::Get, + body: None, + destination: Destination::Document, + origin: url.clone(), + .. RequestInit::default() + }); - let load_data = LoadData::new(LoadContext::Browsing, url_without_cookies, &HttpTest); + let response = fetch(Rc::new(request), &mut None, &context); - let response = load( - &load_data, &ui_provider, &http_state, - None, &AssertMustNotIncludeHeadersRequestFactory { - headers_not_expected: vec!["Cookie".to_owned()], - body: b"hi".to_vec(), - }, DEFAULT_USER_AGENT.into(), &CancellationListener::new(None), None); - match response { - Ok(_) => {}, - _ => panic!("request should have succeeded without cookies"), - } + let _ = server.close(); + + assert!(response.status.unwrap().is_success()); } From fc26aaf8072fb8526256ce0a7d54eef860564b0e Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Wed, 2 Nov 2016 17:32:41 +0100 Subject: [PATCH 10/14] Translate a unit test for bogus schemes to fetch. --- tests/unit/net/fetch.rs | 10 ++++++++++ tests/unit/net/resource_thread.rs | 20 -------------------- 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/tests/unit/net/fetch.rs b/tests/unit/net/fetch.rs index be1878667a4..e3336e4ce93 100644 --- a/tests/unit/net/fetch.rs +++ b/tests/unit/net/fetch.rs @@ -162,6 +162,16 @@ fn test_fetch_file() { } } +#[test] +fn test_fetch_bogus_scheme() { + let url = ServoUrl::parse("bogus://whatever").unwrap(); + let origin = Origin::Origin(url.origin()); + let request = Request::new(url, Some(origin), false, None); + *request.referrer.borrow_mut() = Referrer::NoReferrer; + let fetch_response = fetch_sync(request, None); + assert!(fetch_response.is_network_error()); +} + #[test] fn test_cors_preflight_fetch() { static ACK: &'static [u8] = b"ACK"; diff --git a/tests/unit/net/resource_thread.rs b/tests/unit/net/resource_thread.rs index a11e2c001ae..2ffc0a2cd36 100644 --- a/tests/unit/net/resource_thread.rs +++ b/tests/unit/net/resource_thread.rs @@ -43,26 +43,6 @@ fn test_exit() { receiver.recv().unwrap(); } -#[test] -fn test_bad_scheme() { - let (tx, _rx) = ipc::channel().unwrap(); - let (sender, receiver) = ipc::channel().unwrap(); - let (resource_thread, _) = new_core_resource_thread( - "".into(), None, ProfilerChan(tx), None); - let (start_chan, start) = ipc::channel().unwrap(); - let url = ServoUrl::parse("bogus://whatever").unwrap(); - resource_thread.send(CoreResourceMsg::Load(LoadData::new(LoadContext::Browsing, url, &ResourceTest), - - LoadConsumer::Channel(start_chan), None)).unwrap(); - let response = start.recv().unwrap(); - match response.progress_port.recv().unwrap() { - ProgressMsg::Done(result) => { assert!(result.is_err()) } - _ => panic!("bleh") - } - resource_thread.send(CoreResourceMsg::Exit(sender)).unwrap(); - receiver.recv().unwrap(); -} - #[test] fn test_parse_hostsfile() { let mock_hosts_file_content = "127.0.0.1 foo.bar.com\n127.0.0.2 servo.test.server"; From 621ca6190a1ea5ae6cd15a3ae309bce2eb0a8230 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Mon, 21 Nov 2016 11:55:51 +0100 Subject: [PATCH 11/14] Translate a test for ftp URLs to fetch. --- tests/unit/net/fetch.rs | 10 ++++++++++ tests/unit/net/http_loader.rs | 19 ------------------- 2 files changed, 10 insertions(+), 19 deletions(-) diff --git a/tests/unit/net/fetch.rs b/tests/unit/net/fetch.rs index e3336e4ce93..bc8ab6439d0 100644 --- a/tests/unit/net/fetch.rs +++ b/tests/unit/net/fetch.rs @@ -162,6 +162,16 @@ fn test_fetch_file() { } } +#[test] +fn test_fetch_ftp() { + let url = ServoUrl::parse("ftp://not-supported").unwrap(); + let origin = Origin::Origin(url.origin()); + let request = Request::new(url, Some(origin), false, None); + *request.referrer.borrow_mut() = Referrer::NoReferrer; + let fetch_response = fetch_sync(request, None); + assert!(fetch_response.is_network_error()); +} + #[test] fn test_fetch_bogus_scheme() { let url = ServoUrl::parse("bogus://whatever").unwrap(); diff --git a/tests/unit/net/http_loader.rs b/tests/unit/net/http_loader.rs index a930f777cde..2d0f50ae019 100644 --- a/tests/unit/net/http_loader.rs +++ b/tests/unit/net/http_loader.rs @@ -1222,25 +1222,6 @@ impl HttpRequestFactory for DontConnectFactory { } } -#[test] -fn test_load_errors_when_scheme_is_not_http_or_https() { - let url = ServoUrl::parse("ftp://not-supported").unwrap(); - let load_data = LoadData::new(LoadContext::Browsing, url.clone(), &HttpTest); - - let http_state = HttpState::new(); - let ui_provider = TestProvider::new(); - - match load(&load_data, - &ui_provider, &http_state, - None, - &DontConnectFactory, - DEFAULT_USER_AGENT.into(), - &CancellationListener::new(None), None) { - Err(ref load_err) if load_err.error == LoadErrorType::UnsupportedScheme { scheme: "ftp".into() } => (), - _ => panic!("expected ftp scheme to be unsupported") - } -} - #[test] fn test_load_errors_when_viewing_source_and_inner_url_scheme_is_not_http_or_https() { let url = ServoUrl::parse("view-source:ftp://not-supported").unwrap(); From adc78c7cbe479e89038a486c265d05a0aa71019d Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Mon, 21 Nov 2016 11:56:25 +0100 Subject: [PATCH 12/14] Remove a test for view-source. This scheme is not currently supported in fetch (#14308). --- tests/unit/net/http_loader.rs | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/tests/unit/net/http_loader.rs b/tests/unit/net/http_loader.rs index 2d0f50ae019..b8ae9bbee12 100644 --- a/tests/unit/net/http_loader.rs +++ b/tests/unit/net/http_loader.rs @@ -1212,35 +1212,6 @@ fn test_load_follows_a_redirect() { ResponseBody::Done(b"Yay!".to_vec())); } -struct DontConnectFactory; - -impl HttpRequestFactory for DontConnectFactory { - type R = MockRequest; - - fn create(&self, url: ServoUrl, _: Method, _: Headers) -> Result { - Err(LoadError::new(url, LoadErrorType::Connection { reason: "should not have connected".into() })) - } -} - -#[test] -fn test_load_errors_when_viewing_source_and_inner_url_scheme_is_not_http_or_https() { - let url = ServoUrl::parse("view-source:ftp://not-supported").unwrap(); - let load_data = LoadData::new(LoadContext::Browsing, url.clone(), &HttpTest); - - let http_state = HttpState::new(); - let ui_provider = TestProvider::new(); - - match load(&load_data, - &ui_provider, &http_state, - None, - &DontConnectFactory, - DEFAULT_USER_AGENT.into(), - &CancellationListener::new(None), None) { - Err(ref load_err) if load_err.error == LoadErrorType::UnsupportedScheme { scheme: "ftp".into() } => (), - _ => panic!("expected ftp scheme to be unsupported") - } -} - #[test] fn test_load_errors_when_cancelled() { use ipc_channel::ipc; From f4f125852aa0eb91fe516b82b71ffbb04570c919 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Mon, 21 Nov 2016 17:40:47 +0100 Subject: [PATCH 13/14] Remove references to https from http_loader unit tests. --- tests/unit/net/http_loader.rs | 197 +--------------------------------- 1 file changed, 3 insertions(+), 194 deletions(-) diff --git a/tests/unit/net/http_loader.rs b/tests/unit/net/http_loader.rs index b8ae9bbee12..58e599670fd 100644 --- a/tests/unit/net/http_loader.rs +++ b/tests/unit/net/http_loader.rs @@ -26,11 +26,9 @@ use msg::constellation_msg::{PipelineId, TEST_PIPELINE_ID}; use net::cookie::Cookie; use net::cookie_storage::CookieStorage; use net::fetch::methods::fetch; -use net::hsts::HstsEntry; use net::resource_thread::{AuthCacheEntry, CancellationListener}; -use net::test::{HttpRequest, HttpRequestFactory, HttpState, LoadError, UIProvider, load}; -use net::test::{HttpResponse, LoadErrorType}; -use net_traits::{CookieSource, IncludeSubdomains, LoadContext, LoadData}; +use net::test::{HttpRequest, HttpRequestFactory, HttpResponse, HttpState, LoadError, UIProvider, load}; +use net_traits::{CookieSource, LoadContext, LoadData}; use net_traits::{LoadOrigin, NetworkError, ReferrerPolicy}; use net_traits::hosts::replace_host_table; use net_traits::request::{Request, RequestInit, CredentialsMode, Destination}; @@ -62,11 +60,7 @@ impl LoadOrigin for HttpTest { } fn respond_with(body: Vec) -> MockResponse { - let headers = Headers::new(); - respond_with_headers(body, headers) -} - -fn respond_with_headers(body: Vec, mut headers: Headers) -> MockResponse { + let mut headers = Headers::new(); headers.set(ContentLength(body.len() as u64)); MockResponse::new( @@ -145,7 +139,6 @@ fn redirect_with_headers(host: String, mut headers: Headers) -> MockResponse { enum ResponseType { RedirectWithHeaders(String, Headers), Text(Vec), - WithHeaders(Vec, Headers), } struct MockRequest { @@ -166,9 +159,6 @@ fn response_for_request_type(t: ResponseType) -> Result ResponseType::Text(b) => { Ok(respond_with(b)) }, - ResponseType::WithHeaders(b, h) => { - Ok(respond_with_headers(b, h)) - }, } } @@ -189,20 +179,6 @@ fn assert_headers_included(expected: &Headers, request: &Headers) { } } -struct AssertMustIncludeHeadersRequestFactory { - expected_headers: Headers, - body: Vec -} - -impl HttpRequestFactory for AssertMustIncludeHeadersRequestFactory { - type R = MockRequest; - - fn create(&self, _: ServoUrl, _: Method, headers: Headers) -> Result { - assert_headers_included(&self.expected_headers, &headers); - Ok(MockRequest::new(ResponseType::Text(self.body.clone()))) - } -} - fn assert_cookie_for_domain(cookie_jar: Arc>, domain: &str, cookie: Option<&str>) { let mut cookie_jar = cookie_jar.write().unwrap(); let url = ServoUrl::parse(&*domain).unwrap(); @@ -210,24 +186,6 @@ fn assert_cookie_for_domain(cookie_jar: Arc>, domain: &str assert_eq!(cookies.as_ref().map(|c| &**c), cookie); } -struct AssertMustNotIncludeHeadersRequestFactory { - headers_not_expected: Vec, - body: Vec -} - -impl HttpRequestFactory for AssertMustNotIncludeHeadersRequestFactory { - type R = MockRequest; - - fn create(&self, _: ServoUrl, _: Method, headers: Headers) -> Result { - assert!(self.headers_not_expected.len() != 0); - for header in &self.headers_not_expected { - assert!(headers.get_raw(header).is_none()); - } - - Ok(MockRequest::new(ResponseType::Text(self.body.clone()))) - } -} - pub fn expect_devtools_http_request(devtools_port: &Receiver) -> DevtoolsHttpRequest { match devtools_port.recv().unwrap() { DevtoolsControlMsg::FromChrome( @@ -674,39 +632,6 @@ fn test_load_doesnt_add_host_to_sts_list_when_url_is_http_even_if_sts_headers_ar assert_eq!(context.state.hsts_list.read().unwrap().is_host_secure(url.host_str().unwrap()), false); } -#[test] -fn test_load_adds_host_to_sts_list_when_url_is_https_and_sts_headers_are_present() { - struct Factory; - - impl HttpRequestFactory for Factory { - type R = MockRequest; - - fn create(&self, _: ServoUrl, _: Method, _: Headers) -> Result { - let content = <[_]>::to_vec("Yay!".as_bytes()); - let mut headers = Headers::new(); - headers.set(StrictTransportSecurity::excluding_subdomains(31536000)); - Ok(MockRequest::new(ResponseType::WithHeaders(content, headers))) - } - } - - let url = ServoUrl::parse("https://mozilla.com").unwrap(); - - let load_data = LoadData::new(LoadContext::Browsing, url.clone(), &HttpTest); - - let http_state = HttpState::new(); - let ui_provider = TestProvider::new(); - - let _ = load(&load_data, - &ui_provider, &http_state, - None, - &Factory, - DEFAULT_USER_AGENT.into(), - &CancellationListener::new(None), - None); - - assert!(http_state.hsts_list.read().unwrap().is_host_secure("mozilla.com")); -} - #[test] fn test_load_sets_cookies_in_the_resource_manager_when_it_get_set_cookie_header_in_response() { let handler = move |_: HyperRequest, mut response: HyperResponse| { @@ -776,48 +701,6 @@ fn test_load_sets_requests_cookies_header_for_url_by_getting_cookies_from_the_re assert!(response.status.unwrap().is_success()); } -#[test] -fn test_load_sends_secure_cookie_if_http_changed_to_https_due_to_entry_in_hsts_store() { - let url = ServoUrl::parse("http://mozilla.com").unwrap(); - let secured_url = ServoUrl::parse("https://mozilla.com").unwrap(); - let ui_provider = TestProvider::new(); - let http_state = HttpState::new(); - { - let mut hsts_list = http_state.hsts_list.write().unwrap(); - let entry = HstsEntry::new( - "mozilla.com".to_owned(), IncludeSubdomains::Included, Some(1000000) - ).unwrap(); - hsts_list.push(entry); - } - - { - let mut cookie_jar = http_state.cookie_jar.write().unwrap(); - let cookie_url = secured_url.clone(); - let mut cookie_pair = CookiePair::new("mozillaIs".to_owned(), "theBest".to_owned()); - cookie_pair.secure = true; - - let cookie = Cookie::new_wrapped( - cookie_pair, - &cookie_url, - CookieSource::HTTP - ).unwrap(); - cookie_jar.push(cookie, CookieSource::HTTP); - } - - let mut load_data = LoadData::new(LoadContext::Browsing, url, &HttpTest); - load_data.data = Some(<[_]>::to_vec("Yay!".as_bytes())); - - let mut headers = Headers::new(); - headers.set_raw("Cookie".to_owned(), vec![<[_]>::to_vec("mozillaIs=theBest".as_bytes())]); - - let _ = load( - &load_data.clone(), &ui_provider, &http_state, None, - &AssertMustIncludeHeadersRequestFactory { - expected_headers: headers, - body: <[_]>::to_vec(&*load_data.data.unwrap()) - }, DEFAULT_USER_AGENT.into(), &CancellationListener::new(None), None); -} - #[test] fn test_load_sends_cookie_if_nonhttp() { let handler = move |request: HyperRequest, response: HyperResponse| { @@ -924,38 +807,6 @@ fn test_when_cookie_received_marked_secure_is_ignored_for_http() { assert_cookie_for_domain(context.state.cookie_jar.clone(), url.as_str(), None); } -#[test] -fn test_when_cookie_set_marked_httpsonly_secure_isnt_sent_on_http_request() { - let sec_url = ServoUrl::parse("https://mozilla.com").unwrap(); - let url = ServoUrl::parse("http://mozilla.com").unwrap(); - - let http_state = HttpState::new(); - let ui_provider = TestProvider::new(); - - { - let mut cookie_jar = http_state.cookie_jar.write().unwrap(); - let cookie_url = sec_url.clone(); - let cookie = Cookie::new_wrapped( - CookiePair::parse("mozillaIs=theBest; Secure;").unwrap(), - &cookie_url, - CookieSource::HTTP - ).unwrap(); - cookie_jar.push(cookie, CookieSource::HTTP); - } - - let mut load_data = LoadData::new(LoadContext::Browsing, url, &HttpTest); - load_data.data = Some(<[_]>::to_vec("Yay!".as_bytes())); - - assert_cookie_for_domain(http_state.cookie_jar.clone(), "https://mozilla.com", Some("mozillaIs=theBest")); - - let _ = load( - &load_data.clone(), &ui_provider, &http_state, None, - &AssertMustNotIncludeHeadersRequestFactory { - headers_not_expected: vec!["Cookie".to_owned()], - body: <[_]>::to_vec(&*load_data.data.unwrap()) - }, DEFAULT_USER_AGENT.into(), &CancellationListener::new(None), None); -} - #[test] fn test_load_sets_content_length_to_length_of_request_body() { let content = b"This is a request body"; @@ -1212,48 +1063,6 @@ fn test_load_follows_a_redirect() { ResponseBody::Done(b"Yay!".to_vec())); } -#[test] -fn test_load_errors_when_cancelled() { - use ipc_channel::ipc; - use net::resource_thread::CancellableResource; - use net_traits::ResourceId; - - struct Factory; - - impl HttpRequestFactory for Factory { - type R = MockRequest; - - fn create(&self, _: ServoUrl, _: Method, _: Headers) -> Result { - let mut headers = Headers::new(); - headers.set(Host { hostname: "Kaboom!".to_owned(), port: None }); - Ok(MockRequest::new( - ResponseType::WithHeaders(<[_]>::to_vec("BOOM!".as_bytes()), headers)) - ) - } - } - - let (id_sender, _id_receiver) = ipc::channel().unwrap(); - let (cancel_sender, cancel_receiver) = mpsc::channel(); - let cancel_resource = CancellableResource::new(cancel_receiver, ResourceId(0), id_sender); - let cancel_listener = CancellationListener::new(Some(cancel_resource)); - cancel_sender.send(()).unwrap(); - - let url = ServoUrl::parse("https://mozilla.com").unwrap(); - let load_data = LoadData::new(LoadContext::Browsing, url.clone(), &HttpTest); - let http_state = HttpState::new(); - let ui_provider = TestProvider::new(); - - match load(&load_data, - &ui_provider, &http_state, - None, - &Factory, - DEFAULT_USER_AGENT.into(), - &cancel_listener, None) { - Err(ref load_err) if load_err.error == LoadErrorType::Cancelled => (), - _ => panic!("expected load cancelled error!") - } -} - #[test] fn test_redirect_from_x_to_y_provides_y_cookies_from_y() { let shared_url_y = Arc::new(Mutex::new(None::)); From 2dc73d8789f9f1e424d2e47634236da32cc92bc3 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Mon, 21 Nov 2016 22:48:57 +0100 Subject: [PATCH 14/14] Rewrite test_redirect_from_x_to_x_provides_x_with_cookie_from_first_response. --- components/net/lib.rs | 3 +- tests/unit/net/http_loader.rs | 210 +++++++--------------------------- 2 files changed, 41 insertions(+), 172 deletions(-) diff --git a/components/net/lib.rs b/components/net/lib.rs index 97c8f4f962a..f6c85a4949c 100644 --- a/components/net/lib.rs +++ b/components/net/lib.rs @@ -76,6 +76,5 @@ pub mod fetch { /// A module for re-exports of items used in unit tests. pub mod test { pub use chrome_loader::resolve_chrome_url; - pub use http_loader::{HttpRequest, HttpRequestFactory, HttpResponse, HttpState}; - pub use http_loader::{LoadError, LoadErrorType, UIProvider, load}; + pub use http_loader::HttpState; } diff --git a/tests/unit/net/http_loader.rs b/tests/unit/net/http_loader.rs index 58e599670fd..c2af331b348 100644 --- a/tests/unit/net/http_loader.rs +++ b/tests/unit/net/http_loader.rs @@ -15,62 +15,30 @@ use hyper::header::{Accept, AcceptEncoding, ContentEncoding, ContentLength, Cook use hyper::header::{AcceptLanguage, Authorization, Basic, Date}; use hyper::header::{Encoding, Headers, Host, Location, Quality, QualityItem, SetCookie, qitem}; use hyper::header::{StrictTransportSecurity, UserAgent}; -use hyper::http::RawStatus; use hyper::method::Method; use hyper::mime::{Mime, SubLevel, TopLevel}; use hyper::server::{Request as HyperRequest, Response as HyperResponse}; use hyper::status::StatusCode; use hyper::uri::RequestUri; use make_server; -use msg::constellation_msg::{PipelineId, TEST_PIPELINE_ID}; +use msg::constellation_msg::TEST_PIPELINE_ID; use net::cookie::Cookie; use net::cookie_storage::CookieStorage; use net::fetch::methods::fetch; -use net::resource_thread::{AuthCacheEntry, CancellationListener}; -use net::test::{HttpRequest, HttpRequestFactory, HttpResponse, HttpState, LoadError, UIProvider, load}; -use net_traits::{CookieSource, LoadContext, LoadData}; -use net_traits::{LoadOrigin, NetworkError, ReferrerPolicy}; +use net::resource_thread::AuthCacheEntry; +use net_traits::{CookieSource, NetworkError}; use net_traits::hosts::replace_host_table; use net_traits::request::{Request, RequestInit, CredentialsMode, Destination}; use net_traits::response::ResponseBody; use new_fetch_context; use servo_url::ServoUrl; -use std::borrow::Cow; use std::collections::HashMap; -use std::io::{self, Cursor, Read, Write}; +use std::io::{Read, Write}; use std::rc::Rc; use std::sync::{Arc, Mutex, RwLock, mpsc}; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::mpsc::Receiver; -const DEFAULT_USER_AGENT: &'static str = "Test-agent"; - -struct HttpTest; - -impl LoadOrigin for HttpTest { - fn referrer_url(&self) -> Option { - None - } - fn referrer_policy(&self) -> Option { - None - } - fn pipeline_id(&self) -> Option { - Some(TEST_PIPELINE_ID) - } -} - -fn respond_with(body: Vec) -> MockResponse { - let mut headers = Headers::new(); - headers.set(ContentLength(body.len() as u64)); - - MockResponse::new( - headers, - StatusCode::Ok, - RawStatus(200, Cow::Borrowed("OK")), - body - ) -} - fn read_response(reader: &mut Read) -> String { let mut buf = vec![0; 1024]; match reader.read(&mut buf) { @@ -83,102 +51,6 @@ fn read_response(reader: &mut Read) -> String { } } -struct MockResponse { - h: Headers, - sc: StatusCode, - sr: RawStatus, - msg: Cursor> -} - -impl MockResponse { - fn new(h: Headers, sc: StatusCode, sr: RawStatus, msg: Vec) -> MockResponse { - MockResponse { h: h, sc: sc, sr: sr, msg: Cursor::new(msg) } - } -} - -impl Read for MockResponse { - fn read(&mut self, buf: &mut [u8]) -> io::Result { - self.msg.read(buf) - } -} - -impl HttpResponse for MockResponse { - fn headers(&self) -> &Headers { &self.h } - fn status(&self) -> StatusCode { self.sc } - fn status_raw(&self) -> &RawStatus { &self.sr } -} - -struct TestProvider { - username: String, - password: String, -} - -impl TestProvider { - fn new() -> TestProvider { - TestProvider { username: "default".to_owned(), password: "default".to_owned() } - } -} -impl UIProvider for TestProvider { - fn input_username_and_password(&self, _prompt: &str) -> (Option, Option) { - (Some(self.username.to_owned()), - Some(self.password.to_owned())) - } -} - -fn redirect_with_headers(host: String, mut headers: Headers) -> MockResponse { - headers.set(Location(host.to_string())); - - MockResponse::new( - headers, - StatusCode::MovedPermanently, - RawStatus(301, Cow::Borrowed("Moved Permanently")), - b"".to_vec() - ) -} - -enum ResponseType { - RedirectWithHeaders(String, Headers), - Text(Vec), -} - -struct MockRequest { - t: ResponseType -} - -impl MockRequest { - fn new(t: ResponseType) -> MockRequest { - MockRequest { t: t } - } -} - -fn response_for_request_type(t: ResponseType) -> Result { - match t { - ResponseType::RedirectWithHeaders(location, headers) => { - Ok(redirect_with_headers(location, headers)) - }, - ResponseType::Text(b) => { - Ok(respond_with(b)) - }, - } -} - -impl HttpRequest for MockRequest { - type R = MockResponse; - - fn send(self, _: &Option>) -> Result { - response_for_request_type(self.t) - } -} - -fn assert_headers_included(expected: &Headers, request: &Headers) { - assert!(expected.len() != 0); - for header in expected.iter() { - assert!(request.get_raw(header.name()).is_some()); - assert_eq!(request.get_raw(header.name()).unwrap(), - expected.get_raw(header.name()).unwrap()) - } -} - fn assert_cookie_for_domain(cookie_jar: Arc>, domain: &str, cookie: Option<&str>) { let mut cookie_jar = cookie_jar.write().unwrap(); let url = ServoUrl::parse(&*domain).unwrap(); @@ -1142,48 +1014,46 @@ fn test_redirect_from_x_to_y_provides_y_cookies_from_y() { #[test] fn test_redirect_from_x_to_x_provides_x_with_cookie_from_first_response() { - let url = ServoUrl::parse("http://mozilla.org/initial/").unwrap(); - - struct Factory; - - impl HttpRequestFactory for Factory { - type R = MockRequest; - - fn create(&self, url: ServoUrl, _: Method, headers: Headers) -> Result { - if url.path_segments().unwrap().next().unwrap() == "initial" { - let mut initial_answer_headers = Headers::new(); - initial_answer_headers.set_raw("set-cookie", vec![b"mozillaIs=theBest; path=/;".to_vec()]); - Ok(MockRequest::new( - ResponseType::RedirectWithHeaders("http://mozilla.org/subsequent/".to_owned(), - initial_answer_headers))) - } else if url.path_segments().unwrap().next().unwrap() == "subsequent" { - let mut expected_subsequent_headers = Headers::new(); - expected_subsequent_headers.set_raw("Cookie", vec![b"mozillaIs=theBest".to_vec()]); - assert_headers_included(&expected_subsequent_headers, &headers); - Ok(MockRequest::new(ResponseType::Text(b"Yay!".to_vec()))) - } else { - panic!("unexpected host {:?}", url) - } + let handler = move |request: HyperRequest, mut response: HyperResponse| { + let path = match request.uri { + ::hyper::uri::RequestUri::AbsolutePath(path) => path, + uri => panic!("Unexpected uri: {:?}", uri), + }; + if path == "/initial/" { + response.headers_mut().set_raw("set-cookie", vec![b"mozillaIs=theBest; path=/;".to_vec()]); + let location = "/subsequent/".to_string(); + response.headers_mut().set(Location(location)); + *response.status_mut() = StatusCode::MovedPermanently; + response.send(b"").unwrap(); + } else if path == "/subsequent/" { + assert_eq!(request.headers.get(), + Some(&CookieHeader(vec![CookiePair::new("mozillaIs".to_owned(), "theBest".to_owned())]))); + response.send(b"Yay!").unwrap(); + } else { + panic!("unexpected path {:?}", path) } - } + }; + let (mut server, url) = make_server(handler); - let load_data = LoadData::new(LoadContext::Browsing, url.clone(), &HttpTest); + let url = url.join("/initial/").unwrap(); - let http_state = HttpState::new(); - let ui_provider = TestProvider::new(); + let request = Request::from_init(RequestInit { + url: url.clone(), + method: Method::Get, + destination: Destination::Document, + origin: url.clone(), + pipeline_id: Some(TEST_PIPELINE_ID), + credentials_mode: CredentialsMode::Include, + .. RequestInit::default() + }); + let response = fetch_sync(request, None); - match load(&load_data, - &ui_provider, &http_state, - None, - &Factory, - DEFAULT_USER_AGENT.into(), - &CancellationListener::new(None), None) { - Err(e) => panic!("expected to follow a redirect {:?}", e), - Ok(mut lr) => { - let response = read_response(&mut lr); - assert_eq!(response, "Yay!".to_owned()); - } - } + let _ = server.close(); + + let response = response.to_actual(); + assert!(response.status.unwrap().is_success()); + assert_eq!(*response.body.lock().unwrap(), + ResponseBody::Done(b"Yay!".to_vec())); } #[test]