Thu, 22 Jan 2015 13:21:57 +0100
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 });