| OLD | NEW |
| (Empty) |
| 1 (function() | |
| 2 { | |
| 3 let testRunner = null; | |
| 4 let requestHandlers = null; | |
| 5 let randomResult = 0.5; | |
| 6 | |
| 7 module("Synchronizer", { | |
| 8 setup: function() | |
| 9 { | |
| 10 testRunner = this; | |
| 11 | |
| 12 prepareFilterComponents.call(this); | |
| 13 preparePrefs.call(this); | |
| 14 | |
| 15 Synchronizer.init(); | |
| 16 | |
| 17 setupVirtualTime.call(this, function(wrapTimer) | |
| 18 { | |
| 19 let SynchronizerModule = getModuleGlobal("synchronizer"); | |
| 20 SynchronizerModule.downloader._timer = wrapTimer(SynchronizerModule.down
loader._timer); | |
| 21 }, "synchronizer", "downloader"); | |
| 22 setupVirtualXMLHttp.call(this, "synchronizer", "downloader"); | |
| 23 | |
| 24 // Replace Math.random() function | |
| 25 let DownloaderGlobal = Cu.getGlobalForObject(getModuleGlobal("downloader")
); | |
| 26 this._origRandom = DownloaderGlobal.Math.random; | |
| 27 DownloaderGlobal.Math.random = () => randomResult; | |
| 28 randomResult = 0.5; | |
| 29 }, | |
| 30 | |
| 31 teardown: function() | |
| 32 { | |
| 33 restoreFilterComponents.call(this); | |
| 34 restorePrefs.call(this); | |
| 35 restoreVirtualTime.call(this); | |
| 36 restoreVirtualXMLHttp.call(this); | |
| 37 | |
| 38 if (this._origRandom) | |
| 39 { | |
| 40 let DownloaderGlobal = Cu.getGlobalForObject(getModuleGlobal("downloader
")); | |
| 41 DownloaderGlobal.Math.random = this._origRandom; | |
| 42 delete this._origRandom; | |
| 43 } | |
| 44 | |
| 45 Synchronizer.init(); | |
| 46 } | |
| 47 }); | |
| 48 | |
| 49 function resetSubscription(subscription) | |
| 50 { | |
| 51 FilterStorage.updateSubscriptionFilters(subscription, []); | |
| 52 subscription.lastCheck = subscription.lastDownload = | |
| 53 subscription.version = subscription.lastSuccess = | |
| 54 subscription.expires = subscription.softExpiration = 0; | |
| 55 subscription.title = ""; | |
| 56 subscription.homepage = null; | |
| 57 subscription.errors = 0; | |
| 58 subscription.downloadStatus = null; | |
| 59 subscription.requiredVersion = null; | |
| 60 } | |
| 61 | |
| 62 let initialDelay = 1 / 60; | |
| 63 | |
| 64 test("Downloads of one subscription", function() | |
| 65 { | |
| 66 let subscription = Subscription.fromURL("http://example.com/subscription"); | |
| 67 FilterStorage.addSubscription(subscription); | |
| 68 | |
| 69 let requests = []; | |
| 70 testRunner.registerHandler("/subscription", function(metadata) | |
| 71 { | |
| 72 requests.push([testRunner.getTimeOffset(), metadata.method, metadata.path]
); | |
| 73 return [Cr.NS_OK, 200, "[Adblock]\n! ExPiREs: 1day\nfoo\nbar"]; | |
| 74 }); | |
| 75 | |
| 76 testRunner.runScheduledTasks(50); | |
| 77 deepEqual(requests, [ | |
| 78 [0 + initialDelay, "GET", "/subscription"], | |
| 79 [24 + initialDelay, "GET", "/subscription"], | |
| 80 [48 + initialDelay, "GET", "/subscription"], | |
| 81 ], "Requests after 50 hours"); | |
| 82 }); | |
| 83 | |
| 84 test("Downloads of two subscriptions", function() | |
| 85 { | |
| 86 let subscription1 = Subscription.fromURL("http://example.com/subscription1")
; | |
| 87 FilterStorage.addSubscription(subscription1); | |
| 88 | |
| 89 let subscription2 = Subscription.fromURL("http://example.com/subscription2")
; | |
| 90 subscription2.expires = | |
| 91 subscription2.softExpiration = | |
| 92 (testRunner.currentTime + 2 * MILLIS_IN_HOUR) / MILLIS_IN_SECOND; | |
| 93 FilterStorage.addSubscription(subscription2); | |
| 94 | |
| 95 let requests = []; | |
| 96 function handler(metadata) | |
| 97 { | |
| 98 requests.push([testRunner.getTimeOffset(), metadata.method, metadata.path]
); | |
| 99 return [Cr.NS_OK, 200, "[Adblock]\n! ExPiREs: 1day\nfoo\nbar"]; | |
| 100 } | |
| 101 | |
| 102 testRunner.registerHandler("/subscription1", handler); | |
| 103 testRunner.registerHandler("/subscription2", handler); | |
| 104 | |
| 105 testRunner.runScheduledTasks(55); | |
| 106 deepEqual(requests, [ | |
| 107 [0 + initialDelay, "GET", "/subscription1"], | |
| 108 [2 + initialDelay, "GET", "/subscription2"], | |
| 109 [24 + initialDelay, "GET", "/subscription1"], | |
| 110 [26 + initialDelay, "GET", "/subscription2"], | |
| 111 [48 + initialDelay, "GET", "/subscription1"], | |
| 112 [50 + initialDelay, "GET", "/subscription2"], | |
| 113 ], "Requests after 55 hours"); | |
| 114 }); | |
| 115 | |
| 116 test("Download result, various subscription headers", function() | |
| 117 { | |
| 118 let test; | |
| 119 let subscription = Subscription.fromURL("http://example.com/subscription"); | |
| 120 FilterStorage.addSubscription(subscription); | |
| 121 | |
| 122 testRunner.registerHandler("/subscription", function(metadata) | |
| 123 { | |
| 124 return [Cr.NS_OK, 200, test.header + "\n!Expires: 8 hours\nfoo\n!bar\n\n@@
bas\n#bam"]; | |
| 125 }); | |
| 126 | |
| 127 let tests = [ | |
| 128 {header: "[Adblock]", downloadStatus: "synchronize_ok", requiredVersion: n
ull}, | |
| 129 {header: "[Adblock Plus]", downloadStatus: "synchronize_ok", requiredVersi
on: null}, | |
| 130 {header: "(something)[Adblock]", downloadStatus: "synchronize_ok", require
dVersion: null}, | |
| 131 {header: "[Adblock Plus 0.0.1]", downloadStatus: "synchronize_ok", require
dVersion: "0.0.1"}, | |
| 132 {header: "[Adblock Plus 99.9]", downloadStatus: "synchronize_ok", required
Version: "99.9"}, | |
| 133 {header: "[Foo]", downloadStatus: "synchronize_invalid_data", requiredVers
ion: null} | |
| 134 ]; | |
| 135 for (test of tests) | |
| 136 { | |
| 137 resetSubscription(subscription) | |
| 138 testRunner.runScheduledTasks(2); | |
| 139 | |
| 140 equal(subscription.downloadStatus, test.downloadStatus, "Download status f
or " + test.header) | |
| 141 equal(subscription.requiredVersion, test.requiredVersion, "Required versio
n for " + test.header) | |
| 142 | |
| 143 if (test.downloadStatus == "synchronize_ok") | |
| 144 { | |
| 145 deepEqual(subscription.filters, [ | |
| 146 Filter.fromText("foo"), | |
| 147 Filter.fromText("!bar"), | |
| 148 Filter.fromText("@@bas"), | |
| 149 Filter.fromText("#bam"), | |
| 150 ], "Resulting subscription filters for " + test.header); | |
| 151 } | |
| 152 else | |
| 153 { | |
| 154 deepEqual(subscription.filters, [ | |
| 155 ], "Resulting subscription filters for " + test.header); | |
| 156 } | |
| 157 } | |
| 158 }) | |
| 159 | |
| 160 test("Automatic updates disabled", function() | |
| 161 { | |
| 162 Prefs.subscriptions_autoupdate = false; | |
| 163 | |
| 164 let subscription = Subscription.fromURL("http://example.com/subscription"); | |
| 165 FilterStorage.addSubscription(subscription); | |
| 166 | |
| 167 let requests = 0; | |
| 168 testRunner.registerHandler("/subscription", function(metadata) | |
| 169 { | |
| 170 requests++; | |
| 171 throw new Error("Unexpected request"); | |
| 172 }); | |
| 173 | |
| 174 testRunner.runScheduledTasks(50); | |
| 175 equal(requests, 0, "Request count"); | |
| 176 }); | |
| 177 | |
| 178 test("Expiration time", function() | |
| 179 { | |
| 180 let subscription = Subscription.fromURL("http://example.com/subscription"); | |
| 181 FilterStorage.addSubscription(subscription); | |
| 182 | |
| 183 let test; | |
| 184 let requests = []; | |
| 185 testRunner.registerHandler("/subscription", function(metadata) | |
| 186 { | |
| 187 requests.push(testRunner.getTimeOffset()); | |
| 188 return [Cr.NS_OK, 200, "[Adblock]\nfoo\n!Expires: " + test.expiration + "\
nbar"]; | |
| 189 }); | |
| 190 | |
| 191 let tests = [ | |
| 192 { | |
| 193 expiration: "default", | |
| 194 randomResult: 0.5, | |
| 195 requests: [0 + initialDelay, 5 * 24 + initialDelay] | |
| 196 }, | |
| 197 { | |
| 198 expiration: "1 hours", // Minimal expiration interval | |
| 199 randomResult: 0.5, | |
| 200 requests: [0 + initialDelay, 1 + initialDelay, 2 + initialDelay, 3 + ini
tialDelay] | |
| 201 }, | |
| 202 { | |
| 203 expiration: "26 hours", | |
| 204 randomResult: 0.5, | |
| 205 requests: [0 + initialDelay, 26 + initialDelay] | |
| 206 }, | |
| 207 { | |
| 208 expiration: "2 days", | |
| 209 randomResult: 0.5, | |
| 210 requests: [0 + initialDelay, 48 + initialDelay] | |
| 211 }, | |
| 212 { | |
| 213 expiration: "20 days", // Too large, will be corrected | |
| 214 randomResult: 0.5, | |
| 215 requests: [0 + initialDelay, 14 * 24 + initialDelay] | |
| 216 }, | |
| 217 { | |
| 218 expiration: "35 hours", | |
| 219 randomResult: 0, // Changes interval by factor 0.8 | |
| 220 requests: [0 + initialDelay, 28 + initialDelay] | |
| 221 }, | |
| 222 { | |
| 223 expiration: "35 hours", | |
| 224 randomResult: 1, // Changes interval by factor 1.2 | |
| 225 requests: [0 + initialDelay, 42 + initialDelay] | |
| 226 }, | |
| 227 { | |
| 228 expiration: "35 hours", | |
| 229 randomResult: 0.25, // Changes interval by factor 0.9 | |
| 230 requests: [0 + initialDelay, 32 + initialDelay] | |
| 231 }, | |
| 232 { | |
| 233 expiration: "40 hours", | |
| 234 randomResult: 0.5, | |
| 235 skipAfter: 5 + initialDelay, | |
| 236 skip: 10, // Short break should not increase soft expirati
on | |
| 237 requests: [0 + initialDelay, 40 + initialDelay] | |
| 238 }, | |
| 239 { | |
| 240 expiration: "40 hours", | |
| 241 randomResult: 0.5, | |
| 242 skipAfter: 5 + initialDelay, | |
| 243 skip: 30, // Long break should increase soft expiration | |
| 244 requests: [0 + initialDelay, 70 + initialDelay] | |
| 245 }, | |
| 246 { | |
| 247 expiration: "40 hours", | |
| 248 randomResult: 0.5, | |
| 249 skipAfter: 5 + initialDelay, | |
| 250 skip: 80, // Hitting hard expiration, immediate download | |
| 251 requests: [0 + initialDelay, 85 + initialDelay] | |
| 252 } | |
| 253 ] | |
| 254 | |
| 255 for (test of tests) | |
| 256 { | |
| 257 requests = []; | |
| 258 randomResult = test.randomResult; | |
| 259 resetSubscription(subscription); | |
| 260 | |
| 261 let maxHours = Math.round(Math.max.apply(null, test.requests)) + 1; | |
| 262 testRunner.runScheduledTasks(maxHours, test.skipAfter, test.skip); | |
| 263 | |
| 264 let randomAddendum = (randomResult == 0.5 ? "" : " with Math.random() retu
rning " + randomResult); | |
| 265 let skipAddendum = (typeof test.skip != "number" ? "" : " skipping " + tes
t.skip + " hours after " + test.skipAfter + " hours"); | |
| 266 deepEqual(requests, test.requests, "Requests for \"" + test.expiration + "
\"" + randomAddendum + skipAddendum); | |
| 267 } | |
| 268 }); | |
| 269 | |
| 270 test("Checksum verification", function() | |
| 271 { | |
| 272 let subscription = Subscription.fromURL("http://example.com/subscription"); | |
| 273 FilterStorage.addSubscription(subscription); | |
| 274 | |
| 275 let testName, subscriptionBody, expectedResult; | |
| 276 let tests = [ | |
| 277 ["Correct checksum", "[Adblock]\n! Checksum: e/JCmqXny6Fn24b7JHsq/A\nfoo\n
bar\n", true], | |
| 278 ["Wrong checksum", "[Adblock]\n! Checksum: wrongggny6Fn24b7JHsq/A\nfoo\nba
r\n", false], | |
| 279 ["Empty lines ignored", "[Adblock]\n! Checksum: e/JCmqXny6Fn24b7JHsq/A\n\n
foo\n\nbar\n\n", true], | |
| 280 ["CR LF line breaks treated like LR", "[Adblock]\n! Checksum: e/JCmqXny6Fn
24b7JHsq/A\nfoo\r\nbar\r\n", true], | |
| 281 ["CR line breaks treated like LR", "[Adblock]\n! Checksum: e/JCmqXny6Fn24b
7JHsq/A\nfoo\rbar\r", true], | |
| 282 ["Trailing line break not ignored", "[Adblock]\n! Checksum: e/JCmqXny6Fn24
b7JHsq/A\nfoo\nbar", false], | |
| 283 ["Line breaks between lines not ignored", "[Adblock]\n! Checksum: e/JCmqXn
y6Fn24b7JHsq/A\nfoobar", false], | |
| 284 ["Lines with spaces not ignored", "[Adblock]\n! Checksum: e/JCmqXny6Fn24b7
JHsq/A\n \nfoo\n\nbar\n", false], | |
| 285 ["Extra content in checksum line is part of the checksum", "[Adblock]\n! C
hecksum: e/JCmqXny6Fn24b7JHsq/A foobar\nfoo\nbar\n", false], | |
| 286 ["= symbols after checksum are ignored", "[Adblock]\n! Checksum: e/JCmqXny
6Fn24b7JHsq/A===\nfoo\nbar\n", true], | |
| 287 ["Header line is part of the checksum", "[Adblock Plus]\n! Checksum: e/JCm
qXny6Fn24b7JHsq/A\nfoo\nbar\n", false], | |
| 288 ["Special comments are part of the checksum", "[Adblock]\n! Checksum: e/JC
mqXny6Fn24b7JHsq/A\n! Expires: 1\nfoo\nbar\n", false], | |
| 289 ]; | |
| 290 | |
| 291 testRunner.registerHandler("/subscription", function(metadata) | |
| 292 { | |
| 293 return [Cr.NS_OK, 200, subscriptionBody]; | |
| 294 }); | |
| 295 | |
| 296 for ([testName, subscriptionBody, expectedResult] of tests) | |
| 297 { | |
| 298 resetSubscription(subscription); | |
| 299 testRunner.runScheduledTasks(2); | |
| 300 equal(subscription.downloadStatus, expectedResult ? "synchronize_ok" : "sy
nchronize_checksum_mismatch", testName); | |
| 301 } | |
| 302 }); | |
| 303 | |
| 304 test("Special comments", function() | |
| 305 { | |
| 306 let subscription = Subscription.fromURL("http://example.com/subscription"); | |
| 307 FilterStorage.addSubscription(subscription); | |
| 308 | |
| 309 let comment, check; | |
| 310 let tests = [ | |
| 311 ["! Homepage: http://example.com/", () => equal(subscription.homepage, "ht
tp://example.com/", "Valid homepage comment")], | |
| 312 ["! Homepage: ssh://example.com/", () => equal(subscription.homepage, null
, "Invalid homepage comment")], | |
| 313 ["! Title: foo", function() | |
| 314 { | |
| 315 equal(subscription.title, "foo", "Title comment"); | |
| 316 equal(subscription.fixedTitle, true, "Fixed title"); | |
| 317 }], | |
| 318 ["! Version: 1234", () => equal(subscription.version, 1234, "Version comme
nt")] | |
| 319 ]; | |
| 320 | |
| 321 testRunner.registerHandler("/subscription", function(metadata) | |
| 322 { | |
| 323 return [Cr.NS_OK, 200, "[Adblock]\n" + comment + "\nfoo\nbar"]; | |
| 324 }); | |
| 325 | |
| 326 for ([comment, check] of tests) | |
| 327 { | |
| 328 resetSubscription(subscription); | |
| 329 testRunner.runScheduledTasks(2); | |
| 330 check(); | |
| 331 deepEqual(subscription.filters, [Filter.fromText("foo"), Filter.fromText("
bar")], "Special comment not added to filters"); | |
| 332 } | |
| 333 }); | |
| 334 | |
| 335 test("Redirects", function() | |
| 336 { | |
| 337 let subscription = Subscription.fromURL("http://example.com/subscription"); | |
| 338 FilterStorage.addSubscription(subscription); | |
| 339 | |
| 340 testRunner.registerHandler("/subscription", function(metadata) | |
| 341 { | |
| 342 return [Cr.NS_OK, 200, "[Adblock]\nfoo\n!Redirect: http://example.com/redi
rected\nbar"]; | |
| 343 }); | |
| 344 | |
| 345 testRunner.runScheduledTasks(30); | |
| 346 equal(FilterStorage.subscriptions[0], subscription, "Invalid redirect ignore
d"); | |
| 347 equal(subscription.downloadStatus, "synchronize_connection_error", "Connecti
on error recorded"); | |
| 348 equal(subscription.errors, 2, "Number of download errors"); | |
| 349 | |
| 350 let requests = []; | |
| 351 testRunner.registerHandler("/redirected", function(metadata) | |
| 352 { | |
| 353 requests.push(testRunner.getTimeOffset()); | |
| 354 return [Cr.NS_OK, 200, "[Adblock]\nfoo\n! Expires: 8 hours\nbar"]; | |
| 355 }); | |
| 356 | |
| 357 resetSubscription(subscription); | |
| 358 testRunner.runScheduledTasks(15); | |
| 359 equal(FilterStorage.subscriptions[0].url, "http://example.com/redirected", "
Redirect followed"); | |
| 360 deepEqual(requests, [0 + initialDelay, 8 + initialDelay], "Resulting request
s"); | |
| 361 | |
| 362 testRunner.registerHandler("/redirected", function(metadata) | |
| 363 { | |
| 364 return [Cr.NS_OK, 200, "[Adblock]\nfoo\n!Redirect: http://example.com/subs
cription\nbar"]; | |
| 365 }) | |
| 366 | |
| 367 subscription = Subscription.fromURL("http://example.com/subscription"); | |
| 368 resetSubscription(subscription); | |
| 369 FilterStorage.removeSubscription(FilterStorage.subscriptions[0]); | |
| 370 FilterStorage.addSubscription(subscription); | |
| 371 | |
| 372 testRunner.runScheduledTasks(2); | |
| 373 equal(FilterStorage.subscriptions[0], subscription, "Redirect not followed o
n redirect loop"); | |
| 374 equal(subscription.downloadStatus, "synchronize_connection_error", "Download
status after redirect loop"); | |
| 375 }); | |
| 376 | |
| 377 test("Fallback", function() | |
| 378 { | |
| 379 Prefs.subscriptions_fallbackerrors = 3; | |
| 380 Prefs.subscriptions_fallbackurl = "http://example.com/fallback?%SUBSCRIPTION
%&%CHANNELSTATUS%&%RESPONSESTATUS%"; | |
| 381 | |
| 382 let subscription = Subscription.fromURL("http://example.com/subscription"); | |
| 383 FilterStorage.addSubscription(subscription); | |
| 384 | |
| 385 // No valid response from fallback | |
| 386 | |
| 387 let requests = []; | |
| 388 testRunner.registerHandler("/subscription", function(metadata) | |
| 389 { | |
| 390 requests.push(testRunner.getTimeOffset()); | |
| 391 return [Cr.NS_OK, 404, ""]; | |
| 392 }); | |
| 393 | |
| 394 testRunner.runScheduledTasks(100); | |
| 395 deepEqual(requests, [0 + initialDelay, 24 + initialDelay, 48 + initialDelay,
72 + initialDelay, 96 + initialDelay], "Continue trying if the fallback doesn't
respond"); | |
| 396 | |
| 397 // Fallback giving "Gone" response | |
| 398 | |
| 399 resetSubscription(subscription); | |
| 400 requests = []; | |
| 401 fallbackParams = null; | |
| 402 testRunner.registerHandler("/fallback", function(metadata) | |
| 403 { | |
| 404 fallbackParams = decodeURIComponent(metadata.queryString); | |
| 405 return [Cr.NS_OK, 200, "410 Gone"]; | |
| 406 }); | |
| 407 | |
| 408 testRunner.runScheduledTasks(100); | |
| 409 deepEqual(requests, [0 + initialDelay, 24 + initialDelay, 48 + initialDelay]
, "Stop trying if the fallback responds with Gone"); | |
| 410 equal(fallbackParams, "http://example.com/subscription&0&404", "Fallback arg
uments"); | |
| 411 | |
| 412 // Fallback redirecting to a missing file | |
| 413 | |
| 414 subscription = Subscription.fromURL("http://example.com/subscription"); | |
| 415 resetSubscription(subscription); | |
| 416 FilterStorage.removeSubscription(FilterStorage.subscriptions[0]); | |
| 417 FilterStorage.addSubscription(subscription); | |
| 418 requests = []; | |
| 419 | |
| 420 testRunner.registerHandler("/fallback", function(metadata) | |
| 421 { | |
| 422 return [Cr.NS_OK, 200, "301 http://example.com/redirected"]; | |
| 423 }); | |
| 424 testRunner.runScheduledTasks(100); | |
| 425 equal(FilterStorage.subscriptions[0].url, "http://example.com/subscription",
"Ignore invalid redirect from fallback"); | |
| 426 deepEqual(requests, [0 + initialDelay, 24 + initialDelay, 48 + initialDelay,
72 + initialDelay, 96 + initialDelay], "Requests not affected by invalid redire
ct"); | |
| 427 | |
| 428 // Fallback redirecting to an existing file | |
| 429 | |
| 430 resetSubscription(subscription); | |
| 431 requests = []; | |
| 432 let redirectedRequests = []; | |
| 433 testRunner.registerHandler("/redirected", function(metadata) | |
| 434 { | |
| 435 redirectedRequests.push(testRunner.getTimeOffset()); | |
| 436 return [Cr.NS_OK, 200, "[Adblock]\n!Expires: 1day\nfoo\nbar"]; | |
| 437 }); | |
| 438 | |
| 439 testRunner.runScheduledTasks(100); | |
| 440 equal(FilterStorage.subscriptions[0].url, "http://example.com/redirected", "
Valid redirect from fallback is followed"); | |
| 441 deepEqual(requests, [0 + initialDelay, 24 + initialDelay, 48 + initialDelay]
, "Stop polling original URL after a valid redirect from fallback"); | |
| 442 deepEqual(redirectedRequests, [48 + initialDelay, 72 + initialDelay, 96 + in
itialDelay], "Request new URL after a valid redirect from fallback"); | |
| 443 | |
| 444 // Checksum mismatch | |
| 445 | |
| 446 testRunner.registerHandler("/subscription", function(metadata) | |
| 447 { | |
| 448 return [Cr.NS_OK, 200, "[Adblock]\n! Checksum: wrong\nfoo\nbar"]; | |
| 449 }); | |
| 450 | |
| 451 subscription = Subscription.fromURL("http://example.com/subscription"); | |
| 452 resetSubscription(subscription); | |
| 453 FilterStorage.removeSubscription(FilterStorage.subscriptions[0]); | |
| 454 FilterStorage.addSubscription(subscription); | |
| 455 | |
| 456 testRunner.runScheduledTasks(100); | |
| 457 equal(FilterStorage.subscriptions[0].url, "http://example.com/redirected", "
Wrong checksum produces fallback request"); | |
| 458 | |
| 459 // Redirect loop | |
| 460 | |
| 461 testRunner.registerHandler("/subscription", function(metadata) | |
| 462 { | |
| 463 return [Cr.NS_OK, 200, "[Adblock]\n! Redirect: http://example.com/subscrip
tion2"]; | |
| 464 }); | |
| 465 testRunner.registerHandler("/subscription2", function(metadata, response) | |
| 466 { | |
| 467 return [Cr.NS_OK, 200, "[Adblock]\n! Redirect: http://example.com/subscrip
tion"]; | |
| 468 }); | |
| 469 | |
| 470 subscription = Subscription.fromURL("http://example.com/subscription"); | |
| 471 resetSubscription(subscription); | |
| 472 FilterStorage.removeSubscription(FilterStorage.subscriptions[0]); | |
| 473 FilterStorage.addSubscription(subscription); | |
| 474 | |
| 475 testRunner.runScheduledTasks(100); | |
| 476 equal(FilterStorage.subscriptions[0].url, "http://example.com/redirected", "
Fallback can still redirect even after a redirect loop"); | |
| 477 }); | |
| 478 | |
| 479 test("State fields", function() | |
| 480 { | |
| 481 let subscription = Subscription.fromURL("http://example.com/subscription"); | |
| 482 FilterStorage.addSubscription(subscription); | |
| 483 | |
| 484 testRunner.registerHandler("/subscription", function(metadata) | |
| 485 { | |
| 486 return [Cr.NS_OK, 200, "[Adblock]\n! Expires: 2 hours\nfoo\nbar"]; | |
| 487 }); | |
| 488 | |
| 489 let startTime = testRunner.currentTime; | |
| 490 testRunner.runScheduledTasks(2); | |
| 491 | |
| 492 equal(subscription.downloadStatus, "synchronize_ok", "downloadStatus after s
uccessful download"); | |
| 493 equal(subscription.lastDownload * MILLIS_IN_SECOND, startTime + initialDela
y * MILLIS_IN_HOUR, "lastDownload after successful download"); | |
| 494 equal(subscription.lastSuccess * MILLIS_IN_SECOND, startTime + initialDelay
* MILLIS_IN_HOUR, "lastSuccess after successful download"); | |
| 495 equal(subscription.lastCheck * MILLIS_IN_SECOND, startTime + (1 + initialDe
lay) * MILLIS_IN_HOUR, "lastCheck after successful download"); | |
| 496 equal(subscription.errors, 0, "errors after successful download"); | |
| 497 | |
| 498 testRunner.registerHandler("/subscription", function(metadata) | |
| 499 { | |
| 500 return [Cr.NS_ERROR_FAILURE, 0, ""]; | |
| 501 }); | |
| 502 | |
| 503 testRunner.runScheduledTasks(2); | |
| 504 | |
| 505 equal(subscription.downloadStatus, "synchronize_connection_error", "download
Status after connection error"); | |
| 506 equal(subscription.lastDownload * MILLIS_IN_SECOND, startTime + (2 + initia
lDelay) * MILLIS_IN_HOUR, "lastDownload after connection error"); | |
| 507 equal(subscription.lastSuccess * MILLIS_IN_SECOND, startTime + initialDelay
* MILLIS_IN_HOUR, "lastSuccess after connection error"); | |
| 508 equal(subscription.lastCheck * MILLIS_IN_SECOND, startTime + (3 + initialDel
ay) * MILLIS_IN_HOUR, "lastCheck after connection error"); | |
| 509 equal(subscription.errors, 1, "errors after connection error"); | |
| 510 | |
| 511 testRunner.registerHandler("/subscription", function(metadata) | |
| 512 { | |
| 513 return [Cr.NS_OK, 404, ""]; | |
| 514 }); | |
| 515 | |
| 516 testRunner.runScheduledTasks(24); | |
| 517 | |
| 518 equal(subscription.downloadStatus, "synchronize_connection_error", "download
Status after download error"); | |
| 519 equal(subscription.lastDownload * MILLIS_IN_SECOND, startTime + (26 + initia
lDelay) * MILLIS_IN_HOUR, "lastDownload after download error"); | |
| 520 equal(subscription.lastSuccess * MILLIS_IN_SECOND, startTime + initialDelay
* MILLIS_IN_HOUR, "lastSuccess after download error"); | |
| 521 equal(subscription.lastCheck * MILLIS_IN_SECOND, startTime + (27 + initialDe
lay) * MILLIS_IN_HOUR, "lastCheck after download error"); | |
| 522 equal(subscription.errors, 2, "errors after download error"); | |
| 523 }); | |
| 524 })(); | |
| OLD | NEW |