services/metrics/tests/xpcshell/test_metrics_storage.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

michael@0 1 /* Any copyright is dedicated to the Public Domain.
michael@0 2 * http://creativecommons.org/publicdomain/zero/1.0/ */
michael@0 3
michael@0 4 "use strict";
michael@0 5
michael@0 6 const {utils: Cu} = Components;
michael@0 7
michael@0 8 Cu.import("resource://gre/modules/Promise.jsm");
michael@0 9 Cu.import("resource://gre/modules/Metrics.jsm");
michael@0 10 Cu.import("resource://services-common/utils.js");
michael@0 11
michael@0 12
michael@0 13 const MILLISECONDS_PER_DAY = 24 * 60 * 60 * 1000;
michael@0 14
michael@0 15
michael@0 16 function run_test() {
michael@0 17 run_next_test();
michael@0 18 }
michael@0 19
michael@0 20 add_test(function test_days_date_conversion() {
michael@0 21 let toDays = Metrics.dateToDays;
michael@0 22 let toDate = Metrics.daysToDate;
michael@0 23
michael@0 24 let d = new Date(0);
michael@0 25 do_check_eq(toDays(d), 0);
michael@0 26
michael@0 27 d = new Date(MILLISECONDS_PER_DAY);
michael@0 28 do_check_eq(toDays(d), 1);
michael@0 29
michael@0 30 d = new Date(MILLISECONDS_PER_DAY - 1);
michael@0 31 do_check_eq(toDays(d), 0);
michael@0 32
michael@0 33 d = new Date("1970-12-31T23:59:59.999Z");
michael@0 34 do_check_eq(toDays(d), 364);
michael@0 35
michael@0 36 d = new Date("1971-01-01T00:00:00Z");
michael@0 37 do_check_eq(toDays(d), 365);
michael@0 38
michael@0 39 d = toDate(0);
michael@0 40 do_check_eq(d.getTime(), 0);
michael@0 41
michael@0 42 d = toDate(1);
michael@0 43 do_check_eq(d.getTime(), MILLISECONDS_PER_DAY);
michael@0 44
michael@0 45 d = toDate(365);
michael@0 46 do_check_eq(d.getUTCFullYear(), 1971);
michael@0 47 do_check_eq(d.getUTCMonth(), 0);
michael@0 48 do_check_eq(d.getUTCDate(), 1);
michael@0 49 do_check_eq(d.getUTCHours(), 0);
michael@0 50 do_check_eq(d.getUTCMinutes(), 0);
michael@0 51 do_check_eq(d.getUTCSeconds(), 0);
michael@0 52 do_check_eq(d.getUTCMilliseconds(), 0);
michael@0 53
michael@0 54 run_next_test();
michael@0 55 });
michael@0 56
michael@0 57 add_task(function test_get_sqlite_backend() {
michael@0 58 let backend = yield Metrics.Storage("get_sqlite_backend.sqlite");
michael@0 59
michael@0 60 do_check_neq(backend._connection, null);
michael@0 61
michael@0 62 // Ensure WAL and auto checkpoint are enabled.
michael@0 63 do_check_neq(backend._enabledWALCheckpointPages, null);
michael@0 64 let rows = yield backend._connection.execute("PRAGMA journal_mode");
michael@0 65 do_check_eq(rows[0].getResultByIndex(0), "wal");
michael@0 66 rows = yield backend._connection.execute("PRAGMA wal_autocheckpoint");
michael@0 67 do_check_eq(rows[0].getResultByIndex(0), backend._enabledWALCheckpointPages);
michael@0 68
michael@0 69 yield backend.close();
michael@0 70 do_check_null(backend._connection);
michael@0 71 });
michael@0 72
michael@0 73 add_task(function test_reconnect() {
michael@0 74 let backend = yield Metrics.Storage("reconnect");
michael@0 75 yield backend.close();
michael@0 76
michael@0 77 let backend2 = yield Metrics.Storage("reconnect");
michael@0 78 yield backend2.close();
michael@0 79 });
michael@0 80
michael@0 81 add_task(function test_future_schema_errors() {
michael@0 82 let backend = yield Metrics.Storage("future_schema_errors");
michael@0 83 yield backend._connection.setSchemaVersion(2);
michael@0 84 yield backend.close();
michael@0 85
michael@0 86 let backend2;
michael@0 87 let failed = false;
michael@0 88 try {
michael@0 89 backend2 = yield Metrics.Storage("future_schema_errors");
michael@0 90 } catch (ex) {
michael@0 91 failed = true;
michael@0 92 do_check_true(ex.message.startsWith("Unknown database schema"));
michael@0 93 }
michael@0 94
michael@0 95 do_check_null(backend2);
michael@0 96 do_check_true(failed);
michael@0 97 });
michael@0 98
michael@0 99 add_task(function test_checkpoint_apis() {
michael@0 100 let backend = yield Metrics.Storage("checkpoint_apis");
michael@0 101 let c = backend._connection;
michael@0 102 let count = c._statementCounter;
michael@0 103
michael@0 104 yield backend.setAutoCheckpoint(0);
michael@0 105 do_check_eq(c._statementCounter, count + 1);
michael@0 106
michael@0 107 let rows = yield c.execute("PRAGMA wal_autocheckpoint");
michael@0 108 do_check_eq(rows[0].getResultByIndex(0), 0);
michael@0 109 count = c._statementCounter;
michael@0 110
michael@0 111 yield backend.setAutoCheckpoint(1);
michael@0 112 do_check_eq(c._statementCounter, count + 1);
michael@0 113
michael@0 114 rows = yield c.execute("PRAGMA wal_autocheckpoint");
michael@0 115 do_check_eq(rows[0].getResultByIndex(0), backend._enabledWALCheckpointPages);
michael@0 116 count = c._statementCounter;
michael@0 117
michael@0 118 yield backend.checkpoint();
michael@0 119 do_check_eq(c._statementCounter, count + 1);
michael@0 120
michael@0 121 yield backend.checkpoint();
michael@0 122 do_check_eq(c._statementCounter, count + 2);
michael@0 123
michael@0 124 yield backend.close();
michael@0 125 });
michael@0 126
michael@0 127 add_task(function test_measurement_registration() {
michael@0 128 let backend = yield Metrics.Storage("measurement_registration");
michael@0 129
michael@0 130 do_check_false(backend.hasProvider("foo"));
michael@0 131 do_check_false(backend.hasMeasurement("foo", "bar", 1));
michael@0 132
michael@0 133 let id = yield backend.registerMeasurement("foo", "bar", 1);
michael@0 134 do_check_eq(id, 1);
michael@0 135
michael@0 136 do_check_true(backend.hasProvider("foo"));
michael@0 137 do_check_true(backend.hasMeasurement("foo", "bar", 1));
michael@0 138 do_check_eq(backend.measurementID("foo", "bar", 1), id);
michael@0 139 do_check_false(backend.hasMeasurement("foo", "bar", 2));
michael@0 140
michael@0 141 let id2 = yield backend.registerMeasurement("foo", "bar", 2);
michael@0 142 do_check_eq(id2, 2);
michael@0 143 do_check_true(backend.hasMeasurement("foo", "bar", 2));
michael@0 144 do_check_eq(backend.measurementID("foo", "bar", 2), id2);
michael@0 145
michael@0 146 yield backend.close();
michael@0 147 });
michael@0 148
michael@0 149 add_task(function test_field_registration_basic() {
michael@0 150 let backend = yield Metrics.Storage("field_registration_basic");
michael@0 151
michael@0 152 do_check_false(backend.hasField("foo", "bar", 1, "baz"));
michael@0 153
michael@0 154 let mID = yield backend.registerMeasurement("foo", "bar", 1);
michael@0 155 do_check_false(backend.hasField("foo", "bar", 1, "baz"));
michael@0 156 do_check_false(backend.hasFieldFromMeasurement(mID, "baz"));
michael@0 157
michael@0 158 let bazID = yield backend.registerField(mID, "baz",
michael@0 159 backend.FIELD_DAILY_COUNTER);
michael@0 160 do_check_true(backend.hasField("foo", "bar", 1, "baz"));
michael@0 161 do_check_true(backend.hasFieldFromMeasurement(mID, "baz"));
michael@0 162
michael@0 163 let bar2ID = yield backend.registerMeasurement("foo", "bar2", 1);
michael@0 164
michael@0 165 yield backend.registerField(bar2ID, "baz",
michael@0 166 backend.FIELD_DAILY_DISCRETE_NUMERIC);
michael@0 167
michael@0 168 do_check_true(backend.hasField("foo", "bar2", 1, "baz"));
michael@0 169
michael@0 170 yield backend.close();
michael@0 171 });
michael@0 172
michael@0 173 // Ensure changes types of fields results in fatal error.
michael@0 174 add_task(function test_field_registration_changed_type() {
michael@0 175 let backend = yield Metrics.Storage("field_registration_changed_type");
michael@0 176
michael@0 177 let mID = yield backend.registerMeasurement("bar", "bar", 1);
michael@0 178
michael@0 179 let id = yield backend.registerField(mID, "baz",
michael@0 180 backend.FIELD_DAILY_COUNTER);
michael@0 181
michael@0 182 let caught = false;
michael@0 183 try {
michael@0 184 yield backend.registerField(mID, "baz",
michael@0 185 backend.FIELD_DAILY_DISCRETE_NUMERIC);
michael@0 186 } catch (ex) {
michael@0 187 caught = true;
michael@0 188 do_check_true(ex.message.startsWith("Field already defined with different type"));
michael@0 189 }
michael@0 190
michael@0 191 do_check_true(caught);
michael@0 192
michael@0 193 yield backend.close();
michael@0 194 });
michael@0 195
michael@0 196 add_task(function test_field_registration_repopulation() {
michael@0 197 let backend = yield Metrics.Storage("field_registration_repopulation");
michael@0 198
michael@0 199 let mID1 = yield backend.registerMeasurement("foo", "bar", 1);
michael@0 200 let mID2 = yield backend.registerMeasurement("foo", "bar", 2);
michael@0 201 let mID3 = yield backend.registerMeasurement("foo", "biz", 1);
michael@0 202 let mID4 = yield backend.registerMeasurement("baz", "foo", 1);
michael@0 203
michael@0 204 let fID1 = yield backend.registerField(mID1, "foo", backend.FIELD_DAILY_COUNTER);
michael@0 205 let fID2 = yield backend.registerField(mID1, "bar", backend.FIELD_DAILY_DISCRETE_NUMERIC);
michael@0 206 let fID3 = yield backend.registerField(mID4, "foo", backend.FIELD_LAST_TEXT);
michael@0 207
michael@0 208 yield backend.close();
michael@0 209
michael@0 210 backend = yield Metrics.Storage("field_registration_repopulation");
michael@0 211
michael@0 212 do_check_true(backend.hasProvider("foo"));
michael@0 213 do_check_true(backend.hasProvider("baz"));
michael@0 214 do_check_true(backend.hasMeasurement("foo", "bar", 1));
michael@0 215 do_check_eq(backend.measurementID("foo", "bar", 1), mID1);
michael@0 216 do_check_true(backend.hasMeasurement("foo", "bar", 2));
michael@0 217 do_check_eq(backend.measurementID("foo", "bar", 2), mID2);
michael@0 218 do_check_true(backend.hasMeasurement("foo", "biz", 1));
michael@0 219 do_check_eq(backend.measurementID("foo", "biz", 1), mID3);
michael@0 220 do_check_true(backend.hasMeasurement("baz", "foo", 1));
michael@0 221 do_check_eq(backend.measurementID("baz", "foo", 1), mID4);
michael@0 222
michael@0 223 do_check_true(backend.hasField("foo", "bar", 1, "foo"));
michael@0 224 do_check_eq(backend.fieldID("foo", "bar", 1, "foo"), fID1);
michael@0 225 do_check_true(backend.hasField("foo", "bar", 1, "bar"));
michael@0 226 do_check_eq(backend.fieldID("foo", "bar", 1, "bar"), fID2);
michael@0 227 do_check_true(backend.hasField("baz", "foo", 1, "foo"));
michael@0 228 do_check_eq(backend.fieldID("baz", "foo", 1, "foo"), fID3);
michael@0 229
michael@0 230 yield backend.close();
michael@0 231 });
michael@0 232
michael@0 233 add_task(function test_enqueue_operation_execution_order() {
michael@0 234 let backend = yield Metrics.Storage("enqueue_operation_execution_order");
michael@0 235
michael@0 236 let executionCount = 0;
michael@0 237
michael@0 238 let fns = {
michael@0 239 op1: function () {
michael@0 240 do_check_eq(executionCount, 1);
michael@0 241 },
michael@0 242
michael@0 243 op2: function () {
michael@0 244 do_check_eq(executionCount, 2);
michael@0 245 },
michael@0 246
michael@0 247 op3: function () {
michael@0 248 do_check_eq(executionCount, 3);
michael@0 249 },
michael@0 250 };
michael@0 251
michael@0 252 function enqueuedOperation(fn) {
michael@0 253 let deferred = Promise.defer();
michael@0 254
michael@0 255 CommonUtils.nextTick(function onNextTick() {
michael@0 256 executionCount++;
michael@0 257 fn();
michael@0 258 deferred.resolve();
michael@0 259 });
michael@0 260
michael@0 261 return deferred.promise;
michael@0 262 }
michael@0 263
michael@0 264 let promises = [];
michael@0 265 for (let i = 1; i <= 3; i++) {
michael@0 266 let fn = fns["op" + i];
michael@0 267 promises.push(backend.enqueueOperation(enqueuedOperation.bind(this, fn)));
michael@0 268 }
michael@0 269
michael@0 270 for (let promise of promises) {
michael@0 271 yield promise;
michael@0 272 }
michael@0 273
michael@0 274 yield backend.close();
michael@0 275 });
michael@0 276
michael@0 277 add_task(function test_enqueue_operation_many() {
michael@0 278 let backend = yield Metrics.Storage("enqueue_operation_many");
michael@0 279
michael@0 280 let promises = [];
michael@0 281 for (let i = 0; i < 100; i++) {
michael@0 282 promises.push(backend.registerMeasurement("foo", "bar" + i, 1));
michael@0 283 }
michael@0 284
michael@0 285 for (let promise of promises) {
michael@0 286 yield promise;
michael@0 287 }
michael@0 288
michael@0 289 yield backend.close();
michael@0 290 });
michael@0 291
michael@0 292 // If the operation did not return a promise, everything should still execute.
michael@0 293 add_task(function test_enqueue_operation_no_return_promise() {
michael@0 294 let backend = yield Metrics.Storage("enqueue_operation_no_return_promise");
michael@0 295
michael@0 296 let mID = yield backend.registerMeasurement("foo", "bar", 1);
michael@0 297 let fID = yield backend.registerField(mID, "baz", backend.FIELD_DAILY_COUNTER);
michael@0 298 let now = new Date();
michael@0 299
michael@0 300 let promises = [];
michael@0 301 for (let i = 0; i < 10; i++) {
michael@0 302 promises.push(backend.enqueueOperation(function op() {
michael@0 303 backend.incrementDailyCounterFromFieldID(fID, now);
michael@0 304 }));
michael@0 305 }
michael@0 306
michael@0 307 let deferred = Promise.defer();
michael@0 308
michael@0 309 let finished = 0;
michael@0 310 for (let promise of promises) {
michael@0 311 promise.then(
michael@0 312 do_throw.bind(this, "Unexpected resolve."),
michael@0 313 function onError() {
michael@0 314 finished++;
michael@0 315
michael@0 316 if (finished == promises.length) {
michael@0 317 backend.getDailyCounterCountFromFieldID(fID, now).then(function onCount(count) {
michael@0 318 // There should not be a race condition here because storage
michael@0 319 // serializes all statements. So, for the getDailyCounterCount
michael@0 320 // query to finish means that all counter update statements must
michael@0 321 // have completed.
michael@0 322 do_check_eq(count, promises.length);
michael@0 323 deferred.resolve();
michael@0 324 });
michael@0 325 }
michael@0 326 }
michael@0 327 );
michael@0 328 }
michael@0 329
michael@0 330 yield deferred.promise;
michael@0 331 yield backend.close();
michael@0 332 });
michael@0 333
michael@0 334 // If an operation throws, subsequent operations should still execute.
michael@0 335 add_task(function test_enqueue_operation_throw_exception() {
michael@0 336 let backend = yield Metrics.Storage("enqueue_operation_rejected_promise");
michael@0 337
michael@0 338 let mID = yield backend.registerMeasurement("foo", "bar", 1);
michael@0 339 let fID = yield backend.registerField(mID, "baz", backend.FIELD_DAILY_COUNTER);
michael@0 340 let now = new Date();
michael@0 341
michael@0 342 let deferred = Promise.defer();
michael@0 343 backend.enqueueOperation(function bad() {
michael@0 344 throw new Error("I failed.");
michael@0 345 }).then(do_throw, function onError(error) {
michael@0 346 do_check_true(error.message.contains("I failed."));
michael@0 347 deferred.resolve();
michael@0 348 });
michael@0 349
michael@0 350 let promise = backend.enqueueOperation(function () {
michael@0 351 return backend.incrementDailyCounterFromFieldID(fID, now);
michael@0 352 });
michael@0 353
michael@0 354 yield deferred.promise;
michael@0 355 yield promise;
michael@0 356
michael@0 357 let count = yield backend.getDailyCounterCountFromFieldID(fID, now);
michael@0 358 do_check_eq(count, 1);
michael@0 359 yield backend.close();
michael@0 360 });
michael@0 361
michael@0 362 // If an operation rejects, subsequent operations should still execute.
michael@0 363 add_task(function test_enqueue_operation_reject_promise() {
michael@0 364 let backend = yield Metrics.Storage("enqueue_operation_reject_promise");
michael@0 365
michael@0 366 let mID = yield backend.registerMeasurement("foo", "bar", 1);
michael@0 367 let fID = yield backend.registerField(mID, "baz", backend.FIELD_DAILY_COUNTER);
michael@0 368 let now = new Date();
michael@0 369
michael@0 370 let deferred = Promise.defer();
michael@0 371 backend.enqueueOperation(function reject() {
michael@0 372 let d = Promise.defer();
michael@0 373
michael@0 374 CommonUtils.nextTick(function nextTick() {
michael@0 375 d.reject("I failed.");
michael@0 376 });
michael@0 377
michael@0 378 return d.promise;
michael@0 379 }).then(do_throw, function onError(error) {
michael@0 380 deferred.resolve();
michael@0 381 });
michael@0 382
michael@0 383 let promise = backend.enqueueOperation(function () {
michael@0 384 return backend.incrementDailyCounterFromFieldID(fID, now);
michael@0 385 });
michael@0 386
michael@0 387 yield deferred.promise;
michael@0 388 yield promise;
michael@0 389
michael@0 390 let count = yield backend.getDailyCounterCountFromFieldID(fID, now);
michael@0 391 do_check_eq(count, 1);
michael@0 392 yield backend.close();
michael@0 393 });
michael@0 394
michael@0 395 add_task(function test_enqueue_transaction() {
michael@0 396 let backend = yield Metrics.Storage("enqueue_transaction");
michael@0 397
michael@0 398 let mID = yield backend.registerMeasurement("foo", "bar", 1);
michael@0 399 let fID = yield backend.registerField(mID, "baz", backend.FIELD_DAILY_COUNTER);
michael@0 400 let now = new Date();
michael@0 401
michael@0 402 yield backend.incrementDailyCounterFromFieldID(fID, now);
michael@0 403
michael@0 404 yield backend.enqueueTransaction(function transaction() {
michael@0 405 yield backend.incrementDailyCounterFromFieldID(fID, now);
michael@0 406 });
michael@0 407
michael@0 408 let count = yield backend.getDailyCounterCountFromFieldID(fID, now);
michael@0 409 do_check_eq(count, 2);
michael@0 410
michael@0 411 let errored = false;
michael@0 412 try {
michael@0 413 yield backend.enqueueTransaction(function aborted() {
michael@0 414 yield backend.incrementDailyCounterFromFieldID(fID, now);
michael@0 415
michael@0 416 throw new Error("Some error.");
michael@0 417 });
michael@0 418 } catch (ex) {
michael@0 419 errored = true;
michael@0 420 } finally {
michael@0 421 do_check_true(errored);
michael@0 422 }
michael@0 423
michael@0 424 count = yield backend.getDailyCounterCountFromFieldID(fID, now);
michael@0 425 do_check_eq(count, 2);
michael@0 426
michael@0 427 yield backend.close();
michael@0 428 });
michael@0 429
michael@0 430 add_task(function test_increment_daily_counter_basic() {
michael@0 431 let backend = yield Metrics.Storage("increment_daily_counter_basic");
michael@0 432
michael@0 433 let mID = yield backend.registerMeasurement("foo", "bar", 1);
michael@0 434
michael@0 435 let fieldID = yield backend.registerField(mID, "baz",
michael@0 436 backend.FIELD_DAILY_COUNTER);
michael@0 437
michael@0 438 let now = new Date();
michael@0 439 yield backend.incrementDailyCounterFromFieldID(fieldID, now);
michael@0 440
michael@0 441 let count = yield backend.getDailyCounterCountFromFieldID(fieldID, now);
michael@0 442 do_check_eq(count, 1);
michael@0 443
michael@0 444 yield backend.incrementDailyCounterFromFieldID(fieldID, now);
michael@0 445 count = yield backend.getDailyCounterCountFromFieldID(fieldID, now);
michael@0 446 do_check_eq(count, 2);
michael@0 447
michael@0 448 yield backend.incrementDailyCounterFromFieldID(fieldID, now, 10);
michael@0 449 count = yield backend.getDailyCounterCountFromFieldID(fieldID, now);
michael@0 450 do_check_eq(count, 12);
michael@0 451
michael@0 452 yield backend.close();
michael@0 453 });
michael@0 454
michael@0 455 add_task(function test_increment_daily_counter_multiple_days() {
michael@0 456 let backend = yield Metrics.Storage("increment_daily_counter_multiple_days");
michael@0 457
michael@0 458 let mID = yield backend.registerMeasurement("foo", "bar", 1);
michael@0 459 let fieldID = yield backend.registerField(mID, "baz",
michael@0 460 backend.FIELD_DAILY_COUNTER);
michael@0 461
michael@0 462 let days = [];
michael@0 463 let now = Date.now();
michael@0 464 for (let i = 0; i < 100; i++) {
michael@0 465 days.push(new Date(now - i * MILLISECONDS_PER_DAY));
michael@0 466 }
michael@0 467
michael@0 468 for (let day of days) {
michael@0 469 yield backend.incrementDailyCounterFromFieldID(fieldID, day);
michael@0 470 }
michael@0 471
michael@0 472 let result = yield backend.getDailyCounterCountsFromFieldID(fieldID);
michael@0 473 do_check_eq(result.size, 100);
michael@0 474 for (let day of days) {
michael@0 475 do_check_true(result.hasDay(day));
michael@0 476 do_check_eq(result.getDay(day), 1);
michael@0 477 }
michael@0 478
michael@0 479 let fields = yield backend.getMeasurementDailyCountersFromMeasurementID(mID);
michael@0 480 do_check_eq(fields.size, 1);
michael@0 481 do_check_true(fields.has("baz"));
michael@0 482 do_check_eq(fields.get("baz").size, 100);
michael@0 483
michael@0 484 for (let day of days) {
michael@0 485 do_check_true(fields.get("baz").hasDay(day));
michael@0 486 do_check_eq(fields.get("baz").getDay(day), 1);
michael@0 487 }
michael@0 488
michael@0 489 yield backend.close();
michael@0 490 });
michael@0 491
michael@0 492 add_task(function test_last_values() {
michael@0 493 let backend = yield Metrics.Storage("set_last");
michael@0 494
michael@0 495 let mID = yield backend.registerMeasurement("foo", "bar", 1);
michael@0 496 let numberID = yield backend.registerField(mID, "number",
michael@0 497 backend.FIELD_LAST_NUMERIC);
michael@0 498 let textID = yield backend.registerField(mID, "text",
michael@0 499 backend.FIELD_LAST_TEXT);
michael@0 500 let now = new Date();
michael@0 501 let nowDay = new Date(Math.floor(now.getTime() / MILLISECONDS_PER_DAY) * MILLISECONDS_PER_DAY);
michael@0 502
michael@0 503 yield backend.setLastNumericFromFieldID(numberID, 42, now);
michael@0 504 yield backend.setLastTextFromFieldID(textID, "hello world", now);
michael@0 505
michael@0 506 let result = yield backend.getLastNumericFromFieldID(numberID);
michael@0 507 do_check_true(Array.isArray(result));
michael@0 508 do_check_eq(result[0].getTime(), nowDay.getTime());
michael@0 509 do_check_eq(typeof(result[1]), "number");
michael@0 510 do_check_eq(result[1], 42);
michael@0 511
michael@0 512 result = yield backend.getLastTextFromFieldID(textID);
michael@0 513 do_check_true(Array.isArray(result));
michael@0 514 do_check_eq(result[0].getTime(), nowDay.getTime());
michael@0 515 do_check_eq(typeof(result[1]), "string");
michael@0 516 do_check_eq(result[1], "hello world");
michael@0 517
michael@0 518 let missingID = yield backend.registerField(mID, "missing",
michael@0 519 backend.FIELD_LAST_NUMERIC);
michael@0 520 do_check_null(yield backend.getLastNumericFromFieldID(missingID));
michael@0 521
michael@0 522 let fields = yield backend.getMeasurementLastValuesFromMeasurementID(mID);
michael@0 523 do_check_eq(fields.size, 2);
michael@0 524 do_check_true(fields.has("number"));
michael@0 525 do_check_true(fields.has("text"));
michael@0 526 do_check_eq(fields.get("number")[1], 42);
michael@0 527 do_check_eq(fields.get("text")[1], "hello world");
michael@0 528
michael@0 529 yield backend.close();
michael@0 530 });
michael@0 531
michael@0 532 add_task(function test_discrete_values_basic() {
michael@0 533 let backend = yield Metrics.Storage("discrete_values_basic");
michael@0 534
michael@0 535 let mID = yield backend.registerMeasurement("foo", "bar", 1);
michael@0 536 let numericID = yield backend.registerField(mID, "numeric",
michael@0 537 backend.FIELD_DAILY_DISCRETE_NUMERIC);
michael@0 538 let textID = yield backend.registerField(mID, "text",
michael@0 539 backend.FIELD_DAILY_DISCRETE_TEXT);
michael@0 540
michael@0 541 let now = new Date();
michael@0 542 let expectedNumeric = [];
michael@0 543 let expectedText = [];
michael@0 544 for (let i = 0; i < 100; i++) {
michael@0 545 expectedNumeric.push(i);
michael@0 546 expectedText.push("value" + i);
michael@0 547 yield backend.addDailyDiscreteNumericFromFieldID(numericID, i, now);
michael@0 548 yield backend.addDailyDiscreteTextFromFieldID(textID, "value" + i, now);
michael@0 549 }
michael@0 550
michael@0 551 let values = yield backend.getDailyDiscreteNumericFromFieldID(numericID);
michael@0 552 do_check_eq(values.size, 1);
michael@0 553 do_check_true(values.hasDay(now));
michael@0 554 do_check_true(Array.isArray(values.getDay(now)));
michael@0 555 do_check_eq(values.getDay(now).length, expectedNumeric.length);
michael@0 556
michael@0 557 for (let i = 0; i < expectedNumeric.length; i++) {
michael@0 558 do_check_eq(values.getDay(now)[i], expectedNumeric[i]);
michael@0 559 }
michael@0 560
michael@0 561 values = yield backend.getDailyDiscreteTextFromFieldID(textID);
michael@0 562 do_check_eq(values.size, 1);
michael@0 563 do_check_true(values.hasDay(now));
michael@0 564 do_check_true(Array.isArray(values.getDay(now)));
michael@0 565 do_check_eq(values.getDay(now).length, expectedText.length);
michael@0 566
michael@0 567 for (let i = 0; i < expectedText.length; i++) {
michael@0 568 do_check_eq(values.getDay(now)[i], expectedText[i]);
michael@0 569 }
michael@0 570
michael@0 571 let fields = yield backend.getMeasurementDailyDiscreteValuesFromMeasurementID(mID);
michael@0 572 do_check_eq(fields.size, 2);
michael@0 573 do_check_true(fields.has("numeric"));
michael@0 574 do_check_true(fields.has("text"));
michael@0 575
michael@0 576 let numeric = fields.get("numeric");
michael@0 577 let text = fields.get("text");
michael@0 578 do_check_true(numeric.hasDay(now));
michael@0 579 do_check_true(text.hasDay(now));
michael@0 580 do_check_eq(numeric.getDay(now).length, expectedNumeric.length);
michael@0 581 do_check_eq(text.getDay(now).length, expectedText.length);
michael@0 582
michael@0 583 for (let i = 0; i < expectedNumeric.length; i++) {
michael@0 584 do_check_eq(numeric.getDay(now)[i], expectedNumeric[i]);
michael@0 585 }
michael@0 586
michael@0 587 for (let i = 0; i < expectedText.length; i++) {
michael@0 588 do_check_eq(text.getDay(now)[i], expectedText[i]);
michael@0 589 }
michael@0 590
michael@0 591 yield backend.close();
michael@0 592 });
michael@0 593
michael@0 594 add_task(function test_discrete_values_multiple_days() {
michael@0 595 let backend = yield Metrics.Storage("discrete_values_multiple_days");
michael@0 596
michael@0 597 let mID = yield backend.registerMeasurement("foo", "bar", 1);
michael@0 598 let id = yield backend.registerField(mID, "baz",
michael@0 599 backend.FIELD_DAILY_DISCRETE_NUMERIC);
michael@0 600
michael@0 601 let now = new Date();
michael@0 602 let dates = [];
michael@0 603 for (let i = 0; i < 50; i++) {
michael@0 604 let date = new Date(now.getTime() + i * MILLISECONDS_PER_DAY);
michael@0 605 dates.push(date);
michael@0 606
michael@0 607 yield backend.addDailyDiscreteNumericFromFieldID(id, i, date);
michael@0 608 }
michael@0 609
michael@0 610 let values = yield backend.getDailyDiscreteNumericFromFieldID(id);
michael@0 611 do_check_eq(values.size, 50);
michael@0 612
michael@0 613 let i = 0;
michael@0 614 for (let date of dates) {
michael@0 615 do_check_true(values.hasDay(date));
michael@0 616 do_check_eq(values.getDay(date)[0], i);
michael@0 617 i++;
michael@0 618 }
michael@0 619
michael@0 620 let fields = yield backend.getMeasurementDailyDiscreteValuesFromMeasurementID(mID);
michael@0 621 do_check_eq(fields.size, 1);
michael@0 622 do_check_true(fields.has("baz"));
michael@0 623 let baz = fields.get("baz");
michael@0 624 do_check_eq(baz.size, 50);
michael@0 625 i = 0;
michael@0 626 for (let date of dates) {
michael@0 627 do_check_true(baz.hasDay(date));
michael@0 628 do_check_eq(baz.getDay(date).length, 1);
michael@0 629 do_check_eq(baz.getDay(date)[0], i);
michael@0 630 i++;
michael@0 631 }
michael@0 632
michael@0 633 yield backend.close();
michael@0 634 });
michael@0 635
michael@0 636 add_task(function test_daily_last_values() {
michael@0 637 let backend = yield Metrics.Storage("daily_last_values");
michael@0 638
michael@0 639 let mID = yield backend.registerMeasurement("foo", "bar", 1);
michael@0 640 let numericID = yield backend.registerField(mID, "numeric",
michael@0 641 backend.FIELD_DAILY_LAST_NUMERIC);
michael@0 642 let textID = yield backend.registerField(mID, "text",
michael@0 643 backend.FIELD_DAILY_LAST_TEXT);
michael@0 644
michael@0 645 let now = new Date();
michael@0 646 let yesterday = new Date(now.getTime() - MILLISECONDS_PER_DAY);
michael@0 647 let dayBefore = new Date(yesterday.getTime() - MILLISECONDS_PER_DAY);
michael@0 648
michael@0 649 yield backend.setDailyLastNumericFromFieldID(numericID, 1, yesterday);
michael@0 650 yield backend.setDailyLastNumericFromFieldID(numericID, 2, now);
michael@0 651 yield backend.setDailyLastNumericFromFieldID(numericID, 3, dayBefore);
michael@0 652 yield backend.setDailyLastTextFromFieldID(textID, "foo", now);
michael@0 653 yield backend.setDailyLastTextFromFieldID(textID, "bar", yesterday);
michael@0 654 yield backend.setDailyLastTextFromFieldID(textID, "baz", dayBefore);
michael@0 655
michael@0 656 let days = yield backend.getDailyLastNumericFromFieldID(numericID);
michael@0 657 do_check_eq(days.size, 3);
michael@0 658 do_check_eq(days.getDay(yesterday), 1);
michael@0 659 do_check_eq(days.getDay(now), 2);
michael@0 660 do_check_eq(days.getDay(dayBefore), 3);
michael@0 661
michael@0 662 days = yield backend.getDailyLastTextFromFieldID(textID);
michael@0 663 do_check_eq(days.size, 3);
michael@0 664 do_check_eq(days.getDay(now), "foo");
michael@0 665 do_check_eq(days.getDay(yesterday), "bar");
michael@0 666 do_check_eq(days.getDay(dayBefore), "baz");
michael@0 667
michael@0 668 yield backend.setDailyLastNumericFromFieldID(numericID, 4, yesterday);
michael@0 669 days = yield backend.getDailyLastNumericFromFieldID(numericID);
michael@0 670 do_check_eq(days.getDay(yesterday), 4);
michael@0 671
michael@0 672 yield backend.setDailyLastTextFromFieldID(textID, "biz", yesterday);
michael@0 673 days = yield backend.getDailyLastTextFromFieldID(textID);
michael@0 674 do_check_eq(days.getDay(yesterday), "biz");
michael@0 675
michael@0 676 days = yield backend.getDailyLastNumericFromFieldID(numericID, yesterday);
michael@0 677 do_check_eq(days.size, 1);
michael@0 678 do_check_eq(days.getDay(yesterday), 4);
michael@0 679
michael@0 680 days = yield backend.getDailyLastTextFromFieldID(textID, yesterday);
michael@0 681 do_check_eq(days.size, 1);
michael@0 682 do_check_eq(days.getDay(yesterday), "biz");
michael@0 683
michael@0 684 let fields = yield backend.getMeasurementDailyLastValuesFromMeasurementID(mID);
michael@0 685 do_check_eq(fields.size, 2);
michael@0 686 do_check_true(fields.has("numeric"));
michael@0 687 do_check_true(fields.has("text"));
michael@0 688 let numeric = fields.get("numeric");
michael@0 689 let text = fields.get("text");
michael@0 690 do_check_true(numeric.hasDay(yesterday));
michael@0 691 do_check_true(numeric.hasDay(dayBefore));
michael@0 692 do_check_true(numeric.hasDay(now));
michael@0 693 do_check_true(text.hasDay(yesterday));
michael@0 694 do_check_true(text.hasDay(dayBefore));
michael@0 695 do_check_true(text.hasDay(now));
michael@0 696 do_check_eq(numeric.getDay(yesterday), 4);
michael@0 697 do_check_eq(text.getDay(yesterday), "biz");
michael@0 698
michael@0 699 yield backend.close();
michael@0 700 });
michael@0 701
michael@0 702 add_task(function test_prune_data_before() {
michael@0 703 let backend = yield Metrics.Storage("prune_data_before");
michael@0 704
michael@0 705 let mID = yield backend.registerMeasurement("foo", "bar", 1);
michael@0 706
michael@0 707 let counterID = yield backend.registerField(mID, "baz",
michael@0 708 backend.FIELD_DAILY_COUNTER);
michael@0 709 let text1ID = yield backend.registerField(mID, "one_text_1",
michael@0 710 backend.FIELD_LAST_TEXT);
michael@0 711 let text2ID = yield backend.registerField(mID, "one_text_2",
michael@0 712 backend.FIELD_LAST_TEXT);
michael@0 713 let numeric1ID = yield backend.registerField(mID, "one_numeric_1",
michael@0 714 backend.FIELD_LAST_NUMERIC);
michael@0 715 let numeric2ID = yield backend.registerField(mID, "one_numeric_2",
michael@0 716 backend.FIELD_LAST_NUMERIC);
michael@0 717 let text3ID = yield backend.registerField(mID, "daily_last_text_1",
michael@0 718 backend.FIELD_DAILY_LAST_TEXT);
michael@0 719 let text4ID = yield backend.registerField(mID, "daily_last_text_2",
michael@0 720 backend.FIELD_DAILY_LAST_TEXT);
michael@0 721 let numeric3ID = yield backend.registerField(mID, "daily_last_numeric_1",
michael@0 722 backend.FIELD_DAILY_LAST_NUMERIC);
michael@0 723 let numeric4ID = yield backend.registerField(mID, "daily_last_numeric_2",
michael@0 724 backend.FIELD_DAILY_LAST_NUMERIC);
michael@0 725
michael@0 726 let now = new Date();
michael@0 727 let yesterday = new Date(now.getTime() - MILLISECONDS_PER_DAY);
michael@0 728 let dayBefore = new Date(yesterday.getTime() - MILLISECONDS_PER_DAY);
michael@0 729
michael@0 730 yield backend.incrementDailyCounterFromFieldID(counterID, now);
michael@0 731 yield backend.incrementDailyCounterFromFieldID(counterID, yesterday);
michael@0 732 yield backend.incrementDailyCounterFromFieldID(counterID, dayBefore);
michael@0 733 yield backend.setLastTextFromFieldID(text1ID, "hello", dayBefore);
michael@0 734 yield backend.setLastTextFromFieldID(text2ID, "world", yesterday);
michael@0 735 yield backend.setLastNumericFromFieldID(numeric1ID, 42, dayBefore);
michael@0 736 yield backend.setLastNumericFromFieldID(numeric2ID, 43, yesterday);
michael@0 737 yield backend.setDailyLastTextFromFieldID(text3ID, "foo", dayBefore);
michael@0 738 yield backend.setDailyLastTextFromFieldID(text3ID, "bar", yesterday);
michael@0 739 yield backend.setDailyLastTextFromFieldID(text4ID, "hello", dayBefore);
michael@0 740 yield backend.setDailyLastTextFromFieldID(text4ID, "world", yesterday);
michael@0 741 yield backend.setDailyLastNumericFromFieldID(numeric3ID, 40, dayBefore);
michael@0 742 yield backend.setDailyLastNumericFromFieldID(numeric3ID, 41, yesterday);
michael@0 743 yield backend.setDailyLastNumericFromFieldID(numeric4ID, 42, dayBefore);
michael@0 744 yield backend.setDailyLastNumericFromFieldID(numeric4ID, 43, yesterday);
michael@0 745
michael@0 746 let days = yield backend.getDailyCounterCountsFromFieldID(counterID);
michael@0 747 do_check_eq(days.size, 3);
michael@0 748
michael@0 749 yield backend.pruneDataBefore(yesterday);
michael@0 750 days = yield backend.getDailyCounterCountsFromFieldID(counterID);
michael@0 751 do_check_eq(days.size, 2);
michael@0 752 do_check_false(days.hasDay(dayBefore));
michael@0 753
michael@0 754 do_check_null(yield backend.getLastTextFromFieldID(text1ID));
michael@0 755 do_check_null(yield backend.getLastNumericFromFieldID(numeric1ID));
michael@0 756
michael@0 757 let result = yield backend.getLastTextFromFieldID(text2ID);
michael@0 758 do_check_true(Array.isArray(result));
michael@0 759 do_check_eq(result[1], "world");
michael@0 760
michael@0 761 result = yield backend.getLastNumericFromFieldID(numeric2ID);
michael@0 762 do_check_true(Array.isArray(result));
michael@0 763 do_check_eq(result[1], 43);
michael@0 764
michael@0 765 result = yield backend.getDailyLastNumericFromFieldID(numeric3ID);
michael@0 766 do_check_eq(result.size, 1);
michael@0 767 do_check_true(result.hasDay(yesterday));
michael@0 768
michael@0 769 result = yield backend.getDailyLastTextFromFieldID(text3ID);
michael@0 770 do_check_eq(result.size, 1);
michael@0 771 do_check_true(result.hasDay(yesterday));
michael@0 772
michael@0 773 yield backend.close();
michael@0 774 });
michael@0 775
michael@0 776 add_task(function test_provider_state() {
michael@0 777 let backend = yield Metrics.Storage("provider_state");
michael@0 778
michael@0 779 yield backend.registerMeasurement("foo", "bar", 1);
michael@0 780 yield backend.setProviderState("foo", "apple", "orange");
michael@0 781 let value = yield backend.getProviderState("foo", "apple");
michael@0 782 do_check_eq(value, "orange");
michael@0 783
michael@0 784 yield backend.setProviderState("foo", "apple", "pear");
michael@0 785 value = yield backend.getProviderState("foo", "apple");
michael@0 786 do_check_eq(value, "pear");
michael@0 787
michael@0 788 yield backend.close();
michael@0 789 });
michael@0 790
michael@0 791 add_task(function test_get_measurement_values() {
michael@0 792 let backend = yield Metrics.Storage("get_measurement_values");
michael@0 793
michael@0 794 let mID = yield backend.registerMeasurement("foo", "bar", 1);
michael@0 795 let id1 = yield backend.registerField(mID, "id1", backend.FIELD_DAILY_COUNTER);
michael@0 796 let id2 = yield backend.registerField(mID, "id2", backend.FIELD_DAILY_DISCRETE_NUMERIC);
michael@0 797 let id3 = yield backend.registerField(mID, "id3", backend.FIELD_DAILY_DISCRETE_TEXT);
michael@0 798 let id4 = yield backend.registerField(mID, "id4", backend.FIELD_DAILY_LAST_NUMERIC);
michael@0 799 let id5 = yield backend.registerField(mID, "id5", backend.FIELD_DAILY_LAST_TEXT);
michael@0 800 let id6 = yield backend.registerField(mID, "id6", backend.FIELD_LAST_NUMERIC);
michael@0 801 let id7 = yield backend.registerField(mID, "id7", backend.FIELD_LAST_TEXT);
michael@0 802
michael@0 803 let now = new Date();
michael@0 804 let yesterday = new Date(now.getTime() - MILLISECONDS_PER_DAY);
michael@0 805
michael@0 806 yield backend.incrementDailyCounterFromFieldID(id1, now);
michael@0 807 yield backend.addDailyDiscreteNumericFromFieldID(id2, 3, now);
michael@0 808 yield backend.addDailyDiscreteNumericFromFieldID(id2, 4, now);
michael@0 809 yield backend.addDailyDiscreteNumericFromFieldID(id2, 5, yesterday);
michael@0 810 yield backend.addDailyDiscreteNumericFromFieldID(id2, 6, yesterday);
michael@0 811 yield backend.addDailyDiscreteTextFromFieldID(id3, "1", now);
michael@0 812 yield backend.addDailyDiscreteTextFromFieldID(id3, "2", now);
michael@0 813 yield backend.addDailyDiscreteTextFromFieldID(id3, "3", yesterday);
michael@0 814 yield backend.addDailyDiscreteTextFromFieldID(id3, "4", yesterday);
michael@0 815 yield backend.setDailyLastNumericFromFieldID(id4, 1, now);
michael@0 816 yield backend.setDailyLastNumericFromFieldID(id4, 2, yesterday);
michael@0 817 yield backend.setDailyLastTextFromFieldID(id5, "foo", now);
michael@0 818 yield backend.setDailyLastTextFromFieldID(id5, "bar", yesterday);
michael@0 819 yield backend.setLastNumericFromFieldID(id6, 42, now);
michael@0 820 yield backend.setLastTextFromFieldID(id7, "foo", now);
michael@0 821
michael@0 822 let fields = yield backend.getMeasurementValues(mID);
michael@0 823 do_check_eq(Object.keys(fields).length, 2);
michael@0 824 do_check_true("days" in fields);
michael@0 825 do_check_true("singular" in fields);
michael@0 826 do_check_eq(fields.days.size, 2);
michael@0 827 do_check_true(fields.days.hasDay(now));
michael@0 828 do_check_true(fields.days.hasDay(yesterday));
michael@0 829 do_check_eq(fields.days.getDay(now).size, 5);
michael@0 830 do_check_eq(fields.days.getDay(yesterday).size, 4);
michael@0 831 do_check_eq(fields.days.getDay(now).get("id3")[0], 1);
michael@0 832 do_check_eq(fields.days.getDay(yesterday).get("id4"), 2);
michael@0 833 do_check_eq(fields.singular.size, 2);
michael@0 834 do_check_eq(fields.singular.get("id6")[1], 42);
michael@0 835 do_check_eq(fields.singular.get("id7")[1], "foo");
michael@0 836
michael@0 837 yield backend.close();
michael@0 838 });
michael@0 839

mercurial