1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/toolkit/components/url-classifier/tests/unit/test_addsub.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,488 @@ 1.4 + 1.5 +function doTest(updates, assertions) 1.6 +{ 1.7 + doUpdateTest(updates, assertions, runNextTest, updateError); 1.8 +} 1.9 + 1.10 +// Test an add of two urls to a fresh database 1.11 +function testSimpleAdds() { 1.12 + var addUrls = [ "foo.com/a", "foo.com/b", "bar.com/c" ]; 1.13 + var update = buildPhishingUpdate( 1.14 + [ 1.15 + { "chunkNum" : 1, 1.16 + "urls" : addUrls 1.17 + }]); 1.18 + 1.19 + var assertions = { 1.20 + "tableData" : "test-phish-simple;a:1", 1.21 + "urlsExist" : addUrls 1.22 + }; 1.23 + 1.24 + doTest([update], assertions); 1.25 +} 1.26 + 1.27 +// Same as testSimpleAdds, but make the same-domain URLs come from different 1.28 +// chunks. 1.29 +function testMultipleAdds() { 1.30 + var add1Urls = [ "foo.com/a", "bar.com/c" ]; 1.31 + var add2Urls = [ "foo.com/b" ]; 1.32 + 1.33 + var update = buildPhishingUpdate( 1.34 + [{ "chunkNum" : 1, 1.35 + "urls" : add1Urls }, 1.36 + { "chunkNum" : 2, 1.37 + "urls" : add2Urls }]); 1.38 + var assertions = { 1.39 + "tableData" : "test-phish-simple;a:1-2", 1.40 + "urlsExist" : add1Urls.concat(add2Urls) 1.41 + }; 1.42 + 1.43 + doTest([update], assertions); 1.44 +} 1.45 + 1.46 +// Test that a sub will remove an existing add 1.47 +function testSimpleSub() 1.48 +{ 1.49 + var addUrls = ["foo.com/a", "bar.com/b"]; 1.50 + var subUrls = ["1:foo.com/a"]; 1.51 + 1.52 + var addUpdate = buildPhishingUpdate( 1.53 + [{ "chunkNum" : 1, // adds and subtracts don't share a chunk numbering space 1.54 + "urls": addUrls }]); 1.55 + 1.56 + var subUpdate = buildPhishingUpdate( 1.57 + [{ "chunkNum" : 50, 1.58 + "chunkType" : "s", 1.59 + "urls": subUrls }]); 1.60 + 1.61 + 1.62 + var assertions = { 1.63 + "tableData" : "test-phish-simple;a:1:s:50", 1.64 + "urlsExist" : [ "bar.com/b" ], 1.65 + "urlsDontExist": ["foo.com/a" ], 1.66 + "subsDontExist" : [ "foo.com/a" ] 1.67 + } 1.68 + 1.69 + doTest([addUpdate, subUpdate], assertions); 1.70 + 1.71 +} 1.72 + 1.73 +// Same as testSimpleSub(), but the sub comes in before the add. 1.74 +function testSubEmptiesAdd() 1.75 +{ 1.76 + var subUrls = ["1:foo.com/a"]; 1.77 + var addUrls = ["foo.com/a", "bar.com/b"]; 1.78 + 1.79 + var subUpdate = buildPhishingUpdate( 1.80 + [{ "chunkNum" : 50, 1.81 + "chunkType" : "s", 1.82 + "urls": subUrls }]); 1.83 + 1.84 + var addUpdate = buildPhishingUpdate( 1.85 + [{ "chunkNum" : 1, 1.86 + "urls": addUrls }]); 1.87 + 1.88 + var assertions = { 1.89 + "tableData" : "test-phish-simple;a:1:s:50", 1.90 + "urlsExist" : [ "bar.com/b" ], 1.91 + "urlsDontExist": ["foo.com/a" ], 1.92 + "subsDontExist" : [ "foo.com/a" ] // this sub was found, it shouldn't exist anymore 1.93 + } 1.94 + 1.95 + doTest([subUpdate, addUpdate], assertions); 1.96 +} 1.97 + 1.98 +// Very similar to testSubEmptiesAdd, except that the domain entry will 1.99 +// still have an item left over that needs to be synced. 1.100 +function testSubPartiallyEmptiesAdd() 1.101 +{ 1.102 + var subUrls = ["1:foo.com/a"]; 1.103 + var addUrls = ["foo.com/a", "foo.com/b", "bar.com/b"]; 1.104 + 1.105 + var subUpdate = buildPhishingUpdate( 1.106 + [{ "chunkNum" : 1, 1.107 + "chunkType" : "s", 1.108 + "urls": subUrls }]); 1.109 + 1.110 + var addUpdate = buildPhishingUpdate( 1.111 + [{ "chunkNum" : 1, // adds and subtracts don't share a chunk numbering space 1.112 + "urls": addUrls }]); 1.113 + 1.114 + var assertions = { 1.115 + "tableData" : "test-phish-simple;a:1:s:1", 1.116 + "urlsExist" : [ "foo.com/b", "bar.com/b" ], 1.117 + "urlsDontExist" : ["foo.com/a" ], 1.118 + "subsDontExist" : [ "foo.com/a" ] // this sub was found, it shouldn't exist anymore 1.119 + } 1.120 + 1.121 + doTest([subUpdate, addUpdate], assertions); 1.122 +} 1.123 + 1.124 +// We SHOULD be testing that pending subs are removed using 1.125 +// subsDontExist assertions. Since we don't have a good interface for getting 1.126 +// at sub entries, we'll verify it by side-effect. Subbing a url once 1.127 +// then adding it twice should leave the url intact. 1.128 +function testPendingSubRemoved() 1.129 +{ 1.130 + var subUrls = ["1:foo.com/a", "2:foo.com/b"]; 1.131 + var addUrls = ["foo.com/a", "foo.com/b"]; 1.132 + 1.133 + var subUpdate = buildPhishingUpdate( 1.134 + [{ "chunkNum" : 1, 1.135 + "chunkType" : "s", 1.136 + "urls": subUrls }]); 1.137 + 1.138 + var addUpdate1 = buildPhishingUpdate( 1.139 + [{ "chunkNum" : 1, // adds and subtracts don't share a chunk numbering space 1.140 + "urls": addUrls }]); 1.141 + 1.142 + var addUpdate2 = buildPhishingUpdate( 1.143 + [{ "chunkNum" : 2, 1.144 + "urls": addUrls }]); 1.145 + 1.146 + var assertions = { 1.147 + "tableData" : "test-phish-simple;a:1-2:s:1", 1.148 + "urlsExist" : [ "foo.com/a", "foo.com/b" ], 1.149 + "subsDontExist" : [ "foo.com/a", "foo.com/b" ] // this sub was found, it shouldn't exist anymore 1.150 + } 1.151 + 1.152 + doTest([subUpdate, addUpdate1, addUpdate2], assertions); 1.153 +} 1.154 + 1.155 +// Make sure that a saved sub is removed when the sub chunk is expired. 1.156 +function testPendingSubExpire() 1.157 +{ 1.158 + var subUrls = ["1:foo.com/a", "1:foo.com/b"]; 1.159 + var addUrls = ["foo.com/a", "foo.com/b"]; 1.160 + 1.161 + var subUpdate = buildPhishingUpdate( 1.162 + [{ "chunkNum" : 1, 1.163 + "chunkType" : "s", 1.164 + "urls": subUrls }]); 1.165 + 1.166 + var expireUpdate = buildPhishingUpdate( 1.167 + [{ "chunkNum" : 1, 1.168 + "chunkType" : "sd" }]); 1.169 + 1.170 + var addUpdate = buildPhishingUpdate( 1.171 + [{ "chunkNum" : 1, // adds and subtracts don't share a chunk numbering space 1.172 + "urls": addUrls }]); 1.173 + 1.174 + var assertions = { 1.175 + "tableData" : "test-phish-simple;a:1", 1.176 + "urlsExist" : [ "foo.com/a", "foo.com/b" ], 1.177 + "subsDontExist" : [ "foo.com/a", "foo.com/b" ] // this sub was expired 1.178 + } 1.179 + 1.180 + doTest([subUpdate, expireUpdate, addUpdate], assertions); 1.181 +} 1.182 + 1.183 +// Make sure that the sub url removes from only the chunk that it specifies 1.184 +function testDuplicateAdds() 1.185 +{ 1.186 + var urls = ["foo.com/a"]; 1.187 + 1.188 + var addUpdate1 = buildPhishingUpdate( 1.189 + [{ "chunkNum" : 1, 1.190 + "urls": urls }]); 1.191 + var addUpdate2 = buildPhishingUpdate( 1.192 + [{ "chunkNum" : 2, 1.193 + "urls": urls }]); 1.194 + var subUpdate = buildPhishingUpdate( 1.195 + [{ "chunkNum" : 3, 1.196 + "chunkType" : "s", 1.197 + "urls": ["2:foo.com/a"]}]); 1.198 + 1.199 + var assertions = { 1.200 + "tableData" : "test-phish-simple;a:1-2:s:3", 1.201 + "urlsExist" : [ "foo.com/a"], 1.202 + "subsDontExist" : [ "foo.com/a"] 1.203 + } 1.204 + 1.205 + doTest([addUpdate1, addUpdate2, subUpdate], assertions); 1.206 +} 1.207 + 1.208 +// Tests a sub which matches some existing adds but leaves others. 1.209 +function testSubPartiallyMatches() 1.210 +{ 1.211 + var subUrls = ["foo.com/a"]; 1.212 + var addUrls = ["1:foo.com/a", "2:foo.com/b"]; 1.213 + 1.214 + var addUpdate = buildPhishingUpdate( 1.215 + [{ "chunkNum" : 1, 1.216 + "urls" : addUrls }]); 1.217 + 1.218 + var subUpdate = buildPhishingUpdate( 1.219 + [{ "chunkNum" : 1, 1.220 + "chunkType" : "s", 1.221 + "urls" : addUrls }]); 1.222 + 1.223 + var assertions = { 1.224 + "tableData" : "test-phish-simple;a:1:s:1", 1.225 + "urlsDontExist" : ["foo.com/a"], 1.226 + "subsDontExist" : ["foo.com/a"], 1.227 + "subsExist" : ["foo.com/b"] 1.228 + }; 1.229 + 1.230 + doTest([addUpdate, subUpdate], assertions); 1.231 +} 1.232 + 1.233 +// XXX: because subsExist isn't actually implemented, this is the same 1.234 +// test as above but with a second add chunk that should fail to be added 1.235 +// because of a pending sub chunk. 1.236 +function testSubPartiallyMatches2() 1.237 +{ 1.238 + var addUrls = ["foo.com/a"]; 1.239 + var subUrls = ["1:foo.com/a", "2:foo.com/b"]; 1.240 + var addUrls2 = ["foo.com/b"]; 1.241 + 1.242 + var addUpdate = buildPhishingUpdate( 1.243 + [{ "chunkNum" : 1, 1.244 + "urls" : addUrls }]); 1.245 + 1.246 + var subUpdate = buildPhishingUpdate( 1.247 + [{ "chunkNum" : 1, 1.248 + "chunkType" : "s", 1.249 + "urls" : subUrls }]); 1.250 + 1.251 + var addUpdate2 = buildPhishingUpdate( 1.252 + [{ "chunkNum" : 2, 1.253 + "urls" : addUrls2 }]); 1.254 + 1.255 + var assertions = { 1.256 + "tableData" : "test-phish-simple;a:1-2:s:1", 1.257 + "urlsDontExist" : ["foo.com/a", "foo.com/b"], 1.258 + "subsDontExist" : ["foo.com/a", "foo.com/b"] 1.259 + }; 1.260 + 1.261 + doTest([addUpdate, subUpdate, addUpdate2], assertions); 1.262 +} 1.263 + 1.264 +// Verify that two subs for the same domain but from different chunks 1.265 +// match (tests that existing sub entries are properly updated) 1.266 +function testSubsDifferentChunks() { 1.267 + var subUrls1 = [ "3:foo.com/a" ]; 1.268 + var subUrls2 = [ "3:foo.com/b" ]; 1.269 + 1.270 + var addUrls = [ "foo.com/a", "foo.com/b", "foo.com/c" ]; 1.271 + 1.272 + var subUpdate1 = buildPhishingUpdate( 1.273 + [{ "chunkNum" : 1, 1.274 + "chunkType" : "s", 1.275 + "urls": subUrls1 }]); 1.276 + var subUpdate2 = buildPhishingUpdate( 1.277 + [{ "chunkNum" : 2, 1.278 + "chunkType" : "s", 1.279 + "urls" : subUrls2 }]); 1.280 + var addUpdate = buildPhishingUpdate( 1.281 + [{ "chunkNum" : 3, 1.282 + "urls" : addUrls }]); 1.283 + 1.284 + var assertions = { 1.285 + "tableData" : "test-phish-simple;a:3:s:1-2", 1.286 + "urlsExist" : [ "foo.com/c" ], 1.287 + "urlsDontExist" : [ "foo.com/a", "foo.com/b" ], 1.288 + "subsDontExist" : [ "foo.com/a", "foo.com/b" ] 1.289 + }; 1.290 + 1.291 + doTest([subUpdate1, subUpdate2, addUpdate], assertions); 1.292 +} 1.293 + 1.294 +// for bug 534079 1.295 +function testSubsDifferentChunksSameHostId() { 1.296 + var subUrls1 = [ "1:foo.com/a" ]; 1.297 + var subUrls2 = [ "1:foo.com/b", "2:foo.com/c" ]; 1.298 + 1.299 + var addUrls = [ "foo.com/a", "foo.com/b" ]; 1.300 + var addUrls2 = [ "foo.com/c" ]; 1.301 + 1.302 + var subUpdate1 = buildPhishingUpdate( 1.303 + [{ "chunkNum" : 1, 1.304 + "chunkType" : "s", 1.305 + "urls": subUrls1 }]); 1.306 + var subUpdate2 = buildPhishingUpdate( 1.307 + [{ "chunkNum" : 2, 1.308 + "chunkType" : "s", 1.309 + "urls" : subUrls2 }]); 1.310 + 1.311 + var addUpdate = buildPhishingUpdate( 1.312 + [{ "chunkNum" : 1, 1.313 + "urls" : addUrls }]); 1.314 + var addUpdate2 = buildPhishingUpdate( 1.315 + [{ "chunkNum" : 2, 1.316 + "urls" : addUrls2 }]); 1.317 + 1.318 + var assertions = { 1.319 + "tableData" : "test-phish-simple;a:1-2:s:1-2", 1.320 + "urlsDontExist" : [ "foo.com/c", "foo.com/b", "foo.com/a", ], 1.321 + }; 1.322 + 1.323 + doTest([addUpdate, addUpdate2, subUpdate1, subUpdate2], assertions); 1.324 +} 1.325 + 1.326 +// Test lists of expired chunks 1.327 +function testExpireLists() { 1.328 + var addUpdate = buildPhishingUpdate( 1.329 + [ 1.330 + { "chunkNum" : 1, 1.331 + "urls" : [ "foo.com/a" ] 1.332 + }, 1.333 + { "chunkNum" : 3, 1.334 + "urls" : [ "bar.com/a" ] 1.335 + }, 1.336 + { "chunkNum" : 4, 1.337 + "urls" : [ "baz.com/a" ] 1.338 + }, 1.339 + { "chunkNum" : 5, 1.340 + "urls" : [ "blah.com/a" ] 1.341 + }, 1.342 + ]); 1.343 + var subUpdate = buildPhishingUpdate( 1.344 + [ 1.345 + { "chunkNum" : 1, 1.346 + "chunkType" : "s", 1.347 + "urls" : [ "50:foo.com/1" ] 1.348 + }, 1.349 + { "chunkNum" : 2, 1.350 + "chunkType" : "s", 1.351 + "urls" : [ "50:bar.com/1" ] 1.352 + }, 1.353 + { "chunkNum" : 3, 1.354 + "chunkType" : "s", 1.355 + "urls" : [ "50:baz.com/1" ] 1.356 + }, 1.357 + { "chunkNum" : 5, 1.358 + "chunkType" : "s", 1.359 + "urls" : [ "50:blah.com/1" ] 1.360 + }, 1.361 + ]); 1.362 + 1.363 + var expireUpdate = buildPhishingUpdate( 1.364 + [ { "chunkType" : "ad:1,3-5" }, 1.365 + { "chunkType" : "sd:1-3,5" }]); 1.366 + 1.367 + var assertions = { 1.368 + // "tableData" : "test-phish-simple;" 1.369 + "tableData": "" 1.370 + }; 1.371 + 1.372 + doTest([addUpdate, subUpdate, expireUpdate], assertions); 1.373 +} 1.374 + 1.375 +// Test a duplicate add chunk. 1.376 +function testDuplicateAddChunks() { 1.377 + var addUrls1 = [ "foo.com/a" ]; 1.378 + var addUrls2 = [ "bar.com/b" ]; 1.379 + var update = buildPhishingUpdate( 1.380 + [ 1.381 + { "chunkNum" : 1, 1.382 + "urls" : addUrls1 1.383 + }, 1.384 + { "chunkNum" : 1, 1.385 + "urls" : addUrls2 1.386 + }]); 1.387 + 1.388 + var assertions = { 1.389 + "tableData" : "test-phish-simple;a:1", 1.390 + "urlsExist" : addUrls1, 1.391 + "urlsDontExist" : addUrls2 1.392 + }; 1.393 + 1.394 + doTest([update], assertions); 1.395 +} 1.396 + 1.397 +// This test is a bit tricky. We want to test that an add removes all 1.398 +// subs with the same add chunk id, even if there is no match. To do 1.399 +// that we need to add the same add chunk twice, with an expiration 1.400 +// in the middle. This would be easier if subsDontExist actually 1.401 +// worked... 1.402 +function testExpireWholeSub() 1.403 +{ 1.404 + var subUrls = ["1:foo.com/a"]; 1.405 + 1.406 + var update = buildPhishingUpdate( 1.407 + [{ "chunkNum" : 5, 1.408 + "chunkType" : "s", 1.409 + "urls" : subUrls 1.410 + }, 1.411 + // empty add chunk should still cause foo.com/a to go away. 1.412 + { "chunkNum" : 1, 1.413 + "urls" : [] 1.414 + }, 1.415 + // and now adding chunk 1 again with foo.com/a should succeed, 1.416 + // because the sub should have been expired with the empty 1.417 + // add chunk. 1.418 + 1.419 + // we need to expire this chunk to let us add chunk 1 again. 1.420 + { 1.421 + "chunkType" : "ad:1" 1.422 + }, 1.423 + { "chunkNum" : 1, 1.424 + "urls" : [ "foo.com/a" ] 1.425 + }]); 1.426 + 1.427 + var assertions = { 1.428 + "tableData" : "test-phish-simple;a:1:s:5", 1.429 + "urlsExist" : ["foo.com/a"] 1.430 + }; 1.431 + 1.432 + doTest([update], assertions); 1.433 +} 1.434 + 1.435 + 1.436 +// This test is roughly the opposite of testExpireWholeSub(). We add 1.437 +// the empty add first, and make sure that it prevents a sub for that 1.438 +// add from being applied. 1.439 +function testPreventWholeSub() 1.440 +{ 1.441 + var subUrls = ["1:foo.com/a"]; 1.442 + 1.443 + var update = buildPhishingUpdate( 1.444 + [ // empty add chunk should cause foo.com/a to not be saved 1.445 + { "chunkNum" : 1, 1.446 + "urls" : [] 1.447 + }, 1.448 + { "chunkNum" : 5, 1.449 + "chunkType" : "s", 1.450 + "urls" : subUrls 1.451 + }, 1.452 + // and now adding chunk 1 again with foo.com/a should succeed, 1.453 + // because the sub should have been expired with the empty 1.454 + // add chunk. 1.455 + 1.456 + // we need to expire this chunk to let us add chunk 1 again. 1.457 + { 1.458 + "chunkType" : "ad:1" 1.459 + }, 1.460 + { "chunkNum" : 1, 1.461 + "urls" : [ "foo.com/a" ] 1.462 + }]); 1.463 + 1.464 + var assertions = { 1.465 + "tableData" : "test-phish-simple;a:1:s:5", 1.466 + "urlsExist" : ["foo.com/a"] 1.467 + }; 1.468 + 1.469 + doTest([update], assertions); 1.470 +} 1.471 + 1.472 +function run_test() 1.473 +{ 1.474 + runTests([ 1.475 + testSimpleAdds, 1.476 + testMultipleAdds, 1.477 + testSimpleSub, 1.478 + testSubEmptiesAdd, 1.479 + testSubPartiallyEmptiesAdd, 1.480 + testPendingSubRemoved, 1.481 + testPendingSubExpire, 1.482 + testDuplicateAdds, 1.483 + testSubPartiallyMatches, 1.484 + testSubPartiallyMatches2, 1.485 + testSubsDifferentChunks, 1.486 + testSubsDifferentChunksSameHostId, 1.487 + testExpireLists 1.488 + ]); 1.489 +} 1.490 + 1.491 +do_test_pending();