Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
1 /* Any copyright is dedicated to the Public Domain.
2 * http://creativecommons.org/publicdomain/zero/1.0/ */
4 "use strict";
6 const {utils: Cu} = Components;
8 Cu.import("resource://gre/modules/Metrics.jsm");
9 Cu.import("resource://gre/modules/Preferences.jsm");
10 Cu.import("resource://gre/modules/Task.jsm");
11 Cu.import("resource://testing-common/services/metrics/mocks.jsm");
14 const MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000;
17 function getProvider(storageName) {
18 return Task.spawn(function () {
19 let provider = new DummyProvider();
20 let storage = yield Metrics.Storage(storageName);
22 yield provider.init(storage);
24 throw new Task.Result(provider);
25 });
26 }
29 function run_test() {
30 run_next_test();
31 };
33 add_test(function test_constructor() {
34 let failed = false;
35 try {
36 new Metrics.Provider();
37 } catch(ex) {
38 do_check_true(ex.message.startsWith("Provider must define a name"));
39 failed = true;
40 }
41 finally {
42 do_check_true(failed);
43 }
45 run_next_test();
46 });
48 add_task(function test_init() {
49 let provider = new DummyProvider();
50 let storage = yield Metrics.Storage("init");
52 yield provider.init(storage);
54 let m = provider.getMeasurement("DummyMeasurement", 1);
55 do_check_true(m instanceof Metrics.Measurement);
56 do_check_eq(m.id, 1);
57 do_check_eq(Object.keys(m._fields).length, 7);
58 do_check_true(m.hasField("daily-counter"));
59 do_check_false(m.hasField("does-not-exist"));
61 yield storage.close();
62 });
64 add_task(function test_default_collectors() {
65 let provider = new DummyProvider();
66 let storage = yield Metrics.Storage("default_collectors");
67 yield provider.init(storage);
69 for (let property in Metrics.Provider.prototype) {
70 if (!property.startsWith("collect")) {
71 continue;
72 }
74 let result = provider[property]();
75 do_check_neq(result, null);
76 do_check_eq(typeof(result.then), "function");
77 }
79 yield storage.close();
80 });
82 add_task(function test_measurement_storage_basic() {
83 let provider = yield getProvider("measurement_storage_basic");
84 let m = provider.getMeasurement("DummyMeasurement", 1);
86 let now = new Date();
87 let yesterday = new Date(now.getTime() - MILLISECONDS_PER_DAY);
89 // Daily counter.
90 let counterID = m.fieldID("daily-counter");
91 yield m.incrementDailyCounter("daily-counter", now);
92 yield m.incrementDailyCounter("daily-counter", now);
93 yield m.incrementDailyCounter("daily-counter", yesterday);
94 let count = yield provider.storage.getDailyCounterCountFromFieldID(counterID, now);
95 do_check_eq(count, 2);
97 count = yield provider.storage.getDailyCounterCountFromFieldID(counterID, yesterday);
98 do_check_eq(count, 1);
100 yield m.incrementDailyCounter("daily-counter", now, 4);
101 count = yield provider.storage.getDailyCounterCountFromFieldID(counterID, now);
102 do_check_eq(count, 6);
104 // Daily discrete numeric.
105 let dailyDiscreteNumericID = m.fieldID("daily-discrete-numeric");
106 yield m.addDailyDiscreteNumeric("daily-discrete-numeric", 5, now);
107 yield m.addDailyDiscreteNumeric("daily-discrete-numeric", 6, now);
108 yield m.addDailyDiscreteNumeric("daily-discrete-numeric", 7, yesterday);
110 let values = yield provider.storage.getDailyDiscreteNumericFromFieldID(
111 dailyDiscreteNumericID, now);
113 do_check_eq(values.size, 1);
114 do_check_true(values.hasDay(now));
115 let actual = values.getDay(now);
116 do_check_eq(actual.length, 2);
117 do_check_eq(actual[0], 5);
118 do_check_eq(actual[1], 6);
120 values = yield provider.storage.getDailyDiscreteNumericFromFieldID(
121 dailyDiscreteNumericID, yesterday);
123 do_check_eq(values.size, 1);
124 do_check_true(values.hasDay(yesterday));
125 do_check_eq(values.getDay(yesterday)[0], 7);
127 // Daily discrete text.
128 let dailyDiscreteTextID = m.fieldID("daily-discrete-text");
129 yield m.addDailyDiscreteText("daily-discrete-text", "foo", now);
130 yield m.addDailyDiscreteText("daily-discrete-text", "bar", now);
131 yield m.addDailyDiscreteText("daily-discrete-text", "biz", yesterday);
133 values = yield provider.storage.getDailyDiscreteTextFromFieldID(
134 dailyDiscreteTextID, now);
136 do_check_eq(values.size, 1);
137 do_check_true(values.hasDay(now));
138 actual = values.getDay(now);
139 do_check_eq(actual.length, 2);
140 do_check_eq(actual[0], "foo");
141 do_check_eq(actual[1], "bar");
143 values = yield provider.storage.getDailyDiscreteTextFromFieldID(
144 dailyDiscreteTextID, yesterday);
145 do_check_true(values.hasDay(yesterday));
146 do_check_eq(values.getDay(yesterday)[0], "biz");
148 // Daily last numeric.
149 let lastDailyNumericID = m.fieldID("daily-last-numeric");
150 yield m.setDailyLastNumeric("daily-last-numeric", 5, now);
151 yield m.setDailyLastNumeric("daily-last-numeric", 6, yesterday);
153 let result = yield provider.storage.getDailyLastNumericFromFieldID(
154 lastDailyNumericID, now);
155 do_check_eq(result.size, 1);
156 do_check_true(result.hasDay(now));
157 do_check_eq(result.getDay(now), 5);
159 result = yield provider.storage.getDailyLastNumericFromFieldID(
160 lastDailyNumericID, yesterday);
161 do_check_true(result.hasDay(yesterday));
162 do_check_eq(result.getDay(yesterday), 6);
164 yield m.setDailyLastNumeric("daily-last-numeric", 7, now);
165 result = yield provider.storage.getDailyLastNumericFromFieldID(
166 lastDailyNumericID, now);
167 do_check_eq(result.getDay(now), 7);
169 // Daily last text.
170 let lastDailyTextID = m.fieldID("daily-last-text");
171 yield m.setDailyLastText("daily-last-text", "foo", now);
172 yield m.setDailyLastText("daily-last-text", "bar", yesterday);
174 result = yield provider.storage.getDailyLastTextFromFieldID(
175 lastDailyTextID, now);
176 do_check_eq(result.size, 1);
177 do_check_true(result.hasDay(now));
178 do_check_eq(result.getDay(now), "foo");
180 result = yield provider.storage.getDailyLastTextFromFieldID(
181 lastDailyTextID, yesterday);
182 do_check_true(result.hasDay(yesterday));
183 do_check_eq(result.getDay(yesterday), "bar");
185 yield m.setDailyLastText("daily-last-text", "biz", now);
186 result = yield provider.storage.getDailyLastTextFromFieldID(
187 lastDailyTextID, now);
188 do_check_eq(result.getDay(now), "biz");
190 // Last numeric.
191 let lastNumericID = m.fieldID("last-numeric");
192 yield m.setLastNumeric("last-numeric", 1, now);
193 result = yield provider.storage.getLastNumericFromFieldID(lastNumericID);
194 do_check_eq(result[1], 1);
195 do_check_true(result[0].getTime() < now.getTime());
196 do_check_true(result[0].getTime() > yesterday.getTime());
198 yield m.setLastNumeric("last-numeric", 2, now);
199 result = yield provider.storage.getLastNumericFromFieldID(lastNumericID);
200 do_check_eq(result[1], 2);
202 // Last text.
203 let lastTextID = m.fieldID("last-text");
204 yield m.setLastText("last-text", "foo", now);
205 result = yield provider.storage.getLastTextFromFieldID(lastTextID);
206 do_check_eq(result[1], "foo");
207 do_check_true(result[0].getTime() < now.getTime());
208 do_check_true(result[0].getTime() > yesterday.getTime());
210 yield m.setLastText("last-text", "bar", now);
211 result = yield provider.storage.getLastTextFromFieldID(lastTextID);
212 do_check_eq(result[1], "bar");
214 yield provider.storage.close();
215 });
217 add_task(function test_serialize_json_default() {
218 let provider = yield getProvider("serialize_json_default");
220 let now = new Date();
221 let yesterday = new Date(now.getTime() - MILLISECONDS_PER_DAY);
223 let m = provider.getMeasurement("DummyMeasurement", 1);
225 m.incrementDailyCounter("daily-counter", now);
226 m.incrementDailyCounter("daily-counter", now);
227 m.incrementDailyCounter("daily-counter", yesterday);
229 m.addDailyDiscreteNumeric("daily-discrete-numeric", 1, now);
230 m.addDailyDiscreteNumeric("daily-discrete-numeric", 2, now);
231 m.addDailyDiscreteNumeric("daily-discrete-numeric", 3, yesterday);
233 m.addDailyDiscreteText("daily-discrete-text", "foo", now);
234 m.addDailyDiscreteText("daily-discrete-text", "bar", now);
235 m.addDailyDiscreteText("daily-discrete-text", "baz", yesterday);
237 m.setDailyLastNumeric("daily-last-numeric", 4, now);
238 m.setDailyLastNumeric("daily-last-numeric", 5, yesterday);
240 m.setDailyLastText("daily-last-text", "apple", now);
241 m.setDailyLastText("daily-last-text", "orange", yesterday);
243 m.setLastNumeric("last-numeric", 6, now);
244 yield m.setLastText("last-text", "hello", now);
246 let data = yield provider.storage.getMeasurementValues(m.id);
248 let serializer = m.serializer(m.SERIALIZE_JSON);
249 let formatted = serializer.singular(data.singular);
251 do_check_eq(Object.keys(formatted).length, 3); // Our keys + _v.
252 do_check_true("last-numeric" in formatted);
253 do_check_true("last-text" in formatted);
254 do_check_eq(formatted["last-numeric"], 6);
255 do_check_eq(formatted["last-text"], "hello");
256 do_check_eq(formatted["_v"], 1);
258 formatted = serializer.daily(data.days.getDay(now));
259 do_check_eq(Object.keys(formatted).length, 6); // Our keys + _v.
260 do_check_eq(formatted["daily-counter"], 2);
261 do_check_eq(formatted["_v"], 1);
263 do_check_true(Array.isArray(formatted["daily-discrete-numeric"]));
264 do_check_eq(formatted["daily-discrete-numeric"].length, 2);
265 do_check_eq(formatted["daily-discrete-numeric"][0], 1);
266 do_check_eq(formatted["daily-discrete-numeric"][1], 2);
268 do_check_true(Array.isArray(formatted["daily-discrete-text"]));
269 do_check_eq(formatted["daily-discrete-text"].length, 2);
270 do_check_eq(formatted["daily-discrete-text"][0], "foo");
271 do_check_eq(formatted["daily-discrete-text"][1], "bar");
273 do_check_eq(formatted["daily-last-numeric"], 4);
274 do_check_eq(formatted["daily-last-text"], "apple");
276 formatted = serializer.daily(data.days.getDay(yesterday));
277 do_check_eq(formatted["daily-last-numeric"], 5);
278 do_check_eq(formatted["daily-last-text"], "orange");
280 // Now let's turn off a field so that it's present in the DB
281 // but not present in the output.
282 let called = false;
283 let excluded = "daily-last-numeric";
284 Object.defineProperty(m, "shouldIncludeField", {
285 value: function fakeShouldIncludeField(field) {
286 called = true;
287 return field != excluded;
288 },
289 });
291 let limited = serializer.daily(data.days.getDay(yesterday));
292 do_check_true(called);
293 do_check_false(excluded in limited);
294 do_check_eq(formatted["daily-last-text"], "orange");
296 yield provider.storage.close();
297 });