mirror of
https://github.com/servo/servo.git
synced 2025-08-04 13:10:20 +01:00
Write unit tests for cookie isolation
This commit is contained in:
parent
49d48a8680
commit
79fcd1da95
1 changed files with 170 additions and 0 deletions
|
@ -241,6 +241,52 @@ fn assert_cookie_for_domain(cookie_jar: Arc<RwLock<CookieStorage>>, domain: &str
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct AssertRequestMustNotHaveHeaders {
|
||||||
|
headers_not_expected: Vec<String>,
|
||||||
|
request_headers: Headers,
|
||||||
|
t: ResponseType
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AssertRequestMustNotHaveHeaders {
|
||||||
|
fn new(t: ResponseType, headers_not_expected: Vec<String>) -> Self {
|
||||||
|
AssertRequestMustNotHaveHeaders {
|
||||||
|
headers_not_expected: headers_not_expected,
|
||||||
|
request_headers: Headers::new(), t: t }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl HttpRequest for AssertRequestMustNotHaveHeaders {
|
||||||
|
type R = MockResponse;
|
||||||
|
|
||||||
|
fn headers_mut(&mut self) -> &mut Headers { &mut self.request_headers }
|
||||||
|
|
||||||
|
fn send(self, _: &Option<Vec<u8>>) -> Result<MockResponse, LoadError> {
|
||||||
|
for header in &self.headers_not_expected {
|
||||||
|
assert!(self.request_headers.get_raw(header).is_none());
|
||||||
|
}
|
||||||
|
|
||||||
|
response_for_request_type(self.t)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct AssertMustNotHaveHeadersRequestFactory {
|
||||||
|
headers_not_expected: Vec<String>,
|
||||||
|
body: Vec<u8>
|
||||||
|
}
|
||||||
|
|
||||||
|
impl HttpRequestFactory for AssertMustNotHaveHeadersRequestFactory {
|
||||||
|
type R = AssertRequestMustNotHaveHeaders;
|
||||||
|
|
||||||
|
fn create(&self, _: Url, _: Method) -> Result<AssertRequestMustNotHaveHeaders, LoadError> {
|
||||||
|
Ok(
|
||||||
|
AssertRequestMustNotHaveHeaders::new(
|
||||||
|
ResponseType::Text(self.body.clone()),
|
||||||
|
self.headers_not_expected.clone()
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct AssertMustHaveBodyRequest {
|
struct AssertMustHaveBodyRequest {
|
||||||
expected_body: Option<Vec<u8>>,
|
expected_body: Option<Vec<u8>>,
|
||||||
headers: Headers,
|
headers: Headers,
|
||||||
|
@ -733,6 +779,130 @@ fn test_load_sets_requests_cookies_header_for_url_by_getting_cookies_from_the_re
|
||||||
}, DEFAULT_USER_AGENT.to_string());
|
}, DEFAULT_USER_AGENT.to_string());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_load_sends_cookie_if_nonhttp() {
|
||||||
|
let url = Url::parse("http://mozilla.com").unwrap();
|
||||||
|
|
||||||
|
let hsts_list = Arc::new(RwLock::new(HSTSList::new()));
|
||||||
|
let cookie_jar = Arc::new(RwLock::new(CookieStorage::new()));
|
||||||
|
|
||||||
|
{
|
||||||
|
let mut cookie_jar = cookie_jar.write().unwrap();
|
||||||
|
let cookie_url = url.clone();
|
||||||
|
let cookie = Cookie::new_wrapped(
|
||||||
|
CookiePair::new("mozillaIs".to_owned(), "theBest".to_owned()),
|
||||||
|
&cookie_url,
|
||||||
|
CookieSource::NonHTTP
|
||||||
|
).unwrap();
|
||||||
|
cookie_jar.push(cookie, CookieSource::HTTP);
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut load_data = LoadData::new(url, None);
|
||||||
|
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::<AssertRequestMustIncludeHeaders>(
|
||||||
|
load_data.clone(), hsts_list, cookie_jar, None,
|
||||||
|
&AssertMustIncludeHeadersRequestFactory {
|
||||||
|
expected_headers: headers,
|
||||||
|
body: <[_]>::to_vec(&*load_data.data.unwrap())
|
||||||
|
}, DEFAULT_USER_AGENT.to_string());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_cookie_set_with_httponly_should_not_be_available_using_getcookiesforurl() {
|
||||||
|
struct Factory;
|
||||||
|
|
||||||
|
impl HttpRequestFactory for Factory {
|
||||||
|
type R = MockRequest;
|
||||||
|
|
||||||
|
fn create(&self, _: Url, _: Method) -> Result<MockRequest, LoadError> {
|
||||||
|
let content = <[_]>::to_vec("Yay!".as_bytes());
|
||||||
|
let mut headers = Headers::new();
|
||||||
|
headers.set_raw("set-cookie", vec![b"mozillaIs=theBest; HttpOnly;".to_vec()]);
|
||||||
|
Ok(MockRequest::new(ResponseType::WithHeaders(content, headers)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let url = Url::parse("http://mozilla.com").unwrap();
|
||||||
|
|
||||||
|
let hsts_list = Arc::new(RwLock::new(HSTSList::new()));
|
||||||
|
let cookie_jar = Arc::new(RwLock::new(CookieStorage::new()));
|
||||||
|
|
||||||
|
let load_data = LoadData::new(url.clone(), None);
|
||||||
|
let _ = load::<MockRequest>(load_data, hsts_list,
|
||||||
|
cookie_jar.clone(),
|
||||||
|
None,
|
||||||
|
&Factory,
|
||||||
|
DEFAULT_USER_AGENT.to_string());
|
||||||
|
|
||||||
|
let mut cookie_jar = cookie_jar.write().unwrap();
|
||||||
|
assert!(cookie_jar.cookies_for_url(&url, CookieSource::NonHTTP).is_none());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_when_cookie_received_marked_secure_is_ignored_for_http() {
|
||||||
|
struct Factory;
|
||||||
|
|
||||||
|
impl HttpRequestFactory for Factory {
|
||||||
|
type R = MockRequest;
|
||||||
|
|
||||||
|
fn create(&self, _: Url, _: Method) -> Result<MockRequest, LoadError> {
|
||||||
|
let content = <[_]>::to_vec("Yay!".as_bytes());
|
||||||
|
let mut headers = Headers::new();
|
||||||
|
headers.set_raw("set-cookie", vec![b"mozillaIs=theBest; Secure;".to_vec()]);
|
||||||
|
Ok(MockRequest::new(ResponseType::WithHeaders(content, headers)))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let hsts_list = Arc::new(RwLock::new(HSTSList::new()));
|
||||||
|
let cookie_jar = Arc::new(RwLock::new(CookieStorage::new()));
|
||||||
|
|
||||||
|
let load_data = LoadData::new(Url::parse("http://mozilla.com").unwrap(), None);
|
||||||
|
let _ = load::<MockRequest>(load_data, hsts_list,
|
||||||
|
cookie_jar.clone(),
|
||||||
|
None,
|
||||||
|
&Factory,
|
||||||
|
DEFAULT_USER_AGENT.to_string());
|
||||||
|
|
||||||
|
assert_cookie_for_domain(cookie_jar, "http://mozilla.com", "");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_when_cookie_set_marked_httpsonly_secure_isnt_sent_on_http_request() {
|
||||||
|
|
||||||
|
let sec_url = Url::parse("https://mozilla.com").unwrap();
|
||||||
|
let url = Url::parse("http://mozilla.com").unwrap();
|
||||||
|
|
||||||
|
let hsts_list = Arc::new(RwLock::new(HSTSList::new()));
|
||||||
|
let cookie_jar = Arc::new(RwLock::new(CookieStorage::new()));
|
||||||
|
|
||||||
|
{
|
||||||
|
let mut cookie_jar = 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(url, None);
|
||||||
|
load_data.data = Some(<[_]>::to_vec("Yay!".as_bytes()));
|
||||||
|
|
||||||
|
assert_cookie_for_domain(cookie_jar.clone(), "https://mozilla.com", "mozillaIs=theBest");
|
||||||
|
|
||||||
|
let _ = load::<AssertRequestMustNotHaveHeaders>(
|
||||||
|
load_data.clone(), hsts_list, cookie_jar, None,
|
||||||
|
&AssertMustNotHaveHeadersRequestFactory {
|
||||||
|
headers_not_expected: vec!["Cookie".to_owned()],
|
||||||
|
body: <[_]>::to_vec(&*load_data.data.unwrap())
|
||||||
|
}, DEFAULT_USER_AGENT.to_string());
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_load_sets_content_length_to_length_of_request_body() {
|
fn test_load_sets_content_length_to_length_of_request_body() {
|
||||||
let content = "This is a request body";
|
let content = "This is a request body";
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue