aboutsummaryrefslogtreecommitdiffstats
path: root/tests/unit/metrics/interactive_time.rs
blob: 5fa624beafe17c5b1b6d441cae45e931fc0f1004 (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
/* 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 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(time::precise_time_ns());

    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 t = time::precise_time_ns();
    interactive.maybe_set_tti(
        &profiler_metadata_factory,
        InteractiveFlag::TimeToInteractive(t),
    );
    let mta = interactive.get_main_thread_available();
    assert!(mta.is_some());
    assert_eq!(mta, Some(t));

    //try to overwrite
    interactive.maybe_set_tti(
        &profiler_metadata_factory,
        InteractiveFlag::TimeToInteractive(time::precise_time_ns()),
    );
    assert_eq!(interactive.get_main_thread_available(), mta);
    assert_eq!(interactive.get_tti(), None);
}

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

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

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

    let interactive_time = dcl.unwrap() - (&interactive).get_navigation_start().unwrap();
    assert_eq!(interactive.get_tti(), Some(interactive_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 t = time::precise_time_ns();
    interactive.maybe_set_tti(
        &profiler_metadata_factory,
        InteractiveFlag::TimeToInteractive(t),
    );
    let mta = interactive.get_main_thread_available();
    assert!(mta.is_some());

    let interactive_time = mta.unwrap() - (&interactive).get_navigation_start().unwrap();
    assert_eq!(interactive.get_tti(), Some(interactive_time));
}

// TODO InteractiveWindow tests