// 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/.
mod common; usecrate::common::*;
use std::collections::HashMap; use std::fs;
use serde_json::json;
use glean_core::{
get_timestamp_ms, test_get_num_recorded_errors, CommonMetricData, ErrorType, Lifetime,
}; use glean_core::{metrics::*, Glean};
#[test] fn record_properly_records_without_optional_arguments() { let store_names = vec!["store1".into(), "store2".into()];
let snapshot2 = glean
.event_storage()
.snapshot_as_json(&glean, "store2", false); for s in [snapshot, snapshot2] {
assert!(s.is_some()); let s = s.unwrap();
assert_eq!(1, s.as_array().unwrap().len());
assert_eq!("telemetry", s[0]["category"]);
assert_eq!("test_event_clear", s[0]["name"]);
println!("{:?}", s[0].get("extra"));
assert!(s[0].get("extra").is_none());
}
}
// SKIPPED: Events are serialized in the correct JSON format (no extra) // SKIPPED: Events are serialized in the correct JSON format (with extra) // This test won't work as-is since Rust doesn't maintain the insertion order in // a JSON object, therefore you can't check the JSON output directly against a // string. This check is redundant with other tests, anyway, and checking against // the schema is much more useful.
#[test] fn test_sending_of_event_ping_when_it_fills_up() { let (mut glean, _t) = new_glean(None);
let store_names: Vec<String> = vec!["events".into()];
for store_name in &store_names {
glean.register_ping_type(&PingType::new(
store_name.clone(), true, false, true, true, true,
vec![],
vec!["max_capacity".to_string()], true,
));
}
// We send 510 events. We expect to get the first 500 in the ping and 10 // remaining afterward for i in0..510 { letmut extra = HashMap::new();
extra.insert("test_event_number".to_string(), i.to_string());
click.record_sync(&glean, i, extra, 0);
}
for i in0..500 { let event = &json["events"].as_array().unwrap()[i];
assert_eq!(i.to_string(), event["extra"]["test_event_number"]);
}
let snapshot = glean
.event_storage()
.snapshot_as_json(&glean, "events", false)
.unwrap();
assert_eq!(10, snapshot.as_array().unwrap().len()); for i in0..10 { let event = &snapshot.as_array().unwrap()[i];
assert_eq!((i + 500).to_string(), event["extra"]["test_event_number"]);
}
}
#[test] fn test_server_knobs_config_changing_max_events() { let (mut glean, _t) = new_glean(None);
let store_names: Vec<String> = vec!["events".into()];
for store_name in &store_names {
glean.register_ping_type(&PingType::new(
store_name.clone(), true, false, true, true, true,
vec![],
vec!["max_capacity".to_string()], true,
));
}
// 1. Set up an event to record let click = EventMetric::new(
CommonMetricData {
name: "click".into(),
category: "ui".into(),
send_in_pings: store_names,
disabled: false,
lifetime: Lifetime::Ping,
..Default::default()
},
vec!["test_event_number".into()],
);
// 2. Set a Server Knobs configuration to disable the metrics let remote_settings_config = json!(
{ "event_threshold": 50
}
)
.to_string();
glean
.apply_server_knobs_config(RemoteSettingsConfig::try_from(remote_settings_config).unwrap());
// 3. Record 51 events. We expect to get the first 50 in the first ping and 1 // remaining afterward for i in0..51 { letmut extra = HashMap::new();
extra.insert("test_event_number".to_string(), i.to_string());
click.record_sync(&glean, i, extra, 0);
}
let test_value = "LeanGleanByFrank"; let test_value_long = test_value.to_string().repeat(32); // max length for extra values. let test_value_cap = 500;
assert!(
test_value_long.len() > test_value_cap, "test value is not long enough"
); letmut extra = HashMap::new();
extra.insert("extra1".into(), test_value.to_string());
extra.insert("truncatedExtra".into(), test_value_long.clone());
// That should top us right up to the limit. Now for going over.
event.record_sync(&glean, 0, HashMap::new(), 0);
assert!(
test_get_num_recorded_errors(&glean, &event_meta.into(), ErrorType::InvalidOverflow)
.is_err()
);
assert_eq!(501, event.get_value(&glean, store_name).unwrap().len());
}
/// Ensure that events from multiple runs serialize properly. /// /// Records an event once each in two separate sessions, /// ensuring they both show (and an inserted `glean.restarted` event) /// in the serialized result. #[test] fn ensure_custom_ping_events_from_multiple_runs_work() { let (mut tempdir, _) = tempdir();
{ let (glean, dir) = new_glean(Some(tempdir)); // We don't need a full init. Just to deal with on-disk events:
assert!(!glean
.event_storage()
.flush_pending_events_on_startup(&glean, false));
tempdir = dir;
{ let (glean, _dir) = new_glean(Some(tempdir)); // We don't need a full init. Just to deal with on-disk events:
assert!(!glean
.event_storage()
.flush_pending_events_on_startup(&glean, false));
// Gotta use get_timestamp_ms or this event won't happen "after" the injected // glean.restarted event from `flush_pending_events_on_startup`.
event.record_sync(&glean, get_timestamp_ms(), HashMap::new(), 0);
/// Ensure events in an unregistered, non-"events" (ie Custom) ping are trimmed on a subsequent init /// when we pass `true ` for `trim_data_to_registered_pings` in `on_ready_to_submit_pings`. #[test] fn event_storage_trimming() { let (mut tempdir, _) = tempdir();
let store_name = "store-name"; let store_name_2 = "store-name-2"; let event = EventMetric::new(
CommonMetricData {
name: "name".into(),
category: "category".into(),
send_in_pings: vec![store_name.into(), store_name_2.into()],
lifetime: Lifetime::Ping,
..Default::default()
},
vec![],
);
let new_ping = |glean: &mut Glean, ping: &str| { // In Rust, pings are registered via construction. // But that's done asynchronously, so we do it synchronously here:
glean.register_ping_type(&PingType::new(
ping.to_string(), true, false, true, true, true,
vec![],
vec![], true,
));
};
// First, register both pings, so that we can record the event in the two pings.
{ let (mut glean, dir) = new_glean(Some(tempdir));
tempdir = dir;
assert_eq!(1, event.get_value(&glean, store_name).unwrap().len());
assert_eq!(1, event.get_value(&glean, store_name_2).unwrap().len());
} // Second, construct (but don't init) Glean again. // Register exactly one of the two pings. // Then process the part of init that does the trimming (`on_ready_to_submit_pings`).
{ let (mut glean, _dir) = new_glean(Some(tempdir));
new_ping(&mut glean, store_name);
let glean_timestamp = json[0]["extra"]["glean_timestamp"]
.as_str()
.expect("glean_timestamp should exist"); let glean_timestamp: i64 = glean_timestamp
.parse()
.expect("glean_timestamp should be an integer");
assert_eq!(12345, glean_timestamp);
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-06-18)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.