in glean-core/src/metrics/url.rs [255:316]
fn url_validation_works_and_records_errors() {
let (glean, _t) = new_glean(None);
let metric = UrlMetric::new(CommonMetricData {
name: "url_metric".into(),
category: "test".into(),
send_in_pings: vec!["store1".into()],
lifetime: Lifetime::Application,
disabled: false,
dynamic_label: None,
});
let incorrects = vec![
"",
// Scheme may only start with upper or lowercase ASCII alpha[^1] character.
// [1]: https://infra.spec.whatwg.org/#ascii-alpha
"1glean://test",
"-glean://test",
// Scheme may only have ASCII alphanumeric characters or the `-`, `.`, `+` characters.
"шеллы://test",
"g!lean://test",
"g=lean://test",
// Scheme must be followed by `:` character.
"glean//test",
];
let corrects = vec![
// The minimum URL
"g:",
// Empty body is fine
"glean://",
// "//" is actually not even necessary
"glean:",
"glean:test",
"glean:test.com",
// Scheme may only have ASCII alphanumeric characters or the `-`, `.`, `+` characters.
"g-lean://test",
"g+lean://test",
"g.lean://test",
// Query parameters are fine
"glean://test?hello=world",
// Finally, some actual real world URLs
"https://infra.spec.whatwg.org/#ascii-alpha",
"https://infra.spec.whatwg.org/#ascii-alpha?test=for-glean",
];
for incorrect in incorrects.clone().into_iter() {
metric.set_sync(&glean, incorrect);
assert!(metric.get_value(&glean, "store1").is_none());
}
assert_eq!(
incorrects.len(),
test_get_num_recorded_errors(&glean, metric.meta(), ErrorType::InvalidValue).unwrap()
as usize
);
for correct in corrects.into_iter() {
metric.set_sync(&glean, correct);
assert_eq!(metric.get_value(&glean, "store1").unwrap(), correct);
}
}