aboutsummaryrefslogtreecommitdiffstats
path: root/tests/unit/net/fetch.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/unit/net/fetch.rs')
-rw-r--r--tests/unit/net/fetch.rs119
1 files changed, 60 insertions, 59 deletions
diff --git a/tests/unit/net/fetch.rs b/tests/unit/net/fetch.rs
index 4803eee5178..3514f69d6e0 100644
--- a/tests/unit/net/fetch.rs
+++ b/tests/unit/net/fetch.rs
@@ -14,8 +14,9 @@ use hyper::server::{Request as HyperRequest, Response as HyperResponse};
use hyper::status::StatusCode;
use hyper::uri::RequestUri;
use net::fetch::cors_cache::CORSCache;
-use net::fetch::methods::{fetch, fetch_async, fetch_with_cors_cache};
-use net_traits::AsyncFetchListener;
+use net::fetch::methods::{FetchContext, fetch, fetch_with_cors_cache};
+use net::http_loader::HttpState;
+use net_traits::FetchTaskTarget;
use net_traits::request::{Origin, RedirectMode, Referer, Request, RequestMode};
use net_traits::response::{CacheState, Response, ResponseBody, ResponseType};
use std::fs::File;
@@ -24,6 +25,7 @@ use std::rc::Rc;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::mpsc::{Sender, channel};
use std::sync::{Arc, Mutex};
+use std::thread;
use time::{self, Duration};
use unicase::UniCase;
use url::{Origin as UrlOrigin, Url};
@@ -35,11 +37,32 @@ struct FetchResponseCollector {
sender: Sender<Response>,
}
-impl AsyncFetchListener for FetchResponseCollector {
- fn response_available(&self, response: Response) {
- let _ = self.sender.send(response);
+fn new_fetch_context() -> FetchContext {
+ FetchContext {
+ state: HttpState::new(),
+ user_agent: "Such Browser. Very Layout. Wow.".into(),
}
}
+impl FetchTaskTarget for FetchResponseCollector {
+ fn process_request_body(&mut self, _: &Request) {}
+ fn process_request_eof(&mut self, _: &Request) {}
+ fn process_response(&mut self, _: &Response) {}
+ fn process_response_chunk(&mut self, _: Vec<u8>) {}
+ /// Fired when the response is fully fetched
+ fn process_response_eof(&mut self, response: &Response) {
+ self.sender.send(response.clone());
+ }
+}
+
+fn fetch_async(request: Request, target: Box<FetchTaskTarget + Send>) {
+ thread::spawn(move || {
+ fetch(Rc::new(request), &mut Some(target), new_fetch_context());
+ });
+}
+
+fn fetch_sync(request: Request) -> Response {
+ fetch(Rc::new(request), &mut None, new_fetch_context())
+}
fn make_server<H: Handler + 'static>(handler: H) -> (Listening, Url) {
// this is a Listening server because of handle_threads()
@@ -61,10 +84,8 @@ fn test_fetch_response_is_not_network_error() {
let origin = Origin::Origin(url.origin());
let mut request = Request::new(url, Some(origin), false);
- request.referer = Referer::NoReferer;
- let wrapped_request = Rc::new(request);
-
- let fetch_response = fetch(wrapped_request);
+ *request.referer.borrow_mut() = Referer::NoReferer;
+ let fetch_response = fetch_sync(request);
let _ = server.close();
if fetch_response.is_network_error() {
@@ -82,10 +103,8 @@ fn test_fetch_response_body_matches_const_message() {
let origin = Origin::Origin(url.origin());
let mut request = Request::new(url, Some(origin), false);
- request.referer = Referer::NoReferer;
- let wrapped_request = Rc::new(request);
-
- let fetch_response = fetch(wrapped_request);
+ *request.referer.borrow_mut() = Referer::NoReferer;
+ let fetch_response = fetch_sync(request);
let _ = server.close();
assert!(!fetch_response.is_network_error());
@@ -104,10 +123,8 @@ fn test_fetch_aboutblank() {
let url = Url::parse("about:blank").unwrap();
let origin = Origin::Origin(url.origin());
let mut request = Request::new(url, Some(origin), false);
- request.referer = Referer::NoReferer;
- let wrapped_request = Rc::new(request);
-
- let fetch_response = fetch(wrapped_request);
+ *request.referer.borrow_mut() = Referer::NoReferer;
+ let fetch_response = fetch_sync(request);
assert!(!fetch_response.is_network_error());
assert!(*fetch_response.body.lock().unwrap() == ResponseBody::Done(vec![]));
}
@@ -119,7 +136,7 @@ fn test_fetch_data() {
let request = Request::new(url, Some(origin), false);
request.same_origin_data.set(true);
let expected_resp_body = "<p>Servo</p>".to_owned();
- let fetch_response = fetch(Rc::new(request));
+ let fetch_response = fetch_sync(request);
assert!(!fetch_response.is_network_error());
assert_eq!(fetch_response.headers.len(), 1);
@@ -148,7 +165,7 @@ fn test_fetch_file() {
let request = Request::new(url, Some(origin), false);
request.same_origin_data.set(true);
- let fetch_response = fetch(Rc::new(request));
+ let fetch_response = fetch_sync(request);
assert!(!fetch_response.is_network_error());
assert_eq!(fetch_response.headers.len(), 1);
let content_type: &ContentType = fetch_response.headers.get().unwrap();
@@ -187,12 +204,10 @@ fn test_cors_preflight_fetch() {
let origin = Origin::Origin(UrlOrigin::new_opaque());
let mut request = Request::new(url, Some(origin), false);
- request.referer = Referer::NoReferer;
+ *request.referer.borrow_mut() = Referer::NoReferer;
request.use_cors_preflight = true;
request.mode = RequestMode::CORSMode;
- let wrapped_request = Rc::new(request);
-
- let fetch_response = fetch(wrapped_request);
+ let fetch_response = fetch_sync(request);
let _ = server.close();
assert!(!fetch_response.is_network_error());
@@ -226,14 +241,14 @@ fn test_cors_preflight_cache_fetch() {
let origin = Origin::Origin(UrlOrigin::new_opaque());
let mut request = Request::new(url.clone(), Some(origin.clone()), false);
- request.referer = Referer::NoReferer;
+ *request.referer.borrow_mut() = Referer::NoReferer;
request.use_cors_preflight = true;
request.mode = RequestMode::CORSMode;
let wrapped_request0 = Rc::new(request.clone());
let wrapped_request1 = Rc::new(request);
- let fetch_response0 = fetch_with_cors_cache(wrapped_request0.clone(), &mut cache);
- let fetch_response1 = fetch_with_cors_cache(wrapped_request1.clone(), &mut cache);
+ let fetch_response0 = fetch_with_cors_cache(wrapped_request0.clone(), &mut cache, &mut None, new_fetch_context());
+ let fetch_response1 = fetch_with_cors_cache(wrapped_request1.clone(), &mut cache, &mut None, new_fetch_context());
let _ = server.close();
assert!(!fetch_response0.is_network_error() && !fetch_response1.is_network_error());
@@ -276,12 +291,10 @@ fn test_cors_preflight_fetch_network_error() {
let origin = Origin::Origin(UrlOrigin::new_opaque());
let mut request = Request::new(url, Some(origin), false);
*request.method.borrow_mut() = Method::Extension("CHICKEN".to_owned());
- request.referer = Referer::NoReferer;
+ *request.referer.borrow_mut() = Referer::NoReferer;
request.use_cors_preflight = true;
request.mode = RequestMode::CORSMode;
- let wrapped_request = Rc::new(request);
-
- let fetch_response = fetch(wrapped_request);
+ let fetch_response = fetch_sync(request);
let _ = server.close();
assert!(fetch_response.is_network_error());
@@ -301,10 +314,8 @@ fn test_fetch_response_is_basic_filtered() {
let origin = Origin::Origin(url.origin());
let mut request = Request::new(url, Some(origin), false);
- request.referer = Referer::NoReferer;
- let wrapped_request = Rc::new(request);
-
- let fetch_response = fetch(wrapped_request);
+ *request.referer.borrow_mut() = Referer::NoReferer;
+ let fetch_response = fetch_sync(request);
let _ = server.close();
assert!(!fetch_response.is_network_error());
@@ -348,11 +359,9 @@ fn test_fetch_response_is_cors_filtered() {
// an origin mis-match will stop it from defaulting to a basic filtered response
let origin = Origin::Origin(UrlOrigin::new_opaque());
let mut request = Request::new(url, Some(origin), false);
- request.referer = Referer::NoReferer;
+ *request.referer.borrow_mut() = Referer::NoReferer;
request.mode = RequestMode::CORSMode;
- let wrapped_request = Rc::new(request);
-
- let fetch_response = fetch(wrapped_request);
+ let fetch_response = fetch_sync(request);
let _ = server.close();
assert!(!fetch_response.is_network_error());
@@ -382,10 +391,8 @@ fn test_fetch_response_is_opaque_filtered() {
// an origin mis-match will fall through to an Opaque filtered response
let origin = Origin::Origin(UrlOrigin::new_opaque());
let mut request = Request::new(url, Some(origin), false);
- request.referer = Referer::NoReferer;
- let wrapped_request = Rc::new(request);
-
- let fetch_response = fetch(wrapped_request);
+ *request.referer.borrow_mut() = Referer::NoReferer;
+ let fetch_response = fetch_sync(request);
let _ = server.close();
assert!(!fetch_response.is_network_error());
@@ -431,11 +438,9 @@ fn test_fetch_response_is_opaque_redirect_filtered() {
let origin = Origin::Origin(url.origin());
let mut request = Request::new(url, Some(origin), false);
- request.referer = Referer::NoReferer;
+ *request.referer.borrow_mut() = Referer::NoReferer;
request.redirect_mode.set(RedirectMode::Manual);
- let wrapped_request = Rc::new(request);
-
- let fetch_response = fetch(wrapped_request);
+ let fetch_response = fetch_sync(request);
let _ = server.close();
assert!(!fetch_response.is_network_error());
@@ -467,13 +472,12 @@ fn test_fetch_with_local_urls_only() {
let do_fetch = |url: Url| {
let origin = Origin::Origin(url.origin());
let mut request = Request::new(url, Some(origin), false);
- request.referer = Referer::NoReferer;
+ *request.referer.borrow_mut() = Referer::NoReferer;
// Set the flag.
request.local_urls_only = true;
- let wrapped_request = Rc::new(request);
- fetch(wrapped_request)
+ fetch_sync(request)
};
let local_url = Url::parse("about:blank").unwrap();
@@ -509,10 +513,8 @@ fn setup_server_and_fetch(message: &'static [u8], redirect_cap: u32) -> Response
let origin = Origin::Origin(url.origin());
let mut request = Request::new(url, Some(origin), false);
- request.referer = Referer::NoReferer;
- let wrapped_request = Rc::new(request);
-
- let fetch_response = fetch(wrapped_request);
+ *request.referer.borrow_mut() = Referer::NoReferer;
+ let fetch_response = fetch_sync(request);
let _ = server.close();
fetch_response
}
@@ -594,11 +596,10 @@ fn test_fetch_redirect_updates_method_runner(tx: Sender<bool>, status_code: Stat
let origin = Origin::Origin(url.origin());
let mut request = Request::new(url, Some(origin), false);
- request.referer = Referer::NoReferer;
+ *request.referer.borrow_mut() = Referer::NoReferer;
*request.method.borrow_mut() = method;
- let wrapped_request = Rc::new(request);
- let _ = fetch(wrapped_request);
+ let _ = fetch_sync(request);
let _ = server.close();
}
@@ -670,7 +671,7 @@ fn test_fetch_async_returns_complete_response() {
let origin = Origin::Origin(url.origin());
let mut request = Request::new(url, Some(origin), false);
- request.referer = Referer::NoReferer;
+ *request.referer.borrow_mut() = Referer::NoReferer;
let (tx, rx) = channel();
let listener = Box::new(FetchResponseCollector {
@@ -695,7 +696,7 @@ fn test_opaque_filtered_fetch_async_returns_complete_response() {
// an origin mis-match will fall through to an Opaque filtered response
let origin = Origin::Origin(UrlOrigin::new_opaque());
let mut request = Request::new(url, Some(origin), false);
- request.referer = Referer::NoReferer;
+ *request.referer.borrow_mut() = Referer::NoReferer;
let (tx, rx) = channel();
let listener = Box::new(FetchResponseCollector {
@@ -735,7 +736,7 @@ fn test_opaque_redirect_filtered_fetch_async_returns_complete_response() {
let origin = Origin::Origin(url.origin());
let mut request = Request::new(url, Some(origin), false);
- request.referer = Referer::NoReferer;
+ *request.referer.borrow_mut() = Referer::NoReferer;
request.redirect_mode.set(RedirectMode::Manual);
let (tx, rx) = channel();