services/sync/tests/unit/test_addons_reconciler.js

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

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 Cu.import("resource://gre/modules/AddonManager.jsm");
     7 Cu.import("resource://services-sync/addonsreconciler.js");
     8 Cu.import("resource://services-sync/engines/addons.js");
     9 Cu.import("resource://services-sync/service.js");
    10 Cu.import("resource://services-sync/util.js");
    12 loadAddonTestFunctions();
    13 startupManager();
    15 function run_test() {
    16   initTestLogging("Trace");
    17   Log.repository.getLogger("Sync.AddonsReconciler").level = Log.Level.Trace;
    18   Log.repository.getLogger("Sync.AddonsReconciler").level =
    19     Log.Level.Trace;
    21   Svc.Prefs.set("engine.addons", true);
    22   Service.engineManager.register(AddonsEngine);
    24   run_next_test();
    25 }
    27 add_test(function test_defaults() {
    28   _("Ensure new objects have reasonable defaults.");
    30   let reconciler = new AddonsReconciler();
    32   do_check_false(reconciler._listening);
    33   do_check_eq("object", typeof(reconciler.addons));
    34   do_check_eq(0, Object.keys(reconciler.addons).length);
    35   do_check_eq(0, reconciler._changes.length);
    36   do_check_eq(0, reconciler._listeners.length);
    38   run_next_test();
    39 });
    41 add_test(function test_load_state_empty_file() {
    42   _("Ensure loading from a missing file results in defaults being set.");
    44   let reconciler = new AddonsReconciler();
    46   reconciler.loadState(null, function(error, loaded) {
    47     do_check_eq(null, error);
    48     do_check_false(loaded);
    50     do_check_eq("object", typeof(reconciler.addons));
    51     do_check_eq(0, Object.keys(reconciler.addons).length);
    52     do_check_eq(0, reconciler._changes.length);
    54     run_next_test();
    55   });
    56 });
    58 add_test(function test_install_detection() {
    59   _("Ensure that add-on installation results in appropriate side-effects.");
    61   let reconciler = new AddonsReconciler();
    62   reconciler.startListening();
    64   let before = new Date();
    65   let addon = installAddon("test_bootstrap1_1");
    66   let after = new Date();
    68   do_check_eq(1, Object.keys(reconciler.addons).length);
    69   do_check_true(addon.id in reconciler.addons);
    70   let record = reconciler.addons[addon.id];
    72   const KEYS = ["id", "guid", "enabled", "installed", "modified", "type",
    73                 "scope", "foreignInstall"];
    74   for each (let key in KEYS) {
    75     do_check_true(key in record);
    76     do_check_neq(null, record[key]);
    77   }
    79   do_check_eq(addon.id, record.id);
    80   do_check_eq(addon.syncGUID, record.guid);
    81   do_check_true(record.enabled);
    82   do_check_true(record.installed);
    83   do_check_true(record.modified >= before && record.modified <= after);
    84   do_check_eq("extension", record.type);
    85   do_check_false(record.foreignInstall);
    87   do_check_eq(1, reconciler._changes.length);
    88   let change = reconciler._changes[0];
    89   do_check_true(change[0] >= before && change[1] <= after);
    90   do_check_eq(CHANGE_INSTALLED, change[1]);
    91   do_check_eq(addon.id, change[2]);
    93   uninstallAddon(addon);
    95   run_next_test();
    96 });
    98 add_test(function test_uninstall_detection() {
    99   _("Ensure that add-on uninstallation results in appropriate side-effects.");
   101   let reconciler = new AddonsReconciler();
   102   reconciler.startListening();
   104   reconciler._addons = {};
   105   reconciler._changes = [];
   107   let addon = installAddon("test_bootstrap1_1");
   108   let id = addon.id;
   109   let guid = addon.syncGUID;
   111   reconciler._changes = [];
   112   uninstallAddon(addon);
   114   do_check_eq(1, Object.keys(reconciler.addons).length);
   115   do_check_true(id in reconciler.addons);
   117   let record = reconciler.addons[id];
   118   do_check_false(record.installed);
   120   do_check_eq(1, reconciler._changes.length);
   121   let change = reconciler._changes[0];
   122   do_check_eq(CHANGE_UNINSTALLED, change[1]);
   123   do_check_eq(id, change[2]);
   125   run_next_test();
   126 });
   128 add_test(function test_load_state_future_version() {
   129   _("Ensure loading a file from a future version results in no data loaded.");
   131   const FILENAME = "TEST_LOAD_STATE_FUTURE_VERSION";
   133   let reconciler = new AddonsReconciler();
   135   // First we populate our new file.
   136   let state = {version: 100, addons: {foo: {}}, changes: [[1, 1, "foo"]]};
   137   let cb = Async.makeSyncCallback();
   139   // jsonSave() expects an object with ._log, so we give it a reconciler
   140   // instance.
   141   Utils.jsonSave(FILENAME, reconciler, state, cb);
   142   Async.waitForSyncCallback(cb);
   144   reconciler.loadState(FILENAME, function(error, loaded) {
   145     do_check_eq(null, error);
   146     do_check_false(loaded);
   148     do_check_eq("object", typeof(reconciler.addons));
   149     do_check_eq(1, Object.keys(reconciler.addons).length);
   150     do_check_eq(1, reconciler._changes.length);
   152     run_next_test();
   153   });
   154 });
   156 add_test(function test_prune_changes_before_date() {
   157   _("Ensure that old changes are pruned properly.");
   159   let reconciler = new AddonsReconciler();
   160   reconciler._ensureStateLoaded();
   161   reconciler._changes = [];
   163   let now = new Date();
   164   const HOUR_MS = 1000 * 60 * 60;
   166   _("Ensure pruning an empty changes array works.");
   167   reconciler.pruneChangesBeforeDate(now);
   168   do_check_eq(0, reconciler._changes.length);
   170   let old = new Date(now.getTime() - HOUR_MS);
   171   let young = new Date(now.getTime() - 1000);
   172   reconciler._changes.push([old, CHANGE_INSTALLED, "foo"]);
   173   reconciler._changes.push([young, CHANGE_INSTALLED, "bar"]);
   174   do_check_eq(2, reconciler._changes.length);
   176   _("Ensure pruning with an old time won't delete anything.");
   177   let threshold = new Date(old.getTime() - 1);
   178   reconciler.pruneChangesBeforeDate(threshold);
   179   do_check_eq(2, reconciler._changes.length);
   181   _("Ensure pruning a single item works.");
   182   let threshold = new Date(young.getTime() - 1000);
   183   reconciler.pruneChangesBeforeDate(threshold);
   184   do_check_eq(1, reconciler._changes.length);
   185   do_check_neq(undefined, reconciler._changes[0]);
   186   do_check_eq(young, reconciler._changes[0][0]);
   187   do_check_eq("bar", reconciler._changes[0][2]);
   189   _("Ensure pruning all changes works.");
   190   reconciler._changes.push([old, CHANGE_INSTALLED, "foo"]);
   191   reconciler.pruneChangesBeforeDate(now);
   192   do_check_eq(0, reconciler._changes.length);
   194   run_next_test();
   195 });

mercurial