OLD | NEW |
1 (function() | 1 (function() |
2 { | 2 { |
3 let testRunner = null; | 3 let testRunner = null; |
4 let server = null; | 4 let requestHandlers = null; |
5 let randomResult = 0.5; | 5 let randomResult = 0.5; |
6 | 6 |
7 module("Synchronizer", { | 7 module("Synchronizer", { |
8 setup: function() | 8 setup: function() |
9 { | 9 { |
10 testRunner = this; | 10 testRunner = this; |
11 | 11 |
12 prepareFilterComponents.call(this); | 12 prepareFilterComponents.call(this); |
13 preparePrefs.call(this); | 13 preparePrefs.call(this); |
14 setupVirtualTime.call(this, function(wrapTimer) | 14 setupVirtualTime.call(this, function(wrapTimer) |
15 { | 15 { |
16 let SynchronizerModule = getModuleGlobal("synchronizer"); | 16 let SynchronizerModule = getModuleGlobal("synchronizer"); |
17 SynchronizerModule.downloader._timer = wrapTimer(SynchronizerModule.down
loader._timer); | 17 SynchronizerModule.downloader._timer = wrapTimer(SynchronizerModule.down
loader._timer); |
18 }, "synchronizer", "downloader"); | 18 }, "synchronizer", "downloader"); |
19 | 19 setupVirtualXMLHttp.call(this, "synchronizer", "downloader"); |
20 server = new nsHttpServer(); | |
21 server.start(1234); | |
22 | 20 |
23 // Replace Math.random() function | 21 // Replace Math.random() function |
24 let DownloaderGlobal = Cu.getGlobalForObject(getModuleGlobal("downloader")
); | 22 let DownloaderGlobal = Cu.getGlobalForObject(getModuleGlobal("downloader")
); |
25 this._origRandom = DownloaderGlobal.Math.random; | 23 this._origRandom = DownloaderGlobal.Math.random; |
26 DownloaderGlobal.Math.random = function() randomResult; | 24 DownloaderGlobal.Math.random = function() randomResult; |
27 randomResult = 0.5; | 25 randomResult = 0.5; |
28 }, | 26 }, |
29 | 27 |
30 teardown: function() | 28 teardown: function() |
31 { | 29 { |
32 restoreFilterComponents.call(this); | 30 restoreFilterComponents.call(this); |
33 restorePrefs.call(this); | 31 restorePrefs.call(this); |
34 restoreVirtualTime.call(this); | 32 restoreVirtualTime.call(this); |
35 | 33 restoreVirtualXMLHttp.call(this); |
36 stop(); | |
37 server.stop(function() | |
38 { | |
39 server = null; | |
40 start(); | |
41 }); | |
42 | 34 |
43 if (this._origRandom) | 35 if (this._origRandom) |
44 { | 36 { |
45 let DownloaderGlobal = Cu.getGlobalForObject(getModuleGlobal("downloader
")); | 37 let DownloaderGlobal = Cu.getGlobalForObject(getModuleGlobal("downloader
")); |
46 DownloaderGlobal.Math.random = this._origRandom; | 38 DownloaderGlobal.Math.random = this._origRandom; |
47 delete this._origRandom; | 39 delete this._origRandom; |
48 } | 40 } |
49 | 41 |
50 Synchronizer.init(); | 42 Synchronizer.init(); |
51 } | 43 } |
52 }); | 44 }); |
53 | 45 |
54 function resetSubscription(subscription) | 46 function resetSubscription(subscription) |
55 { | 47 { |
56 FilterStorage.updateSubscriptionFilters(subscription, []); | 48 FilterStorage.updateSubscriptionFilters(subscription, []); |
57 subscription.lastCheck = subscription.lastDownload = | 49 subscription.lastCheck = subscription.lastDownload = |
58 subscription.version = subscription.lastSuccess = | 50 subscription.version = subscription.lastSuccess = |
59 subscription.expires = subscription.softExpiration = 0; | 51 subscription.expires = subscription.softExpiration = 0; |
60 subscription.title = ""; | 52 subscription.title = ""; |
61 subscription.homepage = null; | 53 subscription.homepage = null; |
62 subscription.errors = 0; | 54 subscription.errors = 0; |
63 subscription.downloadStatus = null; | 55 subscription.downloadStatus = null; |
64 subscription.requiredVersion = null; | 56 subscription.requiredVersion = null; |
65 } | 57 } |
66 | 58 |
67 test("Downloads of one subscription", function() | 59 test("Downloads of one subscription", function() |
68 { | 60 { |
69 let subscription = Subscription.fromURL("http://127.0.0.1:1234/subscription"
); | 61 let subscription = Subscription.fromURL("http://example.com/subscription"); |
70 FilterStorage.addSubscription(subscription); | 62 FilterStorage.addSubscription(subscription); |
71 | 63 |
72 let requests = []; | 64 let requests = []; |
73 function handler(metadata, response) | 65 testRunner.registerHandler("/subscription", function(metadata) |
74 { | 66 { |
75 requests.push([testRunner.getTimeOffset(), metadata.method, metadata.path]
); | 67 requests.push([testRunner.getTimeOffset(), metadata.method, metadata.path]
); |
76 | 68 return [Cr.NS_OK, 200, "[Adblock]\n! ExPiREs: 1day\nfoo\nbar"]; |
77 response.setStatusLine("1.1", "200", "OK"); | 69 }); |
78 response.setHeader("Content-Type", "text/plain"); | |
79 | |
80 let result = "[Adblock]\n! ExPiREs: 1day\nfoo\nbar"; | |
81 response.bodyOutputStream.write(result, result.length); | |
82 } | |
83 | |
84 server.registerPathHandler("/subscription", handler); | |
85 | 70 |
86 testRunner.runScheduledTasks(50); | 71 testRunner.runScheduledTasks(50); |
87 deepEqual(requests, [ | 72 deepEqual(requests, [ |
88 [0.1, "GET", "/subscription"], | 73 [0.1, "GET", "/subscription"], |
89 [24.1, "GET", "/subscription"], | 74 [24.1, "GET", "/subscription"], |
90 [48.1, "GET", "/subscription"], | 75 [48.1, "GET", "/subscription"], |
91 ], "Requests after 50 hours"); | 76 ], "Requests after 50 hours"); |
92 }); | 77 }); |
93 | 78 |
94 test("Downloads of two subscriptions", function() | 79 test("Downloads of two subscriptions", function() |
95 { | 80 { |
96 let subscription1 = Subscription.fromURL("http://127.0.0.1:1234/subscription
1"); | 81 let subscription1 = Subscription.fromURL("http://example.com/subscription1")
; |
97 FilterStorage.addSubscription(subscription1); | 82 FilterStorage.addSubscription(subscription1); |
98 | 83 |
99 let subscription2 = Subscription.fromURL("http://127.0.0.1:1234/subscription
2"); | 84 let subscription2 = Subscription.fromURL("http://example.com/subscription2")
; |
100 subscription2.expires = | 85 subscription2.expires = |
101 subscription2.softExpiration = | 86 subscription2.softExpiration = |
102 (testRunner.currentTime + 2 * MILLIS_IN_HOUR) / MILLIS_IN_SECOND; | 87 (testRunner.currentTime + 2 * MILLIS_IN_HOUR) / MILLIS_IN_SECOND; |
103 FilterStorage.addSubscription(subscription2); | 88 FilterStorage.addSubscription(subscription2); |
104 | 89 |
105 let requests = []; | 90 let requests = []; |
106 function handler(metadata, response) | 91 function handler(metadata) |
107 { | 92 { |
108 requests.push([testRunner.getTimeOffset(), metadata.method, metadata.path]
); | 93 requests.push([testRunner.getTimeOffset(), metadata.method, metadata.path]
); |
109 | 94 return [Cr.NS_OK, 200, "[Adblock]\n! ExPiREs: 1day\nfoo\nbar"]; |
110 response.setStatusLine("1.1", "200", "OK"); | |
111 response.setHeader("Content-Type", "text/plain"); | |
112 | |
113 let result = "[Adblock]\n! ExPiREs: 1day\nfoo\nbar"; | |
114 response.bodyOutputStream.write(result, result.length); | |
115 } | 95 } |
116 | 96 |
117 server.registerPathHandler("/subscription1", handler); | 97 testRunner.registerHandler("/subscription1", handler); |
118 server.registerPathHandler("/subscription2", handler); | 98 testRunner.registerHandler("/subscription2", handler); |
119 | 99 |
120 testRunner.runScheduledTasks(55); | 100 testRunner.runScheduledTasks(55); |
121 deepEqual(requests, [ | 101 deepEqual(requests, [ |
122 [0.1, "GET", "/subscription1"], | 102 [0.1, "GET", "/subscription1"], |
123 [2.1, "GET", "/subscription2"], | 103 [2.1, "GET", "/subscription2"], |
124 [24.1, "GET", "/subscription1"], | 104 [24.1, "GET", "/subscription1"], |
125 [26.1, "GET", "/subscription2"], | 105 [26.1, "GET", "/subscription2"], |
126 [48.1, "GET", "/subscription1"], | 106 [48.1, "GET", "/subscription1"], |
127 [50.1, "GET", "/subscription2"], | 107 [50.1, "GET", "/subscription2"], |
128 ], "Requests after 55 hours"); | 108 ], "Requests after 55 hours"); |
129 }); | 109 }); |
130 | 110 |
131 test("Download result, various subscription headers", function() | 111 test("Download result, various subscription headers", function() |
132 { | 112 { |
133 let test; | 113 let test; |
134 let subscription = Subscription.fromURL("http://127.0.0.1:1234/subscription"
); | 114 let subscription = Subscription.fromURL("http://example.com/subscription"); |
135 FilterStorage.addSubscription(subscription); | 115 FilterStorage.addSubscription(subscription); |
136 | 116 |
137 function handler(metadata, response) | 117 testRunner.registerHandler("/subscription", function(metadata) |
138 { | 118 { |
139 response.setStatusLine("1.1", "200", "OK"); | 119 return [Cr.NS_OK, 200, test.header + "\n!Expires: 8 hours\nfoo\n!bar\n\n@@
bas\n#bam"]; |
140 | 120 }); |
141 // Wrong content type shouldn't matter | |
142 response.setHeader("Content-Type", "text/xml"); | |
143 | |
144 let result = test.header + "\n!Expires: 8 hours\nfoo\n!bar\n\n@@bas\n#bam"
; | |
145 response.bodyOutputStream.write(result, result.length); | |
146 } | |
147 server.registerPathHandler("/subscription", handler); | |
148 | 121 |
149 let tests = [ | 122 let tests = [ |
150 {header: "[Adblock]", downloadStatus: "synchronize_ok", requiredVersion: n
ull}, | 123 {header: "[Adblock]", downloadStatus: "synchronize_ok", requiredVersion: n
ull}, |
151 {header: "[Adblock Plus]", downloadStatus: "synchronize_ok", requiredVersi
on: null}, | 124 {header: "[Adblock Plus]", downloadStatus: "synchronize_ok", requiredVersi
on: null}, |
152 {header: "(something)[Adblock]", downloadStatus: "synchronize_ok", require
dVersion: null}, | 125 {header: "(something)[Adblock]", downloadStatus: "synchronize_ok", require
dVersion: null}, |
153 {header: "[Adblock Plus 0.0.1]", downloadStatus: "synchronize_ok", require
dVersion: "0.0.1"}, | 126 {header: "[Adblock Plus 0.0.1]", downloadStatus: "synchronize_ok", require
dVersion: "0.0.1"}, |
154 {header: "[Adblock Plus 99.9]", downloadStatus: "synchronize_ok", required
Version: "99.9"}, | 127 {header: "[Adblock Plus 99.9]", downloadStatus: "synchronize_ok", required
Version: "99.9"}, |
155 {header: "[Foo]", downloadStatus: "synchronize_invalid_data", requiredVers
ion: null} | 128 {header: "[Foo]", downloadStatus: "synchronize_invalid_data", requiredVers
ion: null} |
156 ]; | 129 ]; |
157 for each (test in tests) | 130 for each (test in tests) |
(...skipping 18 matching lines...) Expand all Loading... |
176 deepEqual(subscription.filters, [ | 149 deepEqual(subscription.filters, [ |
177 ], "Resulting subscription filters for " + test.header); | 150 ], "Resulting subscription filters for " + test.header); |
178 } | 151 } |
179 } | 152 } |
180 }) | 153 }) |
181 | 154 |
182 test("Automatic updates disabled", function() | 155 test("Automatic updates disabled", function() |
183 { | 156 { |
184 Prefs.subscriptions_autoupdate = false; | 157 Prefs.subscriptions_autoupdate = false; |
185 | 158 |
186 let subscription = Subscription.fromURL("http://127.0.0.1:1234/subscription"
); | 159 let subscription = Subscription.fromURL("http://example.com/subscription"); |
187 FilterStorage.addSubscription(subscription); | 160 FilterStorage.addSubscription(subscription); |
188 | 161 |
189 let requests = 0; | 162 let requests = 0; |
190 function handler(metadata, response) | 163 testRunner.registerHandler("/subscription", function(metadata) |
191 { | 164 { |
192 requests++; | 165 requests++; |
193 throw new Error("Unexpected request"); | 166 throw new Error("Unexpected request"); |
194 } | 167 }); |
195 | |
196 server.registerPathHandler("/subscription", handler); | |
197 | 168 |
198 testRunner.runScheduledTasks(50); | 169 testRunner.runScheduledTasks(50); |
199 equal(requests, 0, "Request count"); | 170 equal(requests, 0, "Request count"); |
200 }); | 171 }); |
201 | 172 |
202 test("Expiration time", function() | 173 test("Expiration time", function() |
203 { | 174 { |
204 let subscription = Subscription.fromURL("http://127.0.0.1:1234/subscription"
); | 175 let subscription = Subscription.fromURL("http://example.com/subscription"); |
205 FilterStorage.addSubscription(subscription); | 176 FilterStorage.addSubscription(subscription); |
206 | 177 |
207 let test; | 178 let test; |
208 let requests = []; | 179 let requests = []; |
209 function handler(metadata, response) | 180 testRunner.registerHandler("/subscription", function(metadata) |
210 { | 181 { |
211 requests.push(testRunner.getTimeOffset()); | 182 requests.push(testRunner.getTimeOffset()); |
212 | 183 return [Cr.NS_OK, 200, "[Adblock]\nfoo\n!Expires: " + test.expiration + "\
nbar"]; |
213 response.setStatusLine("1.1", "200", "OK"); | 184 }); |
214 response.setHeader("Content-Type", "text/plain"); | |
215 | |
216 let result = "[Adblock]\nfoo\n!Expires: " + test.expiration + "\nbar"; | |
217 response.bodyOutputStream.write(result, result.length); | |
218 } | |
219 server.registerPathHandler("/subscription", handler); | |
220 | 185 |
221 let tests = [ | 186 let tests = [ |
222 { | 187 { |
223 expiration: "default", | 188 expiration: "default", |
224 randomResult: 0.5, | 189 randomResult: 0.5, |
225 requests: [0.1, 5 * 24 + 0.1] | 190 requests: [0.1, 5 * 24 + 0.1] |
226 }, | 191 }, |
227 { | 192 { |
228 expiration: "1 hours", // Minimal expiration interval | 193 expiration: "1 hours", // Minimal expiration interval |
229 randomResult: 0.5, | 194 randomResult: 0.5, |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
292 testRunner.runScheduledTasks(maxHours, test.skipAfter, test.skip); | 257 testRunner.runScheduledTasks(maxHours, test.skipAfter, test.skip); |
293 | 258 |
294 let randomAddendum = (randomResult == 0.5 ? "" : " with Math.random() retu
rning " + randomResult); | 259 let randomAddendum = (randomResult == 0.5 ? "" : " with Math.random() retu
rning " + randomResult); |
295 let skipAddendum = (typeof test.skip != "number" ? "" : " skipping " + tes
t.skip + " hours after " + test.skipAfter + " hours"); | 260 let skipAddendum = (typeof test.skip != "number" ? "" : " skipping " + tes
t.skip + " hours after " + test.skipAfter + " hours"); |
296 deepEqual(requests, test.requests, "Requests for \"" + test.expiration + "
\"" + randomAddendum + skipAddendum); | 261 deepEqual(requests, test.requests, "Requests for \"" + test.expiration + "
\"" + randomAddendum + skipAddendum); |
297 } | 262 } |
298 }); | 263 }); |
299 | 264 |
300 test("Checksum verification", function() | 265 test("Checksum verification", function() |
301 { | 266 { |
302 let subscription = Subscription.fromURL("http://127.0.0.1:1234/subscription"
); | 267 let subscription = Subscription.fromURL("http://example.com/subscription"); |
303 FilterStorage.addSubscription(subscription); | 268 FilterStorage.addSubscription(subscription); |
304 | 269 |
305 let testName, subscriptionBody, expectedResult; | 270 let testName, subscriptionBody, expectedResult; |
306 let tests = [ | 271 let tests = [ |
307 ["Correct checksum", "[Adblock]\n! Checksum: e/JCmqXny6Fn24b7JHsq/A\nfoo\n
bar\n", true], | 272 ["Correct checksum", "[Adblock]\n! Checksum: e/JCmqXny6Fn24b7JHsq/A\nfoo\n
bar\n", true], |
308 ["Wrong checksum", "[Adblock]\n! Checksum: wrongggny6Fn24b7JHsq/A\nfoo\nba
r\n", false], | 273 ["Wrong checksum", "[Adblock]\n! Checksum: wrongggny6Fn24b7JHsq/A\nfoo\nba
r\n", false], |
309 ["Empty lines ignored", "[Adblock]\n! Checksum: e/JCmqXny6Fn24b7JHsq/A\n\n
foo\n\nbar\n\n", true], | 274 ["Empty lines ignored", "[Adblock]\n! Checksum: e/JCmqXny6Fn24b7JHsq/A\n\n
foo\n\nbar\n\n", true], |
310 ["CR LF line breaks treated like LR", "[Adblock]\n! Checksum: e/JCmqXny6Fn
24b7JHsq/A\nfoo\r\nbar\r\n", true], | 275 ["CR LF line breaks treated like LR", "[Adblock]\n! Checksum: e/JCmqXny6Fn
24b7JHsq/A\nfoo\r\nbar\r\n", true], |
311 ["CR line breaks treated like LR", "[Adblock]\n! Checksum: e/JCmqXny6Fn24b
7JHsq/A\nfoo\rbar\r", true], | 276 ["CR line breaks treated like LR", "[Adblock]\n! Checksum: e/JCmqXny6Fn24b
7JHsq/A\nfoo\rbar\r", true], |
312 ["Trailing line break not ignored", "[Adblock]\n! Checksum: e/JCmqXny6Fn24
b7JHsq/A\nfoo\nbar", false], | 277 ["Trailing line break not ignored", "[Adblock]\n! Checksum: e/JCmqXny6Fn24
b7JHsq/A\nfoo\nbar", false], |
313 ["Line breaks between lines not ignored", "[Adblock]\n! Checksum: e/JCmqXn
y6Fn24b7JHsq/A\nfoobar", false], | 278 ["Line breaks between lines not ignored", "[Adblock]\n! Checksum: e/JCmqXn
y6Fn24b7JHsq/A\nfoobar", false], |
314 ["Lines with spaces not ignored", "[Adblock]\n! Checksum: e/JCmqXny6Fn24b7
JHsq/A\n \nfoo\n\nbar\n", false], | 279 ["Lines with spaces not ignored", "[Adblock]\n! Checksum: e/JCmqXny6Fn24b7
JHsq/A\n \nfoo\n\nbar\n", false], |
315 ["Extra content in checksum line is part of the checksum", "[Adblock]\n! C
hecksum: e/JCmqXny6Fn24b7JHsq/A foobar\nfoo\nbar\n", false], | 280 ["Extra content in checksum line is part of the checksum", "[Adblock]\n! C
hecksum: e/JCmqXny6Fn24b7JHsq/A foobar\nfoo\nbar\n", false], |
316 ["= symbols after checksum are ignored", "[Adblock]\n! Checksum: e/JCmqXny
6Fn24b7JHsq/A===\nfoo\nbar\n", true], | 281 ["= symbols after checksum are ignored", "[Adblock]\n! Checksum: e/JCmqXny
6Fn24b7JHsq/A===\nfoo\nbar\n", true], |
317 ["Header line is part of the checksum", "[Adblock Plus]\n! Checksum: e/JCm
qXny6Fn24b7JHsq/A\nfoo\nbar\n", false], | 282 ["Header line is part of the checksum", "[Adblock Plus]\n! Checksum: e/JCm
qXny6Fn24b7JHsq/A\nfoo\nbar\n", false], |
318 ["Special comments are part of the checksum", "[Adblock]\n! Checksum: e/JC
mqXny6Fn24b7JHsq/A\n! Expires: 1\nfoo\nbar\n", false], | 283 ["Special comments are part of the checksum", "[Adblock]\n! Checksum: e/JC
mqXny6Fn24b7JHsq/A\n! Expires: 1\nfoo\nbar\n", false], |
319 ]; | 284 ]; |
320 | 285 |
321 function handler(metadata, response) | 286 testRunner.registerHandler("/subscription", function(metadata) |
322 { | 287 { |
323 response.setStatusLine("1.1", "200", "OK"); | 288 return [Cr.NS_OK, 200, subscriptionBody]; |
324 response.setHeader("Content-Type", "text/plain"); | 289 }); |
325 | |
326 response.bodyOutputStream.write(subscriptionBody, subscriptionBody.length)
; | |
327 } | |
328 server.registerPathHandler("/subscription", handler); | |
329 | 290 |
330 for each ([testName, subscriptionBody, expectedResult] in tests) | 291 for each ([testName, subscriptionBody, expectedResult] in tests) |
331 { | 292 { |
332 resetSubscription(subscription); | 293 resetSubscription(subscription); |
333 testRunner.runScheduledTasks(2); | 294 testRunner.runScheduledTasks(2); |
334 equal(subscription.downloadStatus, expectedResult ? "synchronize_ok" : "sy
nchronize_checksum_mismatch", testName); | 295 equal(subscription.downloadStatus, expectedResult ? "synchronize_ok" : "sy
nchronize_checksum_mismatch", testName); |
335 } | 296 } |
336 }); | 297 }); |
337 | 298 |
338 test("Special comments", function() | 299 test("Special comments", function() |
339 { | 300 { |
340 let subscription = Subscription.fromURL("http://127.0.0.1:1234/subscription"
); | 301 let subscription = Subscription.fromURL("http://example.com/subscription"); |
341 FilterStorage.addSubscription(subscription); | 302 FilterStorage.addSubscription(subscription); |
342 | 303 |
343 let comment, check; | 304 let comment, check; |
344 let tests = [ | 305 let tests = [ |
345 ["! Homepage: http://example.com/", function() equal(subscription.homepage
, "http://example.com/", "Valid homepage comment")], | 306 ["! Homepage: http://example.com/", function() equal(subscription.homepage
, "http://example.com/", "Valid homepage comment")], |
346 ["! Homepage: ssh://example.com/", function() equal(subscription.homepage,
null, "Invalid homepage comment")], | 307 ["! Homepage: ssh://example.com/", function() equal(subscription.homepage,
null, "Invalid homepage comment")], |
347 ["! Title: foo", function() | 308 ["! Title: foo", function() |
348 { | 309 { |
349 equal(subscription.title, "foo", "Title comment"); | 310 equal(subscription.title, "foo", "Title comment"); |
350 equal(subscription.fixedTitle, true, "Fixed title"); | 311 equal(subscription.fixedTitle, true, "Fixed title"); |
351 }], | 312 }], |
352 ["! Version: 1234", function() equal(subscription.version, 1234, "Version
comment")] | 313 ["! Version: 1234", function() equal(subscription.version, 1234, "Version
comment")] |
353 ]; | 314 ]; |
354 | 315 |
355 function handler(metadata, response) | 316 testRunner.registerHandler("/subscription", function(metadata) |
356 { | 317 { |
357 response.setStatusLine("1.1", "200", "OK"); | 318 return [Cr.NS_OK, 200, "[Adblock]\n" + comment + "\nfoo\nbar"]; |
358 response.setHeader("Content-Type", "text/plain"); | 319 }); |
359 | |
360 let result = "[Adblock]\n" + comment + "\nfoo\nbar"; | |
361 response.bodyOutputStream.write(result, result.length); | |
362 } | |
363 server.registerPathHandler("/subscription", handler); | |
364 | 320 |
365 for each([comment, check] in tests) | 321 for each([comment, check] in tests) |
366 { | 322 { |
367 resetSubscription(subscription); | 323 resetSubscription(subscription); |
368 testRunner.runScheduledTasks(2); | 324 testRunner.runScheduledTasks(2); |
369 check(); | 325 check(); |
370 deepEqual(subscription.filters, [Filter.fromText("foo"), Filter.fromText("
bar")], "Special comment not added to filters"); | 326 deepEqual(subscription.filters, [Filter.fromText("foo"), Filter.fromText("
bar")], "Special comment not added to filters"); |
371 } | 327 } |
372 }); | 328 }); |
373 | 329 |
374 test("Redirects", function() | 330 test("Redirects", function() |
375 { | 331 { |
376 let subscription = Subscription.fromURL("http://127.0.0.1:1234/subscription"
); | 332 let subscription = Subscription.fromURL("http://example.com/subscription"); |
377 FilterStorage.addSubscription(subscription); | 333 FilterStorage.addSubscription(subscription); |
378 | 334 |
379 function redirect_handler(metadata, response) | 335 testRunner.registerHandler("/subscription", function(metadata) |
380 { | 336 { |
381 response.setStatusLine("1.1", "200", "OK"); | 337 return [Cr.NS_OK, 200, "[Adblock]\nfoo\n!Redirect: http://example.com/redi
rected\nbar"]; |
382 response.setHeader("Content-Type", "text/plain"); | 338 }); |
383 | |
384 let result = "[Adblock]\nfoo\n!Redirect: http://127.0.0.1:1234/redirected\
nbar"; | |
385 response.bodyOutputStream.write(result, result.length); | |
386 } | |
387 server.registerPathHandler("/subscription", redirect_handler); | |
388 | 339 |
389 testRunner.runScheduledTasks(30); | 340 testRunner.runScheduledTasks(30); |
390 equal(FilterStorage.subscriptions[0], subscription, "Invalid redirect ignore
d"); | 341 equal(FilterStorage.subscriptions[0], subscription, "Invalid redirect ignore
d"); |
391 equal(subscription.downloadStatus, "synchronize_connection_error", "Connecti
on error recorded"); | 342 equal(subscription.downloadStatus, "synchronize_connection_error", "Connecti
on error recorded"); |
392 equal(subscription.errors, 2, "Number of download errors"); | 343 equal(subscription.errors, 2, "Number of download errors"); |
393 | 344 |
394 let requests = []; | 345 let requests = []; |
395 function handler(metadata, response) | 346 testRunner.registerHandler("/redirected", function(metadata) |
396 { | 347 { |
397 requests.push(testRunner.getTimeOffset()); | 348 requests.push(testRunner.getTimeOffset()); |
398 | 349 return [Cr.NS_OK, 200, "[Adblock]\nfoo\n! Expires: 8 hours\nbar"]; |
399 response.setStatusLine("1.1", "200", "OK"); | 350 }); |
400 response.setHeader("Content-Type", "text/plain"); | |
401 | |
402 let result = "[Adblock]\nfoo\n! Expires: 8 hours\nbar"; | |
403 response.bodyOutputStream.write(result, result.length); | |
404 } | |
405 server.registerPathHandler("/redirected", handler); | |
406 | 351 |
407 resetSubscription(subscription); | 352 resetSubscription(subscription); |
408 testRunner.runScheduledTasks(15); | 353 testRunner.runScheduledTasks(15); |
409 equal(FilterStorage.subscriptions[0].url, "http://127.0.0.1:1234/redirected"
, "Redirect followed"); | 354 equal(FilterStorage.subscriptions[0].url, "http://example.com/redirected", "
Redirect followed"); |
410 deepEqual(requests, [0.1, 8.1], "Resulting requests"); | 355 deepEqual(requests, [0.1, 8.1], "Resulting requests"); |
411 | 356 |
412 server.registerPathHandler("/redirected", function(metadata, response) | 357 testRunner.registerHandler("/redirected", function(metadata) |
413 { | 358 { |
414 response.setStatusLine("1.1", "200", "OK"); | 359 return [Cr.NS_OK, 200, "[Adblock]\nfoo\n!Redirect: http://example.com/subs
cription\nbar"]; |
415 response.setHeader("Content-Type", "text/plain"); | |
416 | |
417 let result = "[Adblock]\nfoo\n!Redirect: http://127.0.0.1:1234/subscriptio
n\nbar"; | |
418 response.bodyOutputStream.write(result, result.length); | |
419 }) | 360 }) |
420 | 361 |
421 let subscription = Subscription.fromURL("http://127.0.0.1:1234/subscription"
); | 362 let subscription = Subscription.fromURL("http://example.com/subscription"); |
422 resetSubscription(subscription); | 363 resetSubscription(subscription); |
423 FilterStorage.removeSubscription(FilterStorage.subscriptions[0]); | 364 FilterStorage.removeSubscription(FilterStorage.subscriptions[0]); |
424 FilterStorage.addSubscription(subscription); | 365 FilterStorage.addSubscription(subscription); |
425 | 366 |
426 testRunner.runScheduledTasks(2); | 367 testRunner.runScheduledTasks(2); |
427 equal(FilterStorage.subscriptions[0], subscription, "Redirect not followed o
n redirect loop"); | 368 equal(FilterStorage.subscriptions[0], subscription, "Redirect not followed o
n redirect loop"); |
428 equal(subscription.downloadStatus, "synchronize_connection_error", "Download
status after redirect loop"); | 369 equal(subscription.downloadStatus, "synchronize_connection_error", "Download
status after redirect loop"); |
429 }); | 370 }); |
430 | 371 |
431 test("Fallback", function() | 372 test("Fallback", function() |
432 { | 373 { |
433 Prefs.subscriptions_fallbackerrors = 3; | 374 Prefs.subscriptions_fallbackerrors = 3; |
434 Prefs.subscriptions_fallbackurl = "http://127.0.0.1:1234/fallback?%SUBSCRIPT
ION%&%CHANNELSTATUS%&%RESPONSESTATUS%"; | 375 Prefs.subscriptions_fallbackurl = "http://example.com/fallback?%SUBSCRIPTION
%&%CHANNELSTATUS%&%RESPONSESTATUS%"; |
435 | 376 |
436 let subscription = Subscription.fromURL("http://127.0.0.1:1234/subscription"
); | 377 let subscription = Subscription.fromURL("http://example.com/subscription"); |
437 FilterStorage.addSubscription(subscription); | 378 FilterStorage.addSubscription(subscription); |
438 | 379 |
439 // No valid response from fallback | 380 // No valid response from fallback |
440 | 381 |
441 let requests = []; | 382 let requests = []; |
442 function handler(metadata, response) | 383 testRunner.registerHandler("/subscription", function(metadata) |
443 { | 384 { |
444 requests.push(testRunner.getTimeOffset()); | 385 requests.push(testRunner.getTimeOffset()); |
445 | 386 return [Cr.NS_OK, 404, ""]; |
446 response.setStatusLine("1.1", "404", "Not found"); | 387 }); |
447 } | |
448 server.registerPathHandler("/subscription", handler); | |
449 | 388 |
450 testRunner.runScheduledTasks(100); | 389 testRunner.runScheduledTasks(100); |
451 deepEqual(requests, [0.1, 24.1, 48.1, 72.1, 96.1], "Continue trying if the f
allback doesn't respond"); | 390 deepEqual(requests, [0.1, 24.1, 48.1, 72.1, 96.1], "Continue trying if the f
allback doesn't respond"); |
452 | 391 |
453 // Fallback giving "Gone" response | 392 // Fallback giving "Gone" response |
454 | 393 |
455 resetSubscription(subscription); | 394 resetSubscription(subscription); |
456 requests = []; | 395 requests = []; |
457 fallbackParams = null; | 396 fallbackParams = null; |
458 server.registerPathHandler("/fallback", function(metadata, response) | 397 testRunner.registerHandler("/fallback", function(metadata) |
459 { | 398 { |
460 response.setStatusLine("1.1", "200", "OK"); | |
461 fallbackParams = decodeURIComponent(metadata.queryString); | 399 fallbackParams = decodeURIComponent(metadata.queryString); |
462 | 400 return [Cr.NS_OK, 200, "410 Gone"]; |
463 let result = "410 Gone"; | |
464 response.bodyOutputStream.write(result, result.length); | |
465 }); | 401 }); |
466 | 402 |
467 testRunner.runScheduledTasks(100); | 403 testRunner.runScheduledTasks(100); |
468 deepEqual(requests, [0.1, 24.1, 48.1], "Stop trying if the fallback responds
with Gone"); | 404 deepEqual(requests, [0.1, 24.1, 48.1], "Stop trying if the fallback responds
with Gone"); |
469 equal(fallbackParams, "http://127.0.0.1:1234/subscription&0&404", "Fallback
arguments"); | 405 equal(fallbackParams, "http://example.com/subscription&0&404", "Fallback arg
uments"); |
470 | 406 |
471 // Fallback redirecting to a missing file | 407 // Fallback redirecting to a missing file |
472 | 408 |
473 subscription = Subscription.fromURL("http://127.0.0.1:1234/subscription"); | 409 subscription = Subscription.fromURL("http://example.com/subscription"); |
474 resetSubscription(subscription); | 410 resetSubscription(subscription); |
475 FilterStorage.removeSubscription(FilterStorage.subscriptions[0]); | 411 FilterStorage.removeSubscription(FilterStorage.subscriptions[0]); |
476 FilterStorage.addSubscription(subscription); | 412 FilterStorage.addSubscription(subscription); |
477 requests = []; | 413 requests = []; |
478 | 414 |
479 server.registerPathHandler("/fallback", function(metadata, response) | 415 testRunner.registerHandler("/fallback", function(metadata) |
480 { | 416 { |
481 response.setStatusLine("1.1", "200", "OK"); | 417 return [Cr.NS_OK, 200, "301 http://example.com/redirected"]; |
482 | 418 }); |
483 let result = "301 http://127.0.0.1:1234/redirected"; | 419 testRunner.runScheduledTasks(100); |
484 response.bodyOutputStream.write(result, result.length); | 420 equal(FilterStorage.subscriptions[0].url, "http://example.com/subscription",
"Ignore invalid redirect from fallback"); |
485 }); | |
486 testRunner.runScheduledTasks(100); | |
487 equal(FilterStorage.subscriptions[0].url, "http://127.0.0.1:1234/subscriptio
n", "Ignore invalid redirect from fallback"); | |
488 deepEqual(requests, [0.1, 24.1, 48.1, 72.1, 96.1], "Requests not affected by
invalid redirect"); | 421 deepEqual(requests, [0.1, 24.1, 48.1, 72.1, 96.1], "Requests not affected by
invalid redirect"); |
489 | 422 |
490 // Fallback redirecting to an existing file | 423 // Fallback redirecting to an existing file |
491 | 424 |
492 resetSubscription(subscription); | 425 resetSubscription(subscription); |
493 requests = []; | 426 requests = []; |
494 let redirectedRequests = []; | 427 let redirectedRequests = []; |
495 server.registerPathHandler("/redirected", function(metadata, response) | 428 testRunner.registerHandler("/redirected", function(metadata) |
496 { | 429 { |
497 redirectedRequests.push(testRunner.getTimeOffset()); | 430 redirectedRequests.push(testRunner.getTimeOffset()); |
498 | 431 return [Cr.NS_OK, 200, "[Adblock]\n!Expires: 1day\nfoo\nbar"]; |
499 response.setStatusLine("1.1", "200", "OK"); | 432 }); |
500 response.setHeader("Content-Type", "text/plain"); | 433 |
501 | 434 testRunner.runScheduledTasks(100); |
502 let result = "[Adblock]\n!Expires: 1day\nfoo\nbar"; | 435 equal(FilterStorage.subscriptions[0].url, "http://example.com/redirected", "
Valid redirect from fallback is followed"); |
503 response.bodyOutputStream.write(result, result.length); | |
504 }); | |
505 | |
506 testRunner.runScheduledTasks(100); | |
507 equal(FilterStorage.subscriptions[0].url, "http://127.0.0.1:1234/redirected"
, "Valid redirect from fallback is followed"); | |
508 deepEqual(requests, [0.1, 24.1, 48.1], "Stop polling original URL after a va
lid redirect from fallback"); | 436 deepEqual(requests, [0.1, 24.1, 48.1], "Stop polling original URL after a va
lid redirect from fallback"); |
509 deepEqual(redirectedRequests, [48.1, 72.1, 96.1], "Request new URL after a v
alid redirect from fallback"); | 437 deepEqual(redirectedRequests, [48.1, 72.1, 96.1], "Request new URL after a v
alid redirect from fallback"); |
510 | 438 |
511 // Checksum mismatch | 439 // Checksum mismatch |
512 | 440 |
513 function handler2(metadata, response) | 441 testRunner.registerHandler("/subscription", function(metadata) |
514 { | 442 { |
515 response.setStatusLine("1.1", "200", "OK"); | 443 return [Cr.NS_OK, 200, "[Adblock]\n! Checksum: wrong\nfoo\nbar"]; |
516 response.setHeader("Content-Type", "text/plain"); | 444 }); |
517 | 445 |
518 let result = "[Adblock]\n! Checksum: wrong\nfoo\nbar"; | 446 subscription = Subscription.fromURL("http://example.com/subscription"); |
519 response.bodyOutputStream.write(result, result.length); | 447 resetSubscription(subscription); |
520 } | 448 FilterStorage.removeSubscription(FilterStorage.subscriptions[0]); |
521 server.registerPathHandler("/subscription", handler2); | 449 FilterStorage.addSubscription(subscription); |
522 | 450 |
523 subscription = Subscription.fromURL("http://127.0.0.1:1234/subscription"); | 451 testRunner.runScheduledTasks(100); |
524 resetSubscription(subscription); | 452 equal(FilterStorage.subscriptions[0].url, "http://example.com/redirected", "
Wrong checksum produces fallback request"); |
525 FilterStorage.removeSubscription(FilterStorage.subscriptions[0]); | |
526 FilterStorage.addSubscription(subscription); | |
527 | |
528 testRunner.runScheduledTasks(100); | |
529 equal(FilterStorage.subscriptions[0].url, "http://127.0.0.1:1234/redirected"
, "Wrong checksum produces fallback request"); | |
530 | 453 |
531 // Redirect loop | 454 // Redirect loop |
532 | 455 |
533 server.registerPathHandler("/subscription", function(metadata, response) | 456 testRunner.registerHandler("/subscription", function(metadata) |
534 { | 457 { |
535 response.setStatusLine("1.1", "200", "OK"); | 458 return [Cr.NS_OK, 200, "[Adblock]\n! Redirect: http://example.com/subscrip
tion2"]; |
536 response.setHeader("Content-Type", "text/plain"); | 459 }); |
537 | 460 testRunner.registerHandler("/subscription2", function(metadata, response) |
538 let result = "[Adblock]\n! Redirect: http://127.0.0.1:1234/subscription2"; | 461 { |
539 response.bodyOutputStream.write(result, result.length); | 462 return [Cr.NS_OK, 200, "[Adblock]\n! Redirect: http://example.com/subscrip
tion"]; |
540 }); | 463 }); |
541 server.registerPathHandler("/subscription2", function(metadata, response) | 464 |
542 { | 465 subscription = Subscription.fromURL("http://example.com/subscription"); |
543 response.setStatusLine("1.1", "200", "OK"); | 466 resetSubscription(subscription); |
544 response.setHeader("Content-Type", "text/plain"); | 467 FilterStorage.removeSubscription(FilterStorage.subscriptions[0]); |
545 | 468 FilterStorage.addSubscription(subscription); |
546 let result = "[Adblock]\n! Redirect: http://127.0.0.1:1234/subscription"; | 469 |
547 response.bodyOutputStream.write(result, result.length); | 470 testRunner.runScheduledTasks(100); |
548 }); | 471 equal(FilterStorage.subscriptions[0].url, "http://example.com/redirected", "
Fallback can still redirect even after a redirect loop"); |
549 | |
550 subscription = Subscription.fromURL("http://127.0.0.1:1234/subscription"); | |
551 resetSubscription(subscription); | |
552 FilterStorage.removeSubscription(FilterStorage.subscriptions[0]); | |
553 FilterStorage.addSubscription(subscription); | |
554 | |
555 testRunner.runScheduledTasks(100); | |
556 equal(FilterStorage.subscriptions[0].url, "http://127.0.0.1:1234/redirected"
, "Fallback can still redirect even after a redirect loop"); | |
557 }); | 472 }); |
558 | 473 |
559 test("State fields", function() | 474 test("State fields", function() |
560 { | 475 { |
561 let subscription = Subscription.fromURL("http://127.0.0.1:1234/subscription"
); | 476 let subscription = Subscription.fromURL("http://example.com/subscription"); |
562 FilterStorage.addSubscription(subscription); | 477 FilterStorage.addSubscription(subscription); |
563 | 478 |
564 server.registerPathHandler("/subscription", function successHandler(metadata
, response) | 479 testRunner.registerHandler("/subscription", function(metadata) |
565 { | 480 { |
566 response.setStatusLine("1.1", "200", "OK"); | 481 return [Cr.NS_OK, 200, "[Adblock]\n! Expires: 2 hours\nfoo\nbar"]; |
567 response.setHeader("Content-Type", "text/plain"); | |
568 | |
569 let result = "[Adblock]\n! Expires: 2 hours\nfoo\nbar"; | |
570 response.bodyOutputStream.write(result, result.length); | |
571 }); | 482 }); |
572 | 483 |
573 let startTime = testRunner.currentTime; | 484 let startTime = testRunner.currentTime; |
574 testRunner.runScheduledTasks(2); | 485 testRunner.runScheduledTasks(2); |
575 | 486 |
576 equal(subscription.downloadStatus, "synchronize_ok", "downloadStatus after s
uccessful download"); | 487 equal(subscription.downloadStatus, "synchronize_ok", "downloadStatus after s
uccessful download"); |
577 equal(subscription.lastDownload * MILLIS_IN_SECOND, startTime + 0.1 * MILLIS
_IN_HOUR, "lastDownload after successful download"); | 488 equal(subscription.lastDownload * MILLIS_IN_SECOND, startTime + 0.1 * MILLIS
_IN_HOUR, "lastDownload after successful download"); |
578 equal(subscription.lastSuccess * MILLIS_IN_SECOND, startTime + 0.1 * MILLIS_
IN_HOUR, "lastSuccess after successful download"); | 489 equal(subscription.lastSuccess * MILLIS_IN_SECOND, startTime + 0.1 * MILLIS_
IN_HOUR, "lastSuccess after successful download"); |
579 equal(subscription.lastCheck * MILLIS_IN_SECOND, startTime + 1.1 * MILLIS_IN
_HOUR, "lastCheck after successful download"); | 490 equal(subscription.lastCheck * MILLIS_IN_SECOND, startTime + 1.1 * MILLIS_IN
_HOUR, "lastCheck after successful download"); |
580 equal(subscription.errors, 0, "errors after successful download"); | 491 equal(subscription.errors, 0, "errors after successful download"); |
581 | 492 |
582 server.registerPathHandler("/subscription", function errorHandler(metadata,
response) | 493 testRunner.registerHandler("/subscription", function(metadata) |
583 { | 494 { |
584 response.setStatusLine("1.1", "404", "Not Found"); | 495 return [Cr.NS_ERROR_FAILURE, 0, ""]; |
585 }); | 496 }); |
586 | 497 |
587 testRunner.runScheduledTasks(2); | 498 testRunner.runScheduledTasks(2); |
588 | 499 |
| 500 equal(subscription.downloadStatus, "synchronize_connection_error", "download
Status after connection error"); |
| 501 equal(subscription.lastDownload * MILLIS_IN_SECOND, startTime + 2.1 * MILLIS
_IN_HOUR, "lastDownload after connection error"); |
| 502 equal(subscription.lastSuccess * MILLIS_IN_SECOND, startTime + 0.1 * MILLIS_
IN_HOUR, "lastSuccess after connection error"); |
| 503 equal(subscription.lastCheck * MILLIS_IN_SECOND, startTime + 3.1 * MILLIS_IN
_HOUR, "lastCheck after connection error"); |
| 504 equal(subscription.errors, 1, "errors after connection error"); |
| 505 |
| 506 testRunner.registerHandler("/subscription", function(metadata) |
| 507 { |
| 508 return [Cr.NS_OK, 404, ""]; |
| 509 }); |
| 510 |
| 511 testRunner.runScheduledTasks(24); |
| 512 |
589 equal(subscription.downloadStatus, "synchronize_connection_error", "download
Status after download error"); | 513 equal(subscription.downloadStatus, "synchronize_connection_error", "download
Status after download error"); |
590 equal(subscription.lastDownload * MILLIS_IN_SECOND, startTime + 2.1 * MILLIS
_IN_HOUR, "lastDownload after download error"); | 514 equal(subscription.lastDownload * MILLIS_IN_SECOND, startTime + 26.1 * MILLI
S_IN_HOUR, "lastDownload after download error"); |
591 equal(subscription.lastSuccess * MILLIS_IN_SECOND, startTime + 0.1 * MILLIS_
IN_HOUR, "lastSuccess after download error"); | 515 equal(subscription.lastSuccess * MILLIS_IN_SECOND, startTime + 0.1 * MILLIS_
IN_HOUR, "lastSuccess after download error"); |
592 equal(subscription.lastCheck * MILLIS_IN_SECOND, startTime + 3.1 * MILLIS_IN
_HOUR, "lastCheck after download error"); | 516 equal(subscription.lastCheck * MILLIS_IN_SECOND, startTime + 27.1 * MILLIS_I
N_HOUR, "lastCheck after download error"); |
593 equal(subscription.errors, 1, "errors after download error"); | 517 equal(subscription.errors, 2, "errors after download error"); |
594 }); | 518 }); |
595 })(); | 519 })(); |
OLD | NEW |