1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/components/url-classifier/tests/unit/test_dbservice.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,260 @@ 1.4 +var checkUrls = []; 1.5 +var checkExpect; 1.6 + 1.7 +var chunk1Urls = [ 1.8 + "test.com/aba", 1.9 + "test.com/foo/bar", 1.10 + "foo.bar.com/a/b/c" 1.11 +]; 1.12 +var chunk1 = chunk1Urls.join("\n"); 1.13 + 1.14 +var chunk2Urls = [ 1.15 + "blah.com/a", 1.16 + "baz.com/", 1.17 + "255.255.0.1/", 1.18 + "www.foo.com/test2?param=1" 1.19 +]; 1.20 +var chunk2 = chunk2Urls.join("\n"); 1.21 + 1.22 +var chunk3Urls = [ 1.23 + "test.com/a", 1.24 + "foo.bar.com/a", 1.25 + "blah.com/a", 1.26 + ]; 1.27 +var chunk3 = chunk3Urls.join("\n"); 1.28 + 1.29 +var chunk3SubUrls = [ 1.30 + "1:test.com/a", 1.31 + "1:foo.bar.com/a", 1.32 + "2:blah.com/a" ]; 1.33 +var chunk3Sub = chunk3SubUrls.join("\n"); 1.34 + 1.35 +var chunk4Urls = [ 1.36 + "a.com/b", 1.37 + "b.com/c", 1.38 + ]; 1.39 +var chunk4 = chunk4Urls.join("\n"); 1.40 + 1.41 +var chunk5Urls = [ 1.42 + "d.com/e", 1.43 + "f.com/g", 1.44 + ]; 1.45 +var chunk5 = chunk5Urls.join("\n"); 1.46 + 1.47 +var chunk6Urls = [ 1.48 + "h.com/i", 1.49 + "j.com/k", 1.50 + ]; 1.51 +var chunk6 = chunk6Urls.join("\n"); 1.52 + 1.53 +// we are going to add chunks 1, 2, 4, 5, and 6 to phish-simple, and 1.54 +// chunk 2 to malware-simple. Then we'll remove the urls in chunk3 1.55 +// from phish-simple, then expire chunk 1 and chunks 4-6 from 1.56 +// phish-simple. 1.57 +var phishExpected = {}; 1.58 +var phishUnexpected = {}; 1.59 +var malwareExpected = {}; 1.60 +for (var i = 0; i < chunk2Urls.length; i++) { 1.61 + phishExpected[chunk2Urls[i]] = true; 1.62 + malwareExpected[chunk2Urls[i]] = true; 1.63 +} 1.64 +for (var i = 0; i < chunk3Urls.length; i++) { 1.65 + delete phishExpected[chunk3Urls[i]]; 1.66 + phishUnexpected[chunk3Urls[i]] = true; 1.67 +} 1.68 +for (var i = 0; i < chunk1Urls.length; i++) { 1.69 + // chunk1 urls are expired 1.70 + phishUnexpected[chunk1Urls[i]] = true; 1.71 +} 1.72 +for (var i = 0; i < chunk4Urls.length; i++) { 1.73 + // chunk4 urls are expired 1.74 + phishUnexpected[chunk4Urls[i]] = true; 1.75 +} 1.76 +for (var i = 0; i < chunk5Urls.length; i++) { 1.77 + // chunk5 urls are expired 1.78 + phishUnexpected[chunk5Urls[i]] = true; 1.79 +} 1.80 +for (var i = 0; i < chunk6Urls.length; i++) { 1.81 + // chunk6 urls are expired 1.82 + phishUnexpected[chunk6Urls[i]] = true; 1.83 +} 1.84 + 1.85 +// Check that the entries hit based on sub-parts 1.86 +phishExpected["baz.com/foo/bar"] = true; 1.87 +phishExpected["foo.bar.baz.com/foo"] = true; 1.88 +phishExpected["bar.baz.com/"] = true; 1.89 + 1.90 +var numExpecting; 1.91 + 1.92 +function testFailure(arg) { 1.93 + do_throw(arg); 1.94 +} 1.95 + 1.96 +function checkNoHost() 1.97 +{ 1.98 + // Looking up a no-host uri such as a data: uri should throw an exception. 1.99 + var exception; 1.100 + try { 1.101 + var principal = secMan.getNoAppCodebasePrincipal(iosvc.newURI("data:text/html,<b>test</b>", null, null)); 1.102 + dbservice.lookup(principal, allTables); 1.103 + 1.104 + exception = false; 1.105 + } catch(e) { 1.106 + exception = true; 1.107 + } 1.108 + do_check_true(exception); 1.109 + 1.110 + do_test_finished(); 1.111 +} 1.112 + 1.113 +function tablesCallbackWithoutSub(tables) 1.114 +{ 1.115 + var parts = tables.split("\n"); 1.116 + parts.sort(); 1.117 + 1.118 + // there's a leading \n here because splitting left an empty string 1.119 + // after the trailing newline, which will sort first 1.120 + do_check_eq(parts.join("\n"), 1.121 + "\ntest-malware-simple;a:1\ntest-phish-simple;a:2"); 1.122 + 1.123 + checkNoHost(); 1.124 +} 1.125 + 1.126 + 1.127 +function expireSubSuccess(result) { 1.128 + dbservice.getTables(tablesCallbackWithoutSub); 1.129 +} 1.130 + 1.131 +function tablesCallbackWithSub(tables) 1.132 +{ 1.133 + var parts = tables.split("\n"); 1.134 + parts.sort(); 1.135 + 1.136 + // there's a leading \n here because splitting left an empty string 1.137 + // after the trailing newline, which will sort first 1.138 + do_check_eq(parts.join("\n"), 1.139 + "\ntest-malware-simple;a:1\ntest-phish-simple;a:2:s:3"); 1.140 + 1.141 + // verify that expiring a sub chunk removes its name from the list 1.142 + var data = 1.143 + "n:1000\n" + 1.144 + "i:test-phish-simple\n" + 1.145 + "sd:3\n"; 1.146 + 1.147 + doSimpleUpdate(data, expireSubSuccess, testFailure); 1.148 +} 1.149 + 1.150 +function checkChunksWithSub() 1.151 +{ 1.152 + dbservice.getTables(tablesCallbackWithSub); 1.153 +} 1.154 + 1.155 +function checkDone() { 1.156 + if (--numExpecting == 0) 1.157 + checkChunksWithSub(); 1.158 +} 1.159 + 1.160 +function phishExists(result) { 1.161 + dumpn("phishExists: " + result); 1.162 + try { 1.163 + do_check_true(result.indexOf("test-phish-simple") != -1); 1.164 + } finally { 1.165 + checkDone(); 1.166 + } 1.167 +} 1.168 + 1.169 +function phishDoesntExist(result) { 1.170 + dumpn("phishDoesntExist: " + result); 1.171 + try { 1.172 + do_check_true(result.indexOf("test-phish-simple") == -1); 1.173 + } finally { 1.174 + checkDone(); 1.175 + } 1.176 +} 1.177 + 1.178 +function malwareExists(result) { 1.179 + dumpn("malwareExists: " + result); 1.180 + 1.181 + try { 1.182 + do_check_true(result.indexOf("test-malware-simple") != -1); 1.183 + } finally { 1.184 + checkDone(); 1.185 + } 1.186 +} 1.187 + 1.188 +function checkState() 1.189 +{ 1.190 + numExpecting = 0; 1.191 + 1.192 + for (var key in phishExpected) { 1.193 + var principal = secMan.getNoAppCodebasePrincipal(iosvc.newURI("http://" + key, null, null)); 1.194 + dbservice.lookup(principal, allTables, phishExists, true); 1.195 + numExpecting++; 1.196 + } 1.197 + 1.198 + for (var key in phishUnexpected) { 1.199 + var principal = secMan.getNoAppCodebasePrincipal(iosvc.newURI("http://" + key, null, null)); 1.200 + dbservice.lookup(principal, allTables, phishDoesntExist, true); 1.201 + numExpecting++; 1.202 + } 1.203 + 1.204 + for (var key in malwareExpected) { 1.205 + var principal = secMan.getNoAppCodebasePrincipal(iosvc.newURI("http://" + key, null, null)); 1.206 + dbservice.lookup(principal, allTables, malwareExists, true); 1.207 + numExpecting++; 1.208 + } 1.209 +} 1.210 + 1.211 +function testSubSuccess(result) 1.212 +{ 1.213 + do_check_eq(result, "1000"); 1.214 + checkState(); 1.215 +} 1.216 + 1.217 +function do_subs() { 1.218 + var data = 1.219 + "n:1000\n" + 1.220 + "i:test-phish-simple\n" + 1.221 + "s:3:32:" + chunk3Sub.length + "\n" + 1.222 + chunk3Sub + "\n" + 1.223 + "ad:1\n" + 1.224 + "ad:4-6\n"; 1.225 + 1.226 + doSimpleUpdate(data, testSubSuccess, testFailure); 1.227 +} 1.228 + 1.229 +function testAddSuccess(arg) { 1.230 + do_check_eq(arg, "1000"); 1.231 + 1.232 + do_subs(); 1.233 +} 1.234 + 1.235 +function do_adds() { 1.236 + // This test relies on the fact that only -regexp tables are ungzipped, 1.237 + // and only -hash tables are assumed to be pre-md5'd. So we use 1.238 + // a 'simple' table type to get simple hostname-per-line semantics. 1.239 + 1.240 + var data = 1.241 + "n:1000\n" + 1.242 + "i:test-phish-simple\n" + 1.243 + "a:1:32:" + chunk1.length + "\n" + 1.244 + chunk1 + "\n" + 1.245 + "a:2:32:" + chunk2.length + "\n" + 1.246 + chunk2 + "\n" + 1.247 + "a:4:32:" + chunk4.length + "\n" + 1.248 + chunk4 + "\n" + 1.249 + "a:5:32:" + chunk5.length + "\n" + 1.250 + chunk5 + "\n" + 1.251 + "a:6:32:" + chunk6.length + "\n" + 1.252 + chunk6 + "\n" + 1.253 + "i:test-malware-simple\n" + 1.254 + "a:1:32:" + chunk2.length + "\n" + 1.255 + chunk2 + "\n"; 1.256 + 1.257 + doSimpleUpdate(data, testAddSuccess, testFailure); 1.258 +} 1.259 + 1.260 +function run_test() { 1.261 + do_adds(); 1.262 + do_test_pending(); 1.263 +}