File: overflowing_preinit.rs

package info (click to toggle)
firefox 149.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,767,760 kB
  • sloc: cpp: 7,416,064; javascript: 6,752,859; ansic: 3,774,850; python: 1,250,473; xml: 641,578; asm: 439,191; java: 186,617; sh: 56,634; makefile: 18,856; objc: 13,092; perl: 12,763; pascal: 5,960; yacc: 4,583; cs: 3,846; lex: 1,720; ruby: 1,002; php: 436; lisp: 258; awk: 105; sql: 66; sed: 53; csh: 10; exp: 6
file content (89 lines) | stat: -rw-r--r-- 3,114 bytes parent folder | download | duplicates (4)
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
// 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/.

//! This integration test should model how the RLB is used when embedded in another Rust application
//! (e.g. FOG/Firefox Desktop).
//!
//! We write a single test scenario per file to avoid any state keeping across runs
//! (different files run as different processes).

mod common;

use glean::{ConfigurationBuilder, TestGetValue};

/// Some user metrics.
mod metrics {
    use glean::private::*;
    use glean::Lifetime;
    use glean_core::CommonMetricData;
    use once_cell::sync::Lazy;

    #[allow(non_upper_case_globals)]
    pub static rapid_counting: Lazy<CounterMetric> = Lazy::new(|| {
        CounterMetric::new(CommonMetricData {
            name: "rapid_counting".into(),
            category: "sample".into(),
            send_in_pings: vec!["metrics".into()],
            lifetime: Lifetime::Ping,
            disabled: false,
            ..Default::default()
        })
    });

    // This is a hack, but a good one:
    //
    // To avoid reaching into RLB internals we re-create the metric so we can look at it.
    #[allow(non_upper_case_globals)]
    pub static preinit_tasks_overflow: Lazy<CounterMetric> = Lazy::new(|| {
        CounterMetric::new(CommonMetricData {
            category: "glean.error".into(),
            name: "preinit_tasks_overflow".into(),
            send_in_pings: vec!["metrics".into(), "health".into()],
            lifetime: Lifetime::Ping,
            disabled: false,
            ..Default::default()
        })
    });
}

/// Test scenario: Lots of metric recordings before  init.
///
/// The app starts recording metrics before Glean is initialized.
/// Once initialized the recordings are processed and data is persisted.
/// The pre-init dispatcher queue records how many recordings over the limit it saw.
///
/// This is an integration test to avoid dealing with resetting the dispatcher.
#[ignore] // oops, long running test see Bug 1911350 for more info
#[test]
fn overflowing_the_task_queue_records_telemetry() {
    common::enable_test_logging();

    // Create a custom configuration to use a validating uploader.
    let dir = tempfile::tempdir().unwrap();
    let tmpname = dir.path().to_path_buf();

    let cfg = ConfigurationBuilder::new(true, tmpname, "firefox-desktop")
        .with_server_endpoint("invalid-test-host")
        .build();

    // Insert a bunch of tasks to overflow the queue.
    for _ in 0..1000010 {
        metrics::rapid_counting.add(1);
    }

    // Now initialize Glean
    common::initialize(cfg);

    assert_eq!(Some(1000000), metrics::rapid_counting.test_get_value(None));

    // The metrics counts the total number of overflowing tasks,
    // (and the count of tasks in the queue when we overflowed: bug 1764573)
    // this might include Glean-internal tasks.
    let val = metrics::preinit_tasks_overflow
        .test_get_value(None)
        .unwrap();
    assert!(val >= 10);

    glean::shutdown();
}