servo-net-traits 0.1.0

A component of the servo web-engine.
Documentation
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at https://mozilla.org/MPL/2.0/. */

use std::str::FromStr;

use net_traits::blob_url_store::parse_blob_url;
use net_traits::{ResourceAttribute, ResourceFetchTiming, ResourceTimeValue, ResourceTimingType};
use servo_base::cross_process_instant::CrossProcessInstant;
use servo_url::ServoUrl;
use uuid::Uuid;

#[test]
fn test_set_start_time_to_fetch_start_if_nonzero_tao() {
    let mut resource_timing: ResourceFetchTiming =
        ResourceFetchTiming::new(ResourceTimingType::Resource);
    resource_timing.fetch_start = Some(CrossProcessInstant::now());
    assert!(
        resource_timing.start_time.is_none(),
        "`start_time` should be zero"
    );
    assert!(
        resource_timing.fetch_start.is_some(),
        "`fetch_start` should have a positive value"
    );

    // verify that setting `start_time` to `fetch_start` succeeds
    resource_timing.set_attribute(ResourceAttribute::StartTime(ResourceTimeValue::FetchStart));
    assert_eq!(
        resource_timing.start_time, resource_timing.fetch_start,
        "`start_time` should equal `fetch_start`"
    );
}

#[test]
fn test_set_start_time_to_fetch_start_if_zero_tao() {
    let mut resource_timing: ResourceFetchTiming =
        ResourceFetchTiming::new(ResourceTimingType::Resource);
    resource_timing.start_time = Some(CrossProcessInstant::now());
    assert!(
        resource_timing.start_time.is_some(),
        "`start_time` should have a positive value"
    );
    assert!(
        resource_timing.fetch_start.is_none(),
        "`fetch_start` should be zero"
    );

    // verify that setting `start_time` to `fetch_start` succeeds even when `fetch_start` == zero
    resource_timing.set_attribute(ResourceAttribute::StartTime(ResourceTimeValue::FetchStart));
    assert_eq!(
        resource_timing.start_time, resource_timing.fetch_start,
        "`start_time` should equal `fetch_start`"
    );
}

#[test]
fn test_set_start_time_to_fetch_start_if_nonzero_no_tao() {
    let mut resource_timing: ResourceFetchTiming =
        ResourceFetchTiming::new(ResourceTimingType::Resource);
    resource_timing.mark_timing_check_failed();
    resource_timing.fetch_start = Some(CrossProcessInstant::now());
    assert!(
        resource_timing.start_time.is_none(),
        "`start_time` should be zero"
    );
    assert!(
        !resource_timing.fetch_start.is_none(),
        "`fetch_start` should have a positive value"
    );

    // verify that setting `start_time` to `fetch_start` succeeds even when TAO check failed
    resource_timing.set_attribute(ResourceAttribute::StartTime(ResourceTimeValue::FetchStart));
    assert_eq!(
        resource_timing.start_time, resource_timing.fetch_start,
        "`start_time` should equal `fetch_start`"
    );
}

#[test]
fn test_set_start_time_to_fetch_start_if_zero_no_tao() {
    let mut resource_timing: ResourceFetchTiming =
        ResourceFetchTiming::new(ResourceTimingType::Resource);
    resource_timing.mark_timing_check_failed();
    resource_timing.start_time = Some(CrossProcessInstant::now());
    assert!(
        resource_timing.start_time.is_some(),
        "`start_time` should have a positive value"
    );
    assert!(
        resource_timing.fetch_start.is_none(),
        "`fetch_start` should be zero"
    );

    // verify that setting `start_time` to `fetch_start` succeeds even when `fetch_start`==0 and no TAO
    resource_timing.set_attribute(ResourceAttribute::StartTime(ResourceTimeValue::FetchStart));
    assert_eq!(
        resource_timing.start_time, resource_timing.fetch_start,
        "`start_time` should equal `fetch_start`"
    );
}

#[test]
fn test_set_start_time_to_redirect_start_if_nonzero_tao() {
    let mut resource_timing: ResourceFetchTiming =
        ResourceFetchTiming::new(ResourceTimingType::Resource);
    resource_timing.redirect_start = Some(CrossProcessInstant::now());
    assert!(
        resource_timing.start_time.is_none(),
        "`start_time` should be zero"
    );
    assert!(
        resource_timing.redirect_start.is_some(),
        "`redirect_start` should have a positive value"
    );

    // verify that setting `start_time` to `redirect_start` succeeds for nonzero `redirect_start`, TAO pass
    resource_timing.set_attribute(ResourceAttribute::StartTime(
        ResourceTimeValue::RedirectStart,
    ));
    assert_eq!(
        resource_timing.start_time, resource_timing.redirect_start,
        "`start_time` should equal `redirect_start`"
    );
}

#[test]
fn test_not_set_start_time_to_redirect_start_if_zero_tao() {
    let mut resource_timing: ResourceFetchTiming =
        ResourceFetchTiming::new(ResourceTimingType::Resource);
    resource_timing.start_time = Some(CrossProcessInstant::now());
    assert!(
        resource_timing.start_time.is_some(),
        "`start_time` should have a positive value"
    );
    assert!(
        resource_timing.redirect_start.is_none(),
        "`redirect_start` should be zero"
    );

    // verify that setting `start_time` to `redirect_start` fails if `redirect_start` == 0
    resource_timing.set_attribute(ResourceAttribute::StartTime(
        ResourceTimeValue::RedirectStart,
    ));
    assert_ne!(
        resource_timing.start_time, resource_timing.redirect_start,
        "`start_time` should *not* equal `redirect_start`"
    );
}

#[test]
fn test_not_set_start_time_to_redirect_start_if_nonzero_no_tao() {
    let mut resource_timing: ResourceFetchTiming =
        ResourceFetchTiming::new(ResourceTimingType::Resource);
    resource_timing.mark_timing_check_failed();
    // Note: properly-behaved redirect_start should never be nonzero once TAO check has failed
    resource_timing.redirect_start = Some(CrossProcessInstant::now());
    assert!(
        resource_timing.start_time.is_none(),
        "`start_time` should be zero"
    );
    assert!(
        resource_timing.redirect_start.is_some(),
        "`redirect_start` should have a positive value"
    );

    // verify that setting `start_time` to `redirect_start` fails if TAO check fails
    resource_timing.set_attribute(ResourceAttribute::StartTime(
        ResourceTimeValue::RedirectStart,
    ));
    assert_ne!(
        resource_timing.start_time, resource_timing.redirect_start,
        "`start_time` should *not* equal `redirect_start`"
    );
}

#[test]
fn test_not_set_start_time_to_redirect_start_if_zero_no_tao() {
    let mut resource_timing: ResourceFetchTiming =
        ResourceFetchTiming::new(ResourceTimingType::Resource);
    resource_timing.mark_timing_check_failed();
    resource_timing.start_time = Some(CrossProcessInstant::now());
    assert!(
        resource_timing.start_time.is_some(),
        "`start_time` should have a positive value"
    );
    assert!(
        resource_timing.redirect_start.is_none(),
        "`redirect_start` should be zero"
    );

    // verify that setting `start_time` to `redirect_start` fails if `redirect_start`==0 and no TAO
    resource_timing.set_attribute(ResourceAttribute::StartTime(
        ResourceTimeValue::RedirectStart,
    ));
    assert_ne!(
        resource_timing.start_time, resource_timing.redirect_start,
        "`start_time` should *not* equal `redirect_start`"
    );
}

#[test]
fn test_set_start_time() {
    let mut resource_timing: ResourceFetchTiming =
        ResourceFetchTiming::new(ResourceTimingType::Resource);
    assert!(
        resource_timing.start_time.is_none(),
        "`start_time` should be zero"
    );

    // verify setting `start_time` to current time succeeds
    resource_timing.set_attribute(ResourceAttribute::StartTime(ResourceTimeValue::Now));
    assert!(
        resource_timing.start_time.is_some(),
        "failed to set `start_time`"
    );
}
#[test]
fn test_reset_start_time() {
    let mut resource_timing: ResourceFetchTiming =
        ResourceFetchTiming::new(ResourceTimingType::Resource);
    assert!(
        resource_timing.start_time.is_none(),
        "`start_time` should be zero"
    );

    resource_timing.start_time = Some(CrossProcessInstant::now());
    assert!(
        resource_timing.start_time.is_some(),
        "`start_time` should have a positive value"
    );

    // verify resetting `start_time` (to zero) succeeds
    resource_timing.set_attribute(ResourceAttribute::StartTime(ResourceTimeValue::Zero));
    assert!(
        resource_timing.start_time.is_none(),
        "failed to reset `start_time`"
    );
}

#[test]
fn parse_blob_url_with_opaque_origin() {
    let input = ServoUrl::parse("blob:null/93947d57-a49f-4b00-bdcc-fbf1ed8b60ab").unwrap();
    let expected_uuid = Uuid::from_str("93947d57-a49f-4b00-bdcc-fbf1ed8b60ab").unwrap();
    let (uuid, origin) = parse_blob_url(&input).unwrap();

    assert_eq!(uuid, expected_uuid);
    assert!(!origin.is_tuple(), "Origin is not opaque");
}