aboutsummaryrefslogtreecommitdiffstats
path: root/tests/unit/metrics/interactive_time.rs
blob: 7a6f2c71ea3b20969a9551d65cfb672d618f8085 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/* 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 base::cross_process_instant::CrossProcessInstant;
use ipc_channel::ipc;
use metrics::{InteractiveFlag, InteractiveMetrics, ProfilerMetadataFactory, ProgressiveWebMetric};
use profile_traits::time::{ProfilerChan, TimerMetadata};
use servo_url::ServoUrl;

struct DummyProfilerMetadataFactory {}
impl ProfilerMetadataFactory for DummyProfilerMetadataFactory {
    fn new_metadata(&self) -> Option<TimerMetadata> {
        None
    }
}

fn test_interactive() -> InteractiveMetrics {
    let (sender, _) = ipc::channel().unwrap();
    let profiler_chan = ProfilerChan(sender);
    let mut interactive =
        InteractiveMetrics::new(profiler_chan, ServoUrl::parse("about:blank").unwrap());

    assert_eq!((&interactive).get_navigation_start(), None);
    assert_eq!(interactive.get_tti(), None);

    interactive.set_navigation_start(CrossProcessInstant::now());

    interactive
}

#[test]
fn test_set_dcl() {
    let profiler_metadata_factory = DummyProfilerMetadataFactory {};

    let interactive = test_interactive();
    interactive.maybe_set_tti(
        &profiler_metadata_factory,
        InteractiveFlag::DOMContentLoaded,
    );
    let dcl = interactive.get_dom_content_loaded();
    assert!(dcl.is_some());

    //try to overwrite
    interactive.maybe_set_tti(
        &profiler_metadata_factory,
        InteractiveFlag::DOMContentLoaded,
    );
    assert_eq!(interactive.get_dom_content_loaded(), dcl);
    assert_eq!(interactive.get_tti(), None);
}

#[test]
fn test_set_mta() {
    let profiler_metadata_factory = DummyProfilerMetadataFactory {};

    let interactive = test_interactive();
    let now = CrossProcessInstant::now();
    interactive.maybe_set_tti(
        &profiler_metadata_factory,
        InteractiveFlag::TimeToInteractive(now),
    );
    let main_thread_available_time = interactive.get_main_thread_available();
    assert!(main_thread_available_time.is_some());
    assert_eq!(main_thread_available_time, Some(now));

    //try to overwrite
    interactive.maybe_set_tti(
        &profiler_metadata_factory,
        InteractiveFlag::TimeToInteractive(CrossProcessInstant::now()),
    );
    assert_eq!(
        interactive.get_main_thread_available(),
        main_thread_available_time
    );
    assert_eq!(interactive.get_tti(), None);
}

#[test]
fn test_set_tti_dcl() {
    let profiler_metadata_factory = DummyProfilerMetadataFactory {};

    let interactive = test_interactive();
    let now = CrossProcessInstant::now();
    interactive.maybe_set_tti(
        &profiler_metadata_factory,
        InteractiveFlag::TimeToInteractive(now),
    );
    let main_thread_available_time = interactive.get_main_thread_available();
    assert!(main_thread_available_time.is_some());

    interactive.maybe_set_tti(
        &profiler_metadata_factory,
        InteractiveFlag::DOMContentLoaded,
    );
    let dom_content_loaded_time = interactive.get_dom_content_loaded();
    assert!(dom_content_loaded_time.is_some());

    assert_eq!(interactive.get_tti(), dom_content_loaded_time);
}

#[test]
fn test_set_tti_mta() {
    let profiler_metadata_factory = DummyProfilerMetadataFactory {};

    let interactive = test_interactive();
    interactive.maybe_set_tti(
        &profiler_metadata_factory,
        InteractiveFlag::DOMContentLoaded,
    );
    let dcl = interactive.get_dom_content_loaded();
    assert!(dcl.is_some());

    let time = CrossProcessInstant::now();
    interactive.maybe_set_tti(
        &profiler_metadata_factory,
        InteractiveFlag::TimeToInteractive(time),
    );
    let mta = interactive.get_main_thread_available();
    assert!(mta.is_some());

    assert_eq!(interactive.get_tti(), mta);
}

// TODO InteractiveWindow tests