toolkit/components/url-classifier/tests/unit/test_partial.js

branch
TOR_BUG_3246
changeset 7
129ffea94266
equal deleted inserted replaced
-1:000000000000 0:cb01eb5688a8
1
2 /**
3 * DummyCompleter() lets tests easily specify the results of a partial
4 * hash completion request.
5 */
6 function DummyCompleter() {
7 this.fragments = {};
8 this.queries = [];
9 this.tableName = "test-phish-simple";
10 }
11
12 DummyCompleter.prototype =
13 {
14 QueryInterface: function(iid)
15 {
16 if (!iid.equals(Ci.nsISupports) &&
17 !iid.equals(Ci.nsIUrlClassifierHashCompleter)) {
18 throw Cr.NS_ERROR_NO_INTERFACE;
19 }
20 return this;
21 },
22
23 complete: function(partialHash, cb)
24 {
25 this.queries.push(partialHash);
26 var fragments = this.fragments;
27 var self = this;
28 var doCallback = function() {
29 if (self.alwaysFail) {
30 cb.completionFinished(1);
31 return;
32 }
33 var results;
34 if (fragments[partialHash]) {
35 for (var i = 0; i < fragments[partialHash].length; i++) {
36 var chunkId = fragments[partialHash][i][0];
37 var hash = fragments[partialHash][i][1];
38 cb.completion(hash, self.tableName, chunkId);
39 }
40 }
41 cb.completionFinished(0);
42 }
43 var timer = new Timer(0, doCallback);
44 },
45
46 getHash: function(fragment)
47 {
48 var converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].
49 createInstance(Ci.nsIScriptableUnicodeConverter);
50 converter.charset = "UTF-8";
51 var data = converter.convertToByteArray(fragment);
52 var ch = Cc["@mozilla.org/security/hash;1"].createInstance(Ci.nsICryptoHash);
53 ch.init(ch.SHA256);
54 ch.update(data, data.length);
55 var hash = ch.finish(false);
56 return hash.slice(0, 32);
57 },
58
59 addFragment: function(chunkId, fragment)
60 {
61 this.addHash(chunkId, this.getHash(fragment));
62 },
63
64 // This method allows the caller to generate complete hashes that match the
65 // prefix of a real fragment, but have different complete hashes.
66 addConflict: function(chunkId, fragment)
67 {
68 var realHash = this.getHash(fragment);
69 var invalidHash = this.getHash("blah blah blah blah blah");
70 this.addHash(chunkId, realHash.slice(0, 4) + invalidHash.slice(4, 32));
71 },
72
73 addHash: function(chunkId, hash)
74 {
75 var partial = hash.slice(0, 4);
76 if (this.fragments[partial]) {
77 this.fragments[partial].push([chunkId, hash]);
78 } else {
79 this.fragments[partial] = [[chunkId, hash]];
80 }
81 },
82
83 compareQueries: function(fragments)
84 {
85 var expectedQueries = [];
86 for (var i = 0; i < fragments.length; i++) {
87 expectedQueries.push(this.getHash(fragments[i]).slice(0, 4));
88 }
89 do_check_eq(this.queries.length, expectedQueries.length);
90 expectedQueries.sort();
91 this.queries.sort();
92 for (var i = 0; i < this.queries.length; i++) {
93 do_check_eq(this.queries[i], expectedQueries[i]);
94 }
95 }
96 };
97
98 function setupCompleter(table, hits, conflicts)
99 {
100 var completer = new DummyCompleter();
101 completer.tableName = table;
102 for (var i = 0; i < hits.length; i++) {
103 var chunkId = hits[i][0];
104 var fragments = hits[i][1];
105 for (var j = 0; j < fragments.length; j++) {
106 completer.addFragment(chunkId, fragments[j]);
107 }
108 }
109 for (var i = 0; i < conflicts.length; i++) {
110 var chunkId = conflicts[i][0];
111 var fragments = conflicts[i][1];
112 for (var j = 0; j < fragments.length; j++) {
113 completer.addConflict(chunkId, fragments[j]);
114 }
115 }
116
117 dbservice.setHashCompleter(table, completer);
118
119 return completer;
120 }
121
122 function installCompleter(table, fragments, conflictFragments)
123 {
124 return setupCompleter(table, fragments, conflictFragments);
125 }
126
127 function installFailingCompleter(table) {
128 var completer = setupCompleter(table, [], []);
129 completer.alwaysFail = true;
130 return completer;
131 }
132
133 // Helper assertion for checking dummy completer queries
134 gAssertions.completerQueried = function(data, cb)
135 {
136 var completer = data[0];
137 completer.compareQueries(data[1]);
138 cb();
139 }
140
141 function doTest(updates, assertions)
142 {
143 doUpdateTest(updates, assertions, runNextTest, updateError);
144 }
145
146 // Test an add of two partial urls to a fresh database
147 function testPartialAdds() {
148 var addUrls = [ "foo.com/a", "foo.com/b", "bar.com/c" ];
149 var update = buildPhishingUpdate(
150 [
151 { "chunkNum" : 1,
152 "urls" : addUrls
153 }],
154 4);
155
156
157 var completer = installCompleter('test-phish-simple', [[1, addUrls]], []);
158
159 var assertions = {
160 "tableData" : "test-phish-simple;a:1",
161 "urlsExist" : addUrls,
162 "completerQueried" : [completer, addUrls]
163 };
164
165
166 doTest([update], assertions);
167 }
168
169 function testPartialAddsWithConflicts() {
170 var addUrls = [ "foo.com/a", "foo.com/b", "bar.com/c" ];
171 var update = buildPhishingUpdate(
172 [
173 { "chunkNum" : 1,
174 "urls" : addUrls
175 }],
176 4);
177
178 // Each result will have both a real match and a conflict
179 var completer = installCompleter('test-phish-simple',
180 [[1, addUrls]],
181 [[1, addUrls]]);
182
183 var assertions = {
184 "tableData" : "test-phish-simple;a:1",
185 "urlsExist" : addUrls,
186 "completerQueried" : [completer, addUrls]
187 };
188
189 doTest([update], assertions);
190 }
191
192 // Test whether the fragmenting code does not cause duplicated completions
193 function testFragments() {
194 var addUrls = [ "foo.com/a/b/c", "foo.net/", "foo.com/c/" ];
195 var update = buildPhishingUpdate(
196 [
197 { "chunkNum" : 1,
198 "urls" : addUrls
199 }],
200 4);
201
202
203 var completer = installCompleter('test-phish-simple', [[1, addUrls]], []);
204
205 var assertions = {
206 "tableData" : "test-phish-simple;a:1",
207 "urlsExist" : addUrls,
208 "completerQueried" : [completer, addUrls]
209 };
210
211
212 doTest([update], assertions);
213 }
214
215 // Test http://code.google.com/p/google-safe-browsing/wiki/Protocolv2Spec
216 // section 6.2 example 1
217 function testSpecFragments() {
218 var probeUrls = [ "a.b.c/1/2.html?param=1" ];
219
220 var addUrls = [ "a.b.c/1/2.html",
221 "a.b.c/",
222 "a.b.c/1/",
223 "b.c/1/2.html?param=1",
224 "b.c/1/2.html",
225 "b.c/",
226 "b.c/1/",
227 "a.b.c/1/2.html?param=1" ];
228
229 var update = buildPhishingUpdate(
230 [
231 { "chunkNum" : 1,
232 "urls" : addUrls
233 }],
234 4);
235
236
237 var completer = installCompleter('test-phish-simple', [[1, addUrls]], []);
238
239 var assertions = {
240 "tableData" : "test-phish-simple;a:1",
241 "urlsExist" : probeUrls,
242 "completerQueried" : [completer, addUrls]
243 };
244
245 doTest([update], assertions);
246
247 }
248
249 // Test http://code.google.com/p/google-safe-browsing/wiki/Protocolv2Spec
250 // section 6.2 example 2
251 function testMoreSpecFragments() {
252 var probeUrls = [ "a.b.c.d.e.f.g/1.html" ];
253
254 var addUrls = [ "a.b.c.d.e.f.g/1.html",
255 "a.b.c.d.e.f.g/",
256 "c.d.e.f.g/1.html",
257 "c.d.e.f.g/",
258 "d.e.f.g/1.html",
259 "d.e.f.g/",
260 "e.f.g/1.html",
261 "e.f.g/",
262 "f.g/1.html",
263 "f.g/" ];
264
265 var update = buildPhishingUpdate(
266 [
267 { "chunkNum" : 1,
268 "urls" : addUrls
269 }],
270 4);
271
272 var completer = installCompleter('test-phish-simple', [[1, addUrls]], []);
273
274 var assertions = {
275 "tableData" : "test-phish-simple;a:1",
276 "urlsExist" : probeUrls,
277 "completerQueried" : [completer, addUrls]
278 };
279
280 doTest([update], assertions);
281
282 }
283
284 function testFalsePositives() {
285 var addUrls = [ "foo.com/a", "foo.com/b", "bar.com/c" ];
286 var update = buildPhishingUpdate(
287 [
288 { "chunkNum" : 1,
289 "urls" : addUrls
290 }],
291 4);
292
293 // Each result will have no matching complete hashes and a non-matching
294 // conflict
295 var completer = installCompleter('test-phish-simple', [], [[1, addUrls]]);
296
297 var assertions = {
298 "tableData" : "test-phish-simple;a:1",
299 "urlsDontExist" : addUrls,
300 "completerQueried" : [completer, addUrls]
301 };
302
303 doTest([update], assertions);
304 }
305
306 function testEmptyCompleter() {
307 var addUrls = [ "foo.com/a", "foo.com/b", "bar.com/c" ];
308 var update = buildPhishingUpdate(
309 [
310 { "chunkNum" : 1,
311 "urls" : addUrls
312 }],
313 4);
314
315 // Completer will never return full hashes
316 var completer = installCompleter('test-phish-simple', [], []);
317
318 var assertions = {
319 "tableData" : "test-phish-simple;a:1",
320 "urlsDontExist" : addUrls,
321 "completerQueried" : [completer, addUrls]
322 };
323
324 doTest([update], assertions);
325 }
326
327 function testCompleterFailure() {
328 var addUrls = [ "foo.com/a", "foo.com/b", "bar.com/c" ];
329 var update = buildPhishingUpdate(
330 [
331 { "chunkNum" : 1,
332 "urls" : addUrls
333 }],
334 4);
335
336 // Completer will never return full hashes
337 var completer = installFailingCompleter('test-phish-simple');
338
339 var assertions = {
340 "tableData" : "test-phish-simple;a:1",
341 "urlsDontExist" : addUrls,
342 "completerQueried" : [completer, addUrls]
343 };
344
345 doTest([update], assertions);
346 }
347
348 function testMixedSizesSameDomain() {
349 var add1Urls = [ "foo.com/a" ];
350 var add2Urls = [ "foo.com/b" ];
351
352 var update1 = buildPhishingUpdate(
353 [
354 { "chunkNum" : 1,
355 "urls" : add1Urls }],
356 4);
357 var update2 = buildPhishingUpdate(
358 [
359 { "chunkNum" : 2,
360 "urls" : add2Urls }],
361 32);
362
363 // We should only need to complete the partial hashes
364 var completer = installCompleter('test-phish-simple', [[1, add1Urls]], []);
365
366 var assertions = {
367 "tableData" : "test-phish-simple;a:1-2",
368 // both urls should match...
369 "urlsExist" : add1Urls.concat(add2Urls),
370 // ... but the completer should only be queried for the partial entry
371 "completerQueried" : [completer, add1Urls]
372 };
373
374 doTest([update1, update2], assertions);
375 }
376
377 function testMixedSizesDifferentDomains() {
378 var add1Urls = [ "foo.com/a" ];
379 var add2Urls = [ "bar.com/b" ];
380
381 var update1 = buildPhishingUpdate(
382 [
383 { "chunkNum" : 1,
384 "urls" : add1Urls }],
385 4);
386 var update2 = buildPhishingUpdate(
387 [
388 { "chunkNum" : 2,
389 "urls" : add2Urls }],
390 32);
391
392 // We should only need to complete the partial hashes
393 var completer = installCompleter('test-phish-simple', [[1, add1Urls]], []);
394
395 var assertions = {
396 "tableData" : "test-phish-simple;a:1-2",
397 // both urls should match...
398 "urlsExist" : add1Urls.concat(add2Urls),
399 // ... but the completer should only be queried for the partial entry
400 "completerQueried" : [completer, add1Urls]
401 };
402
403 doTest([update1, update2], assertions);
404 }
405
406 function testInvalidHashSize()
407 {
408 var addUrls = [ "foo.com/a", "foo.com/b", "bar.com/c" ];
409 var update = buildPhishingUpdate(
410 [
411 { "chunkNum" : 1,
412 "urls" : addUrls
413 }],
414 12); // only 4 and 32 are legal hash sizes
415
416 var addUrls2 = [ "zaz.com/a", "xyz.com/b" ];
417 var update2 = buildPhishingUpdate(
418 [
419 { "chunkNum" : 2,
420 "urls" : addUrls2
421 }],
422 4);
423
424 var completer = installCompleter('test-phish-simple', [[1, addUrls]], []);
425
426 var assertions = {
427 "tableData" : "test-phish-simple;a:2",
428 "urlsDontExist" : addUrls
429 };
430
431 // A successful update will trigger an error
432 doUpdateTest([update2, update], assertions, updateError, runNextTest);
433 }
434
435 function testWrongTable()
436 {
437 var addUrls = [ "foo.com/a" ];
438 var update = buildPhishingUpdate(
439 [
440 { "chunkNum" : 1,
441 "urls" : addUrls
442 }],
443 4);
444 var completer = installCompleter('test-malware-simple', // wrong table
445 [[1, addUrls]], []);
446
447 // The above installCompleter installs the completer for test-malware-simple,
448 // we want it to be used for test-phish-simple too.
449 dbservice.setHashCompleter("test-phish-simple", completer);
450
451
452 var assertions = {
453 "tableData" : "test-phish-simple;a:1",
454 // The urls were added as phishing urls, but the completer is claiming
455 // that they are malware urls, and we trust the completer in this case.
456 // The result will be discarded, so we can only check for non-existence.
457 "urlsDontExist" : addUrls,
458 // Make sure the completer was actually queried.
459 "completerQueried" : [completer, addUrls]
460 };
461
462 doUpdateTest([update], assertions,
463 function() {
464 // Give the dbservice a chance to (not) cache the result.
465 var timer = new Timer(3000, function() {
466 // The miss earlier will have caused a miss to be cached.
467 // Resetting the completer does not count as an update,
468 // so we will not be probed again.
469 var newCompleter = installCompleter('test-malware-simple', [[1, addUrls]], []); dbservice.setHashCompleter("test-phish-simple",
470 newCompleter);
471
472 var assertions = {
473 "urlsDontExist" : addUrls
474 };
475 checkAssertions(assertions, runNextTest);
476 });
477 }, updateError);
478 }
479
480 function setupCachedResults(addUrls, part2)
481 {
482 var update = buildPhishingUpdate(
483 [
484 { "chunkNum" : 1,
485 "urls" : addUrls
486 }],
487 4);
488
489 var completer = installCompleter('test-phish-simple', [[1, addUrls]], []);
490
491 var assertions = {
492 "tableData" : "test-phish-simple;a:1",
493 // Request the add url. This should cause the completion to be cached.
494 "urlsExist" : addUrls,
495 // Make sure the completer was actually queried.
496 "completerQueried" : [completer, addUrls]
497 };
498
499 doUpdateTest([update], assertions,
500 function() {
501 // Give the dbservice a chance to cache the result.
502 var timer = new Timer(3000, part2);
503 }, updateError);
504 }
505
506 function testCachedResults()
507 {
508 setupCachedResults(["foo.com/a"], function(add) {
509 // This is called after setupCachedResults(). Verify that
510 // checking the url again does not cause a completer request.
511
512 // install a new completer, this one should never be queried.
513 var newCompleter = installCompleter('test-phish-simple', [[1, []]], []);
514
515 var assertions = {
516 "urlsExist" : ["foo.com/a"],
517 "completerQueried" : [newCompleter, []]
518 };
519 checkAssertions(assertions, runNextTest);
520 });
521 }
522
523 function testCachedResultsWithSub() {
524 setupCachedResults(["foo.com/a"], function() {
525 // install a new completer, this one should never be queried.
526 var newCompleter = installCompleter('test-phish-simple', [[1, []]], []);
527
528 var removeUpdate = buildPhishingUpdate(
529 [ { "chunkNum" : 2,
530 "chunkType" : "s",
531 "urls": ["1:foo.com/a"] }],
532 4);
533
534 var assertions = {
535 "urlsDontExist" : ["foo.com/a"],
536 "completerQueried" : [newCompleter, []]
537 }
538
539 doTest([removeUpdate], assertions);
540 });
541 }
542
543 function testCachedResultsWithExpire() {
544 setupCachedResults(["foo.com/a"], function() {
545 // install a new completer, this one should never be queried.
546 var newCompleter = installCompleter('test-phish-simple', [[1, []]], []);
547
548 var expireUpdate =
549 "n:1000\n" +
550 "i:test-phish-simple\n" +
551 "ad:1\n";
552
553 var assertions = {
554 "urlsDontExist" : ["foo.com/a"],
555 "completerQueried" : [newCompleter, []]
556 }
557 doTest([expireUpdate], assertions);
558 });
559 }
560
561 function testCachedResultsUpdate()
562 {
563 var existUrls = ["foo.com/a"];
564 setupCachedResults(existUrls, function() {
565 // This is called after setupCachedResults(). Verify that
566 // checking the url again does not cause a completer request.
567
568 // install a new completer, this one should never be queried.
569 var newCompleter = installCompleter('test-phish-simple', [[1, []]], []);
570
571 var assertions = {
572 "urlsExist" : existUrls,
573 "completerQueried" : [newCompleter, []]
574 };
575
576 var addUrls = ["foobar.org/a"];
577
578 var update2 = buildPhishingUpdate(
579 [
580 { "chunkNum" : 2,
581 "urls" : addUrls
582 }],
583 4);
584
585 checkAssertions(assertions, function () {
586 // Apply the update. The cached completes should be gone.
587 doStreamUpdate(update2, function() {
588 // Now the completer gets queried again.
589 var newCompleter2 = installCompleter('test-phish-simple', [[1, existUrls]], []);
590 var assertions2 = {
591 "tableData" : "test-phish-simple;a:1-2",
592 "urlsExist" : existUrls,
593 "completerQueried" : [newCompleter2, existUrls]
594 };
595 checkAssertions(assertions2, runNextTest);
596 }, updateError);
597 });
598 });
599 }
600
601 function testCachedResultsFailure()
602 {
603 var existUrls = ["foo.com/a"];
604 setupCachedResults(existUrls, function() {
605 // This is called after setupCachedResults(). Verify that
606 // checking the url again does not cause a completer request.
607
608 // install a new completer, this one should never be queried.
609 var newCompleter = installCompleter('test-phish-simple', [[1, []]], []);
610
611 var assertions = {
612 "urlsExist" : existUrls,
613 "completerQueried" : [newCompleter, []]
614 };
615
616 var addUrls = ["foobar.org/a"];
617
618 var update2 = buildPhishingUpdate(
619 [
620 { "chunkNum" : 2,
621 "urls" : addUrls
622 }],
623 4);
624
625 checkAssertions(assertions, function() {
626 // Apply the update. The cached completes should be gone.
627 doErrorUpdate("test-phish-simple,test-malware-simple", function() {
628 // Now the completer gets queried again.
629 var newCompleter2 = installCompleter('test-phish-simple', [[1, existUrls]], []);
630 var assertions2 = {
631 "tableData" : "test-phish-simple;a:1",
632 "urlsExist" : existUrls,
633 "completerQueried" : [newCompleter2, existUrls]
634 };
635 checkAssertions(assertions2, runNextTest);
636 }, updateError);
637 });
638 });
639 }
640
641 function testErrorList()
642 {
643 var addUrls = [ "foo.com/a", "foo.com/b", "bar.com/c" ];
644 var update = buildPhishingUpdate(
645 [
646 { "chunkNum" : 1,
647 "urls" : addUrls
648 }],
649 4);
650 // The update failure should will kill the completes, so the above
651 // must be a prefix to get any hit at all past the update failure.
652
653 var completer = installCompleter('test-phish-simple', [[1, addUrls]], []);
654
655 var assertions = {
656 "tableData" : "test-phish-simple;a:1",
657 "urlsExist" : addUrls,
658 // These are complete urls, and will only be completed if the
659 // list is stale.
660 "completerQueried" : [completer, addUrls]
661 };
662
663 // Apply the update.
664 doStreamUpdate(update, function() {
665 // Now the test-phish-simple and test-malware-simple tables are marked
666 // as fresh. Fake an update failure to mark them stale.
667 doErrorUpdate("test-phish-simple,test-malware-simple", function() {
668 // Now the lists should be marked stale. Check assertions.
669 checkAssertions(assertions, runNextTest);
670 }, updateError);
671 }, updateError);
672 }
673
674
675 function testStaleList()
676 {
677 var addUrls = [ "foo.com/a", "foo.com/b", "bar.com/c" ];
678 var update = buildPhishingUpdate(
679 [
680 { "chunkNum" : 1,
681 "urls" : addUrls
682 }],
683 32);
684
685 var completer = installCompleter('test-phish-simple', [[1, addUrls]], []);
686
687 var assertions = {
688 "tableData" : "test-phish-simple;a:1",
689 "urlsExist" : addUrls,
690 // These are complete urls, and will only be completed if the
691 // list is stale.
692 "completerQueried" : [completer, addUrls]
693 };
694
695 // Consider a match stale after one second.
696 prefBranch.setIntPref("urlclassifier.max-complete-age", 1);
697
698 // Apply the update.
699 doStreamUpdate(update, function() {
700 // Now the test-phish-simple and test-malware-simple tables are marked
701 // as fresh. Wait three seconds to make sure the list is marked stale.
702 new Timer(3000, function() {
703 // Now the lists should be marked stale. Check assertions.
704 checkAssertions(assertions, function() {
705 prefBranch.setIntPref("urlclassifier.max-complete-age", 2700);
706 runNextTest();
707 });
708 }, updateError);
709 }, updateError);
710 }
711
712 // Same as testStaleList, but verifies that an empty response still
713 // unconfirms the entry.
714 function testStaleListEmpty()
715 {
716 var addUrls = [ "foo.com/a", "foo.com/b", "bar.com/c" ];
717 var update = buildPhishingUpdate(
718 [
719 { "chunkNum" : 1,
720 "urls" : addUrls
721 }],
722 32);
723
724 var completer = installCompleter('test-phish-simple', [], []);
725
726 var assertions = {
727 "tableData" : "test-phish-simple;a:1",
728 // None of these should match, because they won't be completed
729 "urlsDontExist" : addUrls,
730 // These are complete urls, and will only be completed if the
731 // list is stale.
732 "completerQueried" : [completer, addUrls]
733 };
734
735 // Consider a match stale after one second.
736 prefBranch.setIntPref("urlclassifier.max-complete-age", 1);
737
738 // Apply the update.
739 doStreamUpdate(update, function() {
740 // Now the test-phish-simple and test-malware-simple tables are marked
741 // as fresh. Wait three seconds to make sure the list is marked stale.
742 new Timer(3000, function() {
743 // Now the lists should be marked stale. Check assertions.
744 checkAssertions(assertions, function() {
745 prefBranch.setIntPref("urlclassifier.max-complete-age", 2700);
746 runNextTest();
747 });
748 }, updateError);
749 }, updateError);
750 }
751
752
753 // Verify that different lists (test-phish-simple,
754 // test-malware-simple) maintain their freshness separately.
755 function testErrorListIndependent()
756 {
757 var phishUrls = [ "phish.com/a" ];
758 var malwareUrls = [ "attack.com/a" ];
759 var update = buildPhishingUpdate(
760 [
761 { "chunkNum" : 1,
762 "urls" : phishUrls
763 }],
764 4);
765 // These have to persist past the update failure, so they must be prefixes,
766 // not completes.
767
768 update += buildMalwareUpdate(
769 [
770 { "chunkNum" : 2,
771 "urls" : malwareUrls
772 }],
773 32);
774
775 var completer = installCompleter('test-phish-simple', [[1, phishUrls]], []);
776
777 var assertions = {
778 "tableData" : "test-malware-simple;a:2\ntest-phish-simple;a:1",
779 "urlsExist" : phishUrls,
780 "malwareUrlsExist" : malwareUrls,
781 // Only this phishing urls should be completed, because only the phishing
782 // urls will be stale.
783 "completerQueried" : [completer, phishUrls]
784 };
785
786 // Apply the update.
787 doStreamUpdate(update, function() {
788 // Now the test-phish-simple and test-malware-simple tables are
789 // marked as fresh. Fake an update failure to mark *just*
790 // phishing data as stale.
791 doErrorUpdate("test-phish-simple", function() {
792 // Now the lists should be marked stale. Check assertions.
793 checkAssertions(assertions, runNextTest);
794 }, updateError);
795 }, updateError);
796 }
797
798 function run_test()
799 {
800 runTests([
801 testPartialAdds,
802 testPartialAddsWithConflicts,
803 testFragments,
804 testSpecFragments,
805 testMoreSpecFragments,
806 testFalsePositives,
807 testEmptyCompleter,
808 testCompleterFailure,
809 testMixedSizesSameDomain,
810 testMixedSizesDifferentDomains,
811 testInvalidHashSize,
812 testWrongTable,
813 testCachedResults,
814 testCachedResultsWithSub,
815 testCachedResultsWithExpire,
816 testCachedResultsUpdate,
817 testCachedResultsFailure,
818 testStaleList,
819 testStaleListEmpty,
820 testErrorList,
821 testErrorListIndependent
822 ]);
823 }
824
825 do_test_pending();

mercurial