1 // This Source Code Form is subject to the terms of the Mozilla Public
2 // License, v. 2.0. If a copy of the MPL was not distributed with this
3 // file, You can obtain one at https://mozilla.org/MPL/2.0/.
4
5 mod common;
6 use crate::common::*;
7
8 use serde_json::json;
9
10 use glean_core::metrics::*;
11 use glean_core::storage::StorageManager;
12 use glean_core::{CommonMetricData, Lifetime};
13
14 #[test]
uuid_is_generated_and_stored()15 fn uuid_is_generated_and_stored() {
16 let (mut glean, _t) = new_glean(None);
17
18 let uuid: UuidMetric = UuidMetric::new(CommonMetricData {
19 name: "uuid".into(),
20 category: "local".into(),
21 send_in_pings: vec!["core".into()],
22 ..Default::default()
23 });
24
25 uuid.generate_and_set(&glean);
26 let snapshot = glean.snapshot("core", false);
27 assert!(
28 snapshot.contains(r#""local.uuid": ""#),
29 format!("Snapshot 1: {}", snapshot)
30 );
31
32 uuid.generate_and_set(&glean);
33 let snapshot = glean.snapshot("core", false);
34 assert!(
35 snapshot.contains(r#""local.uuid": ""#),
36 format!("Snapshot 2: {}", snapshot)
37 );
38 }
39
40 #[test]
uuid_serializer_should_correctly_serialize_uuids()41 fn uuid_serializer_should_correctly_serialize_uuids() {
42 let value = uuid::Uuid::new_v4();
43
44 let (mut tempdir, _) = tempdir();
45
46 {
47 // We give tempdir to the `new_glean` function...
48 let (glean, dir) = new_glean(Some(tempdir));
49 // And then we get it back once that function returns.
50 tempdir = dir;
51
52 let metric = UuidMetric::new(CommonMetricData {
53 name: "uuid_metric".into(),
54 category: "telemetry".into(),
55 send_in_pings: vec!["store1".into()],
56 disabled: false,
57 lifetime: Lifetime::User,
58 ..Default::default()
59 });
60
61 metric.set(&glean, value);
62
63 let snapshot = StorageManager
64 .snapshot_as_json(glean.storage(), "store1", true)
65 .unwrap();
66 assert_eq!(
67 json!({"uuid": {"telemetry.uuid_metric": value.to_string()}}),
68 snapshot
69 );
70 }
71
72 // Make a new Glean instance here, which should force reloading of the data from disk
73 // so we can ensure it persisted, because it has User lifetime
74 {
75 let (glean, _) = new_glean(Some(tempdir));
76 let snapshot = StorageManager
77 .snapshot_as_json(glean.storage(), "store1", true)
78 .unwrap();
79 assert_eq!(
80 json!({"uuid": {"telemetry.uuid_metric": value.to_string()}}),
81 snapshot
82 );
83 }
84 }
85
86 #[test]
set_properly_sets_the_value_in_all_stores()87 fn set_properly_sets_the_value_in_all_stores() {
88 let (glean, _t) = new_glean(None);
89 let store_names: Vec<String> = vec!["store1".into(), "store2".into()];
90 let value = uuid::Uuid::new_v4();
91
92 let metric = UuidMetric::new(CommonMetricData {
93 name: "uuid_metric".into(),
94 category: "telemetry".into(),
95 send_in_pings: store_names.clone(),
96 disabled: false,
97 lifetime: Lifetime::Ping,
98 ..Default::default()
99 });
100
101 metric.set(&glean, value);
102
103 // Check that the data was correctly set in each store.
104 for store_name in store_names {
105 let snapshot = StorageManager
106 .snapshot_as_json(glean.storage(), &store_name, true)
107 .unwrap();
108
109 assert_eq!(
110 json!({"uuid": {"telemetry.uuid_metric": value.to_string()}}),
111 snapshot
112 );
113 }
114 }
115