summaryrefslogtreecommitdiffstats
path: root/third_party/rust/glean/tests/overflowing_preinit.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/glean/tests/overflowing_preinit.rs')
-rw-r--r--third_party/rust/glean/tests/overflowing_preinit.rs88
1 files changed, 88 insertions, 0 deletions
diff --git a/third_party/rust/glean/tests/overflowing_preinit.rs b/third_party/rust/glean/tests/overflowing_preinit.rs
new file mode 100644
index 0000000000..6d4ec7f6ae
--- /dev/null
+++ b/third_party/rust/glean/tests/overflowing_preinit.rs
@@ -0,0 +1,88 @@
+// 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;
+
+/// 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()],
+ 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.
+#[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..1010 {
+ metrics::rapid_counting.add(1);
+ }
+
+ // Now initialize Glean
+ common::initialize(cfg);
+
+ assert_eq!(Some(1000), 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();
+}