1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/services/metrics/tests/xpcshell/test_metrics_provider.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,297 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + * http://creativecommons.org/publicdomain/zero/1.0/ */ 1.6 + 1.7 +"use strict"; 1.8 + 1.9 +const {utils: Cu} = Components; 1.10 + 1.11 +Cu.import("resource://gre/modules/Metrics.jsm"); 1.12 +Cu.import("resource://gre/modules/Preferences.jsm"); 1.13 +Cu.import("resource://gre/modules/Task.jsm"); 1.14 +Cu.import("resource://testing-common/services/metrics/mocks.jsm"); 1.15 + 1.16 + 1.17 +const MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000; 1.18 + 1.19 + 1.20 +function getProvider(storageName) { 1.21 + return Task.spawn(function () { 1.22 + let provider = new DummyProvider(); 1.23 + let storage = yield Metrics.Storage(storageName); 1.24 + 1.25 + yield provider.init(storage); 1.26 + 1.27 + throw new Task.Result(provider); 1.28 + }); 1.29 +} 1.30 + 1.31 + 1.32 +function run_test() { 1.33 + run_next_test(); 1.34 +}; 1.35 + 1.36 +add_test(function test_constructor() { 1.37 + let failed = false; 1.38 + try { 1.39 + new Metrics.Provider(); 1.40 + } catch(ex) { 1.41 + do_check_true(ex.message.startsWith("Provider must define a name")); 1.42 + failed = true; 1.43 + } 1.44 + finally { 1.45 + do_check_true(failed); 1.46 + } 1.47 + 1.48 + run_next_test(); 1.49 +}); 1.50 + 1.51 +add_task(function test_init() { 1.52 + let provider = new DummyProvider(); 1.53 + let storage = yield Metrics.Storage("init"); 1.54 + 1.55 + yield provider.init(storage); 1.56 + 1.57 + let m = provider.getMeasurement("DummyMeasurement", 1); 1.58 + do_check_true(m instanceof Metrics.Measurement); 1.59 + do_check_eq(m.id, 1); 1.60 + do_check_eq(Object.keys(m._fields).length, 7); 1.61 + do_check_true(m.hasField("daily-counter")); 1.62 + do_check_false(m.hasField("does-not-exist")); 1.63 + 1.64 + yield storage.close(); 1.65 +}); 1.66 + 1.67 +add_task(function test_default_collectors() { 1.68 + let provider = new DummyProvider(); 1.69 + let storage = yield Metrics.Storage("default_collectors"); 1.70 + yield provider.init(storage); 1.71 + 1.72 + for (let property in Metrics.Provider.prototype) { 1.73 + if (!property.startsWith("collect")) { 1.74 + continue; 1.75 + } 1.76 + 1.77 + let result = provider[property](); 1.78 + do_check_neq(result, null); 1.79 + do_check_eq(typeof(result.then), "function"); 1.80 + } 1.81 + 1.82 + yield storage.close(); 1.83 +}); 1.84 + 1.85 +add_task(function test_measurement_storage_basic() { 1.86 + let provider = yield getProvider("measurement_storage_basic"); 1.87 + let m = provider.getMeasurement("DummyMeasurement", 1); 1.88 + 1.89 + let now = new Date(); 1.90 + let yesterday = new Date(now.getTime() - MILLISECONDS_PER_DAY); 1.91 + 1.92 + // Daily counter. 1.93 + let counterID = m.fieldID("daily-counter"); 1.94 + yield m.incrementDailyCounter("daily-counter", now); 1.95 + yield m.incrementDailyCounter("daily-counter", now); 1.96 + yield m.incrementDailyCounter("daily-counter", yesterday); 1.97 + let count = yield provider.storage.getDailyCounterCountFromFieldID(counterID, now); 1.98 + do_check_eq(count, 2); 1.99 + 1.100 + count = yield provider.storage.getDailyCounterCountFromFieldID(counterID, yesterday); 1.101 + do_check_eq(count, 1); 1.102 + 1.103 + yield m.incrementDailyCounter("daily-counter", now, 4); 1.104 + count = yield provider.storage.getDailyCounterCountFromFieldID(counterID, now); 1.105 + do_check_eq(count, 6); 1.106 + 1.107 + // Daily discrete numeric. 1.108 + let dailyDiscreteNumericID = m.fieldID("daily-discrete-numeric"); 1.109 + yield m.addDailyDiscreteNumeric("daily-discrete-numeric", 5, now); 1.110 + yield m.addDailyDiscreteNumeric("daily-discrete-numeric", 6, now); 1.111 + yield m.addDailyDiscreteNumeric("daily-discrete-numeric", 7, yesterday); 1.112 + 1.113 + let values = yield provider.storage.getDailyDiscreteNumericFromFieldID( 1.114 + dailyDiscreteNumericID, now); 1.115 + 1.116 + do_check_eq(values.size, 1); 1.117 + do_check_true(values.hasDay(now)); 1.118 + let actual = values.getDay(now); 1.119 + do_check_eq(actual.length, 2); 1.120 + do_check_eq(actual[0], 5); 1.121 + do_check_eq(actual[1], 6); 1.122 + 1.123 + values = yield provider.storage.getDailyDiscreteNumericFromFieldID( 1.124 + dailyDiscreteNumericID, yesterday); 1.125 + 1.126 + do_check_eq(values.size, 1); 1.127 + do_check_true(values.hasDay(yesterday)); 1.128 + do_check_eq(values.getDay(yesterday)[0], 7); 1.129 + 1.130 + // Daily discrete text. 1.131 + let dailyDiscreteTextID = m.fieldID("daily-discrete-text"); 1.132 + yield m.addDailyDiscreteText("daily-discrete-text", "foo", now); 1.133 + yield m.addDailyDiscreteText("daily-discrete-text", "bar", now); 1.134 + yield m.addDailyDiscreteText("daily-discrete-text", "biz", yesterday); 1.135 + 1.136 + values = yield provider.storage.getDailyDiscreteTextFromFieldID( 1.137 + dailyDiscreteTextID, now); 1.138 + 1.139 + do_check_eq(values.size, 1); 1.140 + do_check_true(values.hasDay(now)); 1.141 + actual = values.getDay(now); 1.142 + do_check_eq(actual.length, 2); 1.143 + do_check_eq(actual[0], "foo"); 1.144 + do_check_eq(actual[1], "bar"); 1.145 + 1.146 + values = yield provider.storage.getDailyDiscreteTextFromFieldID( 1.147 + dailyDiscreteTextID, yesterday); 1.148 + do_check_true(values.hasDay(yesterday)); 1.149 + do_check_eq(values.getDay(yesterday)[0], "biz"); 1.150 + 1.151 + // Daily last numeric. 1.152 + let lastDailyNumericID = m.fieldID("daily-last-numeric"); 1.153 + yield m.setDailyLastNumeric("daily-last-numeric", 5, now); 1.154 + yield m.setDailyLastNumeric("daily-last-numeric", 6, yesterday); 1.155 + 1.156 + let result = yield provider.storage.getDailyLastNumericFromFieldID( 1.157 + lastDailyNumericID, now); 1.158 + do_check_eq(result.size, 1); 1.159 + do_check_true(result.hasDay(now)); 1.160 + do_check_eq(result.getDay(now), 5); 1.161 + 1.162 + result = yield provider.storage.getDailyLastNumericFromFieldID( 1.163 + lastDailyNumericID, yesterday); 1.164 + do_check_true(result.hasDay(yesterday)); 1.165 + do_check_eq(result.getDay(yesterday), 6); 1.166 + 1.167 + yield m.setDailyLastNumeric("daily-last-numeric", 7, now); 1.168 + result = yield provider.storage.getDailyLastNumericFromFieldID( 1.169 + lastDailyNumericID, now); 1.170 + do_check_eq(result.getDay(now), 7); 1.171 + 1.172 + // Daily last text. 1.173 + let lastDailyTextID = m.fieldID("daily-last-text"); 1.174 + yield m.setDailyLastText("daily-last-text", "foo", now); 1.175 + yield m.setDailyLastText("daily-last-text", "bar", yesterday); 1.176 + 1.177 + result = yield provider.storage.getDailyLastTextFromFieldID( 1.178 + lastDailyTextID, now); 1.179 + do_check_eq(result.size, 1); 1.180 + do_check_true(result.hasDay(now)); 1.181 + do_check_eq(result.getDay(now), "foo"); 1.182 + 1.183 + result = yield provider.storage.getDailyLastTextFromFieldID( 1.184 + lastDailyTextID, yesterday); 1.185 + do_check_true(result.hasDay(yesterday)); 1.186 + do_check_eq(result.getDay(yesterday), "bar"); 1.187 + 1.188 + yield m.setDailyLastText("daily-last-text", "biz", now); 1.189 + result = yield provider.storage.getDailyLastTextFromFieldID( 1.190 + lastDailyTextID, now); 1.191 + do_check_eq(result.getDay(now), "biz"); 1.192 + 1.193 + // Last numeric. 1.194 + let lastNumericID = m.fieldID("last-numeric"); 1.195 + yield m.setLastNumeric("last-numeric", 1, now); 1.196 + result = yield provider.storage.getLastNumericFromFieldID(lastNumericID); 1.197 + do_check_eq(result[1], 1); 1.198 + do_check_true(result[0].getTime() < now.getTime()); 1.199 + do_check_true(result[0].getTime() > yesterday.getTime()); 1.200 + 1.201 + yield m.setLastNumeric("last-numeric", 2, now); 1.202 + result = yield provider.storage.getLastNumericFromFieldID(lastNumericID); 1.203 + do_check_eq(result[1], 2); 1.204 + 1.205 + // Last text. 1.206 + let lastTextID = m.fieldID("last-text"); 1.207 + yield m.setLastText("last-text", "foo", now); 1.208 + result = yield provider.storage.getLastTextFromFieldID(lastTextID); 1.209 + do_check_eq(result[1], "foo"); 1.210 + do_check_true(result[0].getTime() < now.getTime()); 1.211 + do_check_true(result[0].getTime() > yesterday.getTime()); 1.212 + 1.213 + yield m.setLastText("last-text", "bar", now); 1.214 + result = yield provider.storage.getLastTextFromFieldID(lastTextID); 1.215 + do_check_eq(result[1], "bar"); 1.216 + 1.217 + yield provider.storage.close(); 1.218 +}); 1.219 + 1.220 +add_task(function test_serialize_json_default() { 1.221 + let provider = yield getProvider("serialize_json_default"); 1.222 + 1.223 + let now = new Date(); 1.224 + let yesterday = new Date(now.getTime() - MILLISECONDS_PER_DAY); 1.225 + 1.226 + let m = provider.getMeasurement("DummyMeasurement", 1); 1.227 + 1.228 + m.incrementDailyCounter("daily-counter", now); 1.229 + m.incrementDailyCounter("daily-counter", now); 1.230 + m.incrementDailyCounter("daily-counter", yesterday); 1.231 + 1.232 + m.addDailyDiscreteNumeric("daily-discrete-numeric", 1, now); 1.233 + m.addDailyDiscreteNumeric("daily-discrete-numeric", 2, now); 1.234 + m.addDailyDiscreteNumeric("daily-discrete-numeric", 3, yesterday); 1.235 + 1.236 + m.addDailyDiscreteText("daily-discrete-text", "foo", now); 1.237 + m.addDailyDiscreteText("daily-discrete-text", "bar", now); 1.238 + m.addDailyDiscreteText("daily-discrete-text", "baz", yesterday); 1.239 + 1.240 + m.setDailyLastNumeric("daily-last-numeric", 4, now); 1.241 + m.setDailyLastNumeric("daily-last-numeric", 5, yesterday); 1.242 + 1.243 + m.setDailyLastText("daily-last-text", "apple", now); 1.244 + m.setDailyLastText("daily-last-text", "orange", yesterday); 1.245 + 1.246 + m.setLastNumeric("last-numeric", 6, now); 1.247 + yield m.setLastText("last-text", "hello", now); 1.248 + 1.249 + let data = yield provider.storage.getMeasurementValues(m.id); 1.250 + 1.251 + let serializer = m.serializer(m.SERIALIZE_JSON); 1.252 + let formatted = serializer.singular(data.singular); 1.253 + 1.254 + do_check_eq(Object.keys(formatted).length, 3); // Our keys + _v. 1.255 + do_check_true("last-numeric" in formatted); 1.256 + do_check_true("last-text" in formatted); 1.257 + do_check_eq(formatted["last-numeric"], 6); 1.258 + do_check_eq(formatted["last-text"], "hello"); 1.259 + do_check_eq(formatted["_v"], 1); 1.260 + 1.261 + formatted = serializer.daily(data.days.getDay(now)); 1.262 + do_check_eq(Object.keys(formatted).length, 6); // Our keys + _v. 1.263 + do_check_eq(formatted["daily-counter"], 2); 1.264 + do_check_eq(formatted["_v"], 1); 1.265 + 1.266 + do_check_true(Array.isArray(formatted["daily-discrete-numeric"])); 1.267 + do_check_eq(formatted["daily-discrete-numeric"].length, 2); 1.268 + do_check_eq(formatted["daily-discrete-numeric"][0], 1); 1.269 + do_check_eq(formatted["daily-discrete-numeric"][1], 2); 1.270 + 1.271 + do_check_true(Array.isArray(formatted["daily-discrete-text"])); 1.272 + do_check_eq(formatted["daily-discrete-text"].length, 2); 1.273 + do_check_eq(formatted["daily-discrete-text"][0], "foo"); 1.274 + do_check_eq(formatted["daily-discrete-text"][1], "bar"); 1.275 + 1.276 + do_check_eq(formatted["daily-last-numeric"], 4); 1.277 + do_check_eq(formatted["daily-last-text"], "apple"); 1.278 + 1.279 + formatted = serializer.daily(data.days.getDay(yesterday)); 1.280 + do_check_eq(formatted["daily-last-numeric"], 5); 1.281 + do_check_eq(formatted["daily-last-text"], "orange"); 1.282 + 1.283 + // Now let's turn off a field so that it's present in the DB 1.284 + // but not present in the output. 1.285 + let called = false; 1.286 + let excluded = "daily-last-numeric"; 1.287 + Object.defineProperty(m, "shouldIncludeField", { 1.288 + value: function fakeShouldIncludeField(field) { 1.289 + called = true; 1.290 + return field != excluded; 1.291 + }, 1.292 + }); 1.293 + 1.294 + let limited = serializer.daily(data.days.getDay(yesterday)); 1.295 + do_check_true(called); 1.296 + do_check_false(excluded in limited); 1.297 + do_check_eq(formatted["daily-last-text"], "orange"); 1.298 + 1.299 + yield provider.storage.close(); 1.300 +});