services/healthreport/tests/xpcshell/test_provider_sessions.js

Wed, 31 Dec 2014 07:53:36 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 07:53:36 +0100
branch
TOR_BUG_3246
changeset 5
4ab42b5ab56c
permissions
-rw-r--r--

Correct small whitespace inconsistency, lost while renaming variables.

     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;
     9 Cu.import("resource://gre/modules/Promise.jsm");
    10 Cu.import("resource://gre/modules/Metrics.jsm");
    11 Cu.import("resource://gre/modules/Task.jsm");
    12 Cu.import("resource://gre/modules/services-common/utils.js");
    13 Cu.import("resource://gre/modules/services/datareporting/sessions.jsm");
    14 Cu.import("resource://gre/modules/services/healthreport/providers.jsm");
    17 function run_test() {
    18   run_next_test();
    19 }
    21 add_test(function test_constructor() {
    22   let provider = new SessionsProvider();
    24   run_next_test();
    25 });
    27 add_task(function test_init() {
    28   let storage = yield Metrics.Storage("init");
    29   let provider = new SessionsProvider();
    30   yield provider.init(storage);
    31   yield provider.shutdown();
    33   yield storage.close();
    34 });
    36 function monkeypatchStartupInfo(recorder, start=new Date(), offset=500) {
    37   Object.defineProperty(recorder, "_getStartupInfo", {
    38     value: function _getStartupInfo() {
    39       return {
    40         process: start,
    41         main: new Date(start.getTime() + offset),
    42         firstPaint: new Date(start.getTime() + 2 * offset),
    43         sessionRestored: new Date(start.getTime() + 3 * offset),
    44       };
    45     }
    46   });
    47 }
    49 function sleep(wait) {
    50   let deferred = Promise.defer();
    52   let timer = CommonUtils.namedTimer(function onTimer() {
    53     deferred.resolve();
    54   }, wait, deferred.promise, "_sleepTimer");
    56   return deferred.promise;
    57 }
    59 function getProvider(name, now=new Date(), init=true) {
    60   return Task.spawn(function () {
    61     let storage = yield Metrics.Storage(name);
    62     let provider = new SessionsProvider();
    64     let recorder = new SessionRecorder("testing." + name + ".sessions.");
    65     monkeypatchStartupInfo(recorder, now);
    66     provider.healthReporter = {sessionRecorder: recorder};
    67     recorder.onStartup();
    69     if (init) {
    70       yield provider.init(storage);
    71     }
    73     throw new Task.Result([provider, storage, recorder]);
    74   });
    75 }
    77 add_task(function test_current_session() {
    78   let now = new Date();
    79   let [provider, storage, recorder] = yield getProvider("current_session", now);
    81   yield sleep(25);
    82   recorder.onActivity(true);
    84   let current = provider.getMeasurement("current", 3);
    85   let values = yield current.getValues();
    86   let fields = values.singular;
    88   for (let field of ["startDay", "activeTicks", "totalTime", "main", "firstPaint", "sessionRestored"]) {
    89     do_check_true(fields.has(field));
    90   }
    92   do_check_eq(fields.get("startDay")[1], Metrics.dateToDays(now));
    93   do_check_eq(fields.get("totalTime")[1], recorder.totalTime);
    94   do_check_eq(fields.get("activeTicks")[1], 1);
    95   do_check_eq(fields.get("main")[1], 500);
    96   do_check_eq(fields.get("firstPaint")[1], 1000);
    97   do_check_eq(fields.get("sessionRestored")[1], 1500);
    99   yield provider.shutdown();
   100   yield storage.close();
   101 });
   103 add_task(function test_collect() {
   104   let now = new Date();
   105   let [provider, storage, recorder] = yield getProvider("collect");
   107   recorder.onShutdown();
   108   yield sleep(25);
   110   for (let i = 0; i < 5; i++) {
   111     let recorder2 = new SessionRecorder("testing.collect.sessions.");
   112     recorder2.onStartup();
   113     yield sleep(25);
   114     recorder2.onShutdown();
   115     yield sleep(25);
   116   }
   118   recorder = new SessionRecorder("testing.collect.sessions.");
   119   recorder.onStartup();
   121   // Collecting the provider should prune all previous sessions.
   122   let sessions = recorder.getPreviousSessions();
   123   do_check_eq(Object.keys(sessions).length, 6);
   124   yield provider.collectConstantData();
   125   sessions = recorder.getPreviousSessions();
   126   do_check_eq(Object.keys(sessions).length, 0);
   128   // And those previous sessions should make it to storage.
   129   let daily = provider.getMeasurement("previous", 3);
   130   let values = yield daily.getValues();
   131   do_check_true(values.days.hasDay(now));
   132   do_check_eq(values.days.size, 1);
   133   let day = values.days.getDay(now);
   134   do_check_eq(day.size, 5);
   135   let previousStorageCount = day.get("main").length;
   137   for (let field of ["cleanActiveTicks", "cleanTotalTime", "main", "firstPaint", "sessionRestored"]) {
   138     do_check_true(day.has(field));
   139     do_check_true(Array.isArray(day.get(field)));
   140     do_check_eq(day.get(field).length, 6);
   141   }
   143   let lastIndex = yield provider.getState("lastSession");
   144   do_check_eq(lastIndex, "" + (previousStorageCount - 1)); // 0-indexed
   146   // Fake an aborted session. If we create a 2nd recorder against the same
   147   // prefs branch as a running one, this simulates what would happen if the
   148   // first recorder didn't shut down.
   149   let recorder2 = new SessionRecorder("testing.collect.sessions.");
   150   recorder2.onStartup();
   151   do_check_eq(Object.keys(recorder.getPreviousSessions()).length, 1);
   152   yield provider.collectConstantData();
   153   do_check_eq(Object.keys(recorder.getPreviousSessions()).length, 0);
   155   values = yield daily.getValues();
   156   day = values.days.getDay(now);
   157   do_check_eq(day.size, previousStorageCount + 1);
   158   previousStorageCount = day.get("main").length;
   159   for (let field of ["abortedActiveTicks", "abortedTotalTime"]) {
   160     do_check_true(day.has(field));
   161     do_check_true(Array.isArray(day.get(field)));
   162     do_check_eq(day.get(field).length, 1);
   163   }
   165   lastIndex = yield provider.getState("lastSession");
   166   do_check_eq(lastIndex, "" + (previousStorageCount - 1));
   168   recorder.onShutdown();
   169   recorder2.onShutdown();
   171   // If we try to insert a already-inserted session, it will be ignored.
   172   recorder = new SessionRecorder("testing.collect.sessions.");
   173   recorder._currentIndex = recorder._currentIndex - 1;
   174   recorder._prunedIndex = recorder._currentIndex;
   175   recorder.onStartup();
   176   // Session is left over from recorder2.
   177   sessions = recorder.getPreviousSessions();
   178   do_check_eq(Object.keys(sessions).length, 1);
   179   do_check_true(previousStorageCount - 1 in sessions);
   180   yield provider.collectConstantData();
   181   lastIndex = yield provider.getState("lastSession");
   182   do_check_eq(lastIndex, "" + (previousStorageCount - 1));
   183   values = yield daily.getValues();
   184   day = values.days.getDay(now);
   185   // We should not get additional entry.
   186   do_check_eq(day.get("main").length, previousStorageCount);
   187   recorder.onShutdown();
   189   yield provider.shutdown();
   190   yield storage.close();
   191 });
   193 add_task(function test_serialization() {
   194   let [provider, storage, recorder] = yield getProvider("serialization");
   196   yield sleep(1025);
   197   recorder.onActivity(true);
   199   let current = provider.getMeasurement("current", 3);
   200   let data = yield current.getValues();
   201   do_check_true("singular" in data);
   203   let serializer = current.serializer(current.SERIALIZE_JSON);
   204   let fields = serializer.singular(data.singular);
   206   do_check_eq(fields._v, 3);
   207   do_check_eq(fields.activeTicks, 1);
   208   do_check_eq(fields.startDay, Metrics.dateToDays(recorder.startDate));
   209   do_check_eq(fields.main, 500);
   210   do_check_eq(fields.firstPaint, 1000);
   211   do_check_eq(fields.sessionRestored, 1500);
   212   do_check_true(fields.totalTime > 0);
   214   yield provider.shutdown();
   215   yield storage.close();
   216 });

mercurial