michael@0: var checkUrls = []; michael@0: var checkExpect; michael@0: michael@0: var chunk1Urls = [ michael@0: "test.com/aba", michael@0: "test.com/foo/bar", michael@0: "foo.bar.com/a/b/c" michael@0: ]; michael@0: var chunk1 = chunk1Urls.join("\n"); michael@0: michael@0: var chunk2Urls = [ michael@0: "blah.com/a", michael@0: "baz.com/", michael@0: "255.255.0.1/", michael@0: "www.foo.com/test2?param=1" michael@0: ]; michael@0: var chunk2 = chunk2Urls.join("\n"); michael@0: michael@0: var chunk3Urls = [ michael@0: "test.com/a", michael@0: "foo.bar.com/a", michael@0: "blah.com/a", michael@0: ]; michael@0: var chunk3 = chunk3Urls.join("\n"); michael@0: michael@0: var chunk3SubUrls = [ michael@0: "1:test.com/a", michael@0: "1:foo.bar.com/a", michael@0: "2:blah.com/a" ]; michael@0: var chunk3Sub = chunk3SubUrls.join("\n"); michael@0: michael@0: var chunk4Urls = [ michael@0: "a.com/b", michael@0: "b.com/c", michael@0: ]; michael@0: var chunk4 = chunk4Urls.join("\n"); michael@0: michael@0: var chunk5Urls = [ michael@0: "d.com/e", michael@0: "f.com/g", michael@0: ]; michael@0: var chunk5 = chunk5Urls.join("\n"); michael@0: michael@0: var chunk6Urls = [ michael@0: "h.com/i", michael@0: "j.com/k", michael@0: ]; michael@0: var chunk6 = chunk6Urls.join("\n"); michael@0: michael@0: // we are going to add chunks 1, 2, 4, 5, and 6 to phish-simple, and michael@0: // chunk 2 to malware-simple. Then we'll remove the urls in chunk3 michael@0: // from phish-simple, then expire chunk 1 and chunks 4-6 from michael@0: // phish-simple. michael@0: var phishExpected = {}; michael@0: var phishUnexpected = {}; michael@0: var malwareExpected = {}; michael@0: for (var i = 0; i < chunk2Urls.length; i++) { michael@0: phishExpected[chunk2Urls[i]] = true; michael@0: malwareExpected[chunk2Urls[i]] = true; michael@0: } michael@0: for (var i = 0; i < chunk3Urls.length; i++) { michael@0: delete phishExpected[chunk3Urls[i]]; michael@0: phishUnexpected[chunk3Urls[i]] = true; michael@0: } michael@0: for (var i = 0; i < chunk1Urls.length; i++) { michael@0: // chunk1 urls are expired michael@0: phishUnexpected[chunk1Urls[i]] = true; michael@0: } michael@0: for (var i = 0; i < chunk4Urls.length; i++) { michael@0: // chunk4 urls are expired michael@0: phishUnexpected[chunk4Urls[i]] = true; michael@0: } michael@0: for (var i = 0; i < chunk5Urls.length; i++) { michael@0: // chunk5 urls are expired michael@0: phishUnexpected[chunk5Urls[i]] = true; michael@0: } michael@0: for (var i = 0; i < chunk6Urls.length; i++) { michael@0: // chunk6 urls are expired michael@0: phishUnexpected[chunk6Urls[i]] = true; michael@0: } michael@0: michael@0: // Check that the entries hit based on sub-parts michael@0: phishExpected["baz.com/foo/bar"] = true; michael@0: phishExpected["foo.bar.baz.com/foo"] = true; michael@0: phishExpected["bar.baz.com/"] = true; michael@0: michael@0: var numExpecting; michael@0: michael@0: function testFailure(arg) { michael@0: do_throw(arg); michael@0: } michael@0: michael@0: function checkNoHost() michael@0: { michael@0: // Looking up a no-host uri such as a data: uri should throw an exception. michael@0: var exception; michael@0: try { michael@0: var principal = secMan.getNoAppCodebasePrincipal(iosvc.newURI("data:text/html,test", null, null)); michael@0: dbservice.lookup(principal, allTables); michael@0: michael@0: exception = false; michael@0: } catch(e) { michael@0: exception = true; michael@0: } michael@0: do_check_true(exception); michael@0: michael@0: do_test_finished(); michael@0: } michael@0: michael@0: function tablesCallbackWithoutSub(tables) michael@0: { michael@0: var parts = tables.split("\n"); michael@0: parts.sort(); michael@0: michael@0: // there's a leading \n here because splitting left an empty string michael@0: // after the trailing newline, which will sort first michael@0: do_check_eq(parts.join("\n"), michael@0: "\ntest-malware-simple;a:1\ntest-phish-simple;a:2"); michael@0: michael@0: checkNoHost(); michael@0: } michael@0: michael@0: michael@0: function expireSubSuccess(result) { michael@0: dbservice.getTables(tablesCallbackWithoutSub); michael@0: } michael@0: michael@0: function tablesCallbackWithSub(tables) michael@0: { michael@0: var parts = tables.split("\n"); michael@0: parts.sort(); michael@0: michael@0: // there's a leading \n here because splitting left an empty string michael@0: // after the trailing newline, which will sort first michael@0: do_check_eq(parts.join("\n"), michael@0: "\ntest-malware-simple;a:1\ntest-phish-simple;a:2:s:3"); michael@0: michael@0: // verify that expiring a sub chunk removes its name from the list michael@0: var data = michael@0: "n:1000\n" + michael@0: "i:test-phish-simple\n" + michael@0: "sd:3\n"; michael@0: michael@0: doSimpleUpdate(data, expireSubSuccess, testFailure); michael@0: } michael@0: michael@0: function checkChunksWithSub() michael@0: { michael@0: dbservice.getTables(tablesCallbackWithSub); michael@0: } michael@0: michael@0: function checkDone() { michael@0: if (--numExpecting == 0) michael@0: checkChunksWithSub(); michael@0: } michael@0: michael@0: function phishExists(result) { michael@0: dumpn("phishExists: " + result); michael@0: try { michael@0: do_check_true(result.indexOf("test-phish-simple") != -1); michael@0: } finally { michael@0: checkDone(); michael@0: } michael@0: } michael@0: michael@0: function phishDoesntExist(result) { michael@0: dumpn("phishDoesntExist: " + result); michael@0: try { michael@0: do_check_true(result.indexOf("test-phish-simple") == -1); michael@0: } finally { michael@0: checkDone(); michael@0: } michael@0: } michael@0: michael@0: function malwareExists(result) { michael@0: dumpn("malwareExists: " + result); michael@0: michael@0: try { michael@0: do_check_true(result.indexOf("test-malware-simple") != -1); michael@0: } finally { michael@0: checkDone(); michael@0: } michael@0: } michael@0: michael@0: function checkState() michael@0: { michael@0: numExpecting = 0; michael@0: michael@0: for (var key in phishExpected) { michael@0: var principal = secMan.getNoAppCodebasePrincipal(iosvc.newURI("http://" + key, null, null)); michael@0: dbservice.lookup(principal, allTables, phishExists, true); michael@0: numExpecting++; michael@0: } michael@0: michael@0: for (var key in phishUnexpected) { michael@0: var principal = secMan.getNoAppCodebasePrincipal(iosvc.newURI("http://" + key, null, null)); michael@0: dbservice.lookup(principal, allTables, phishDoesntExist, true); michael@0: numExpecting++; michael@0: } michael@0: michael@0: for (var key in malwareExpected) { michael@0: var principal = secMan.getNoAppCodebasePrincipal(iosvc.newURI("http://" + key, null, null)); michael@0: dbservice.lookup(principal, allTables, malwareExists, true); michael@0: numExpecting++; michael@0: } michael@0: } michael@0: michael@0: function testSubSuccess(result) michael@0: { michael@0: do_check_eq(result, "1000"); michael@0: checkState(); michael@0: } michael@0: michael@0: function do_subs() { michael@0: var data = michael@0: "n:1000\n" + michael@0: "i:test-phish-simple\n" + michael@0: "s:3:32:" + chunk3Sub.length + "\n" + michael@0: chunk3Sub + "\n" + michael@0: "ad:1\n" + michael@0: "ad:4-6\n"; michael@0: michael@0: doSimpleUpdate(data, testSubSuccess, testFailure); michael@0: } michael@0: michael@0: function testAddSuccess(arg) { michael@0: do_check_eq(arg, "1000"); michael@0: michael@0: do_subs(); michael@0: } michael@0: michael@0: function do_adds() { michael@0: // This test relies on the fact that only -regexp tables are ungzipped, michael@0: // and only -hash tables are assumed to be pre-md5'd. So we use michael@0: // a 'simple' table type to get simple hostname-per-line semantics. michael@0: michael@0: var data = michael@0: "n:1000\n" + michael@0: "i:test-phish-simple\n" + michael@0: "a:1:32:" + chunk1.length + "\n" + michael@0: chunk1 + "\n" + michael@0: "a:2:32:" + chunk2.length + "\n" + michael@0: chunk2 + "\n" + michael@0: "a:4:32:" + chunk4.length + "\n" + michael@0: chunk4 + "\n" + michael@0: "a:5:32:" + chunk5.length + "\n" + michael@0: chunk5 + "\n" + michael@0: "a:6:32:" + chunk6.length + "\n" + michael@0: chunk6 + "\n" + michael@0: "i:test-malware-simple\n" + michael@0: "a:1:32:" + chunk2.length + "\n" + michael@0: chunk2 + "\n"; michael@0: michael@0: doSimpleUpdate(data, testAddSuccess, testFailure); michael@0: } michael@0: michael@0: function run_test() { michael@0: do_adds(); michael@0: do_test_pending(); michael@0: }