services/sync/tests/unit/test_history_tracker.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 Cu.import("resource://gre/modules/PlacesUtils.jsm");
     5 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
     6 Cu.import("resource://services-sync/engines.js");
     7 Cu.import("resource://services-sync/constants.js");
     8 Cu.import("resource://services-sync/engines/history.js");
     9 Cu.import("resource://services-sync/service.js");
    10 Cu.import("resource://services-sync/util.js");
    12 function onScoreUpdated(callback) {
    13   Svc.Obs.add("weave:engine:score:updated", function observer() {
    14     Svc.Obs.remove("weave:engine:score:updated", observer);
    15     try {
    16       callback();
    17     } catch (ex) {
    18       do_throw(ex);
    19     }
    20   });
    21 }
    23 Service.engineManager.clear();
    24 Service.engineManager.register(HistoryEngine);
    25 let engine = Service.engineManager.get("history");
    26 let tracker = engine._tracker;
    28 // Don't write out by default.
    29 tracker.persistChangedIDs = false;
    31 let _counter = 0;
    32 function addVisit() {
    33   let uriString = "http://getfirefox.com/" + _counter++;
    34   let uri = Utils.makeURI(uriString);
    35   _("Adding visit for URI " + uriString);
    36   let place = {
    37     uri: uri,
    38     visits: [ {
    39       visitDate: Date.now() * 1000,
    40       transitionType: PlacesUtils.history.TRANSITION_LINK
    41     } ]
    42   };
    44   let cb = Async.makeSpinningCallback();
    45   PlacesUtils.asyncHistory.updatePlaces(place, {
    46     handleError: function () {
    47       _("Error adding visit for " + uriString);
    48       cb(new Error("Error adding history entry"));
    49     },
    51     handleResult: function () {
    52     },
    54     handleCompletion: function () {
    55       _("Added visit for " + uriString);
    56       cb();
    57     }
    58   });
    60   // Spin the event loop to embed this async call in a sync API.
    61   cb.wait();
    62   return uri;
    63 }
    65 function run_test() {
    66   initTestLogging("Trace");
    67   Log.repository.getLogger("Sync.Tracker.History").level = Log.Level.Trace;
    68   run_next_test();
    69 }
    71 add_test(function test_empty() {
    72   _("Verify we've got an empty, disabled tracker to work with.");
    73   do_check_empty(tracker.changedIDs);
    74   do_check_eq(tracker.score, 0);
    75   do_check_false(tracker._isTracking);
    76   run_next_test();
    77 });
    79 add_test(function test_not_tracking(next) {
    80   _("Create history item. Won't show because we haven't started tracking yet");
    81   addVisit();
    82   Utils.nextTick(function() {
    83     do_check_empty(tracker.changedIDs);
    84     do_check_eq(tracker.score, 0);
    85     run_next_test();
    86   });
    87 });
    89 add_test(function test_start_tracking() {
    90   _("Add hook for save completion.");
    91   tracker.persistChangedIDs = true;
    92   tracker.onSavedChangedIDs = function () {
    93     _("changedIDs written to disk. Proceeding.");
    94     // Turn this back off.
    95     tracker.persistChangedIDs = false;
    96     delete tracker.onSavedChangedIDs;
    97     run_next_test();
    98   };
   100   _("Tell the tracker to start tracking changes.");
   101   onScoreUpdated(function() {
   102     _("Score updated in test_start_tracking.");
   103     do_check_attribute_count(tracker.changedIDs, 1);
   104     do_check_eq(tracker.score, SCORE_INCREMENT_SMALL);
   105   });
   107   Svc.Obs.notify("weave:engine:start-tracking");
   108   addVisit();
   109 });
   111 add_test(function test_start_tracking_twice() {
   112   _("Verifying preconditions from test_start_tracking.");
   113   do_check_attribute_count(tracker.changedIDs, 1);
   114   do_check_eq(tracker.score, SCORE_INCREMENT_SMALL);
   116   _("Notifying twice won't do any harm.");
   117   onScoreUpdated(function() {
   118     _("Score updated in test_start_tracking_twice.");
   119     do_check_attribute_count(tracker.changedIDs, 2);
   120     do_check_eq(tracker.score, 2 * SCORE_INCREMENT_SMALL);
   121     run_next_test();
   122   });
   124   Svc.Obs.notify("weave:engine:start-tracking");
   125   addVisit();
   126 });
   128 add_test(function test_track_delete() {
   129   _("Deletions are tracked.");
   131   // This isn't present because we weren't tracking when it was visited.
   132   let uri = Utils.makeURI("http://getfirefox.com/0");
   133   let guid = engine._store.GUIDForUri(uri);
   134   do_check_false(guid in tracker.changedIDs);
   136   onScoreUpdated(function() {
   137     do_check_true(guid in tracker.changedIDs);
   138     do_check_attribute_count(tracker.changedIDs, 3);
   139     do_check_eq(tracker.score, SCORE_INCREMENT_XLARGE + 2 * SCORE_INCREMENT_SMALL);
   140     run_next_test();
   141   });
   143   do_check_eq(tracker.score, 2 * SCORE_INCREMENT_SMALL);
   144   PlacesUtils.history.removePage(uri);
   145 });
   147 add_test(function test_dont_track_expiration() {
   148   _("Expirations are not tracked.");
   149   let uriToExpire = addVisit();
   150   let guidToExpire = engine._store.GUIDForUri(uriToExpire);
   151   let uriToRemove = addVisit();
   152   let guidToRemove = engine._store.GUIDForUri(uriToRemove);
   154   tracker.clearChangedIDs();
   155   do_check_false(guidToExpire in tracker.changedIDs);
   156   do_check_false(guidToRemove in tracker.changedIDs);
   158   onScoreUpdated(function() {
   159     do_check_false(guidToExpire in tracker.changedIDs);
   160     do_check_true(guidToRemove in tracker.changedIDs);
   161     do_check_attribute_count(tracker.changedIDs, 1);
   162     run_next_test();
   163   });
   165   // Observe expiration.
   166   Services.obs.addObserver(function onExpiration(aSubject, aTopic, aData) {
   167     Services.obs.removeObserver(onExpiration, aTopic);
   168     // Remove the remaining page to update its score.
   169     PlacesUtils.history.removePage(uriToRemove);
   170   }, PlacesUtils.TOPIC_EXPIRATION_FINISHED, false);
   172   // Force expiration of 1 entry.
   173   Services.prefs.setIntPref("places.history.expiration.max_pages", 0);
   174   Cc["@mozilla.org/places/expiration;1"]
   175     .getService(Ci.nsIObserver)
   176     .observe(null, "places-debug-start-expiration", 1);
   177 });
   179 add_test(function test_stop_tracking() {
   180   _("Let's stop tracking again.");
   181   tracker.clearChangedIDs();
   182   Svc.Obs.notify("weave:engine:stop-tracking");
   183   addVisit();
   184   Utils.nextTick(function() {
   185     do_check_empty(tracker.changedIDs);
   186     run_next_test();
   187   });
   188 });
   190 add_test(function test_stop_tracking_twice() {
   191   _("Notifying twice won't do any harm.");
   192   Svc.Obs.notify("weave:engine:stop-tracking");
   193   addVisit();
   194   Utils.nextTick(function() {
   195     do_check_empty(tracker.changedIDs);
   196     run_next_test();
   197   });
   198 });
   200 add_test(function cleanup() {
   201    _("Clean up.");
   202   PlacesUtils.history.removeAllPages();
   203   run_next_test();
   204 });

mercurial