fune/toolkit/components/url-classifier/tests/unit/test_addsub.js
Mark Banner 691543ee89 Bug 1486739 - Add missing dangling commas in browser/, services/, taskcluster/ and toolkit/. r=mossop
Automatic changes by ESLint, except for manual corrections for .xml files.

Differential Revision: https://phabricator.services.mozilla.com/D4439

--HG--
extra : moz-landing-system : lando
2018-08-31 05:59:17 +00:00

475 lines
13 KiB
JavaScript

function doTest(updates, assertions) {
doUpdateTest(updates, assertions, runNextTest, updateError);
}
// Test an add of two urls to a fresh database
function testSimpleAdds() {
var addUrls = [ "foo.com/a", "foo.com/b", "bar.com/c" ];
var update = buildPhishingUpdate(
[
{ "chunkNum": 1,
"urls": addUrls,
}]);
var assertions = {
"tableData": "test-phish-simple;a:1",
"urlsExist": addUrls,
};
doTest([update], assertions);
}
// Same as testSimpleAdds, but make the same-domain URLs come from different
// chunks.
function testMultipleAdds() {
var add1Urls = [ "foo.com/a", "bar.com/c" ];
var add2Urls = [ "foo.com/b" ];
var update = buildPhishingUpdate(
[{ "chunkNum": 1,
"urls": add1Urls },
{ "chunkNum": 2,
"urls": add2Urls }]);
var assertions = {
"tableData": "test-phish-simple;a:1-2",
"urlsExist": add1Urls.concat(add2Urls),
};
doTest([update], assertions);
}
// Test that a sub will remove an existing add
function testSimpleSub() {
var addUrls = ["foo.com/a", "bar.com/b"];
var subUrls = ["1:foo.com/a"];
var addUpdate = buildPhishingUpdate(
[{ "chunkNum": 1, // adds and subtracts don't share a chunk numbering space
"urls": addUrls }]);
var subUpdate = buildPhishingUpdate(
[{ "chunkNum": 50,
"chunkType": "s",
"urls": subUrls }]);
var assertions = {
"tableData": "test-phish-simple;a:1:s:50",
"urlsExist": [ "bar.com/b" ],
"urlsDontExist": ["foo.com/a" ],
"subsDontExist": [ "foo.com/a" ],
};
doTest([addUpdate, subUpdate], assertions);
}
// Same as testSimpleSub(), but the sub comes in before the add.
function testSubEmptiesAdd() {
var subUrls = ["1:foo.com/a"];
var addUrls = ["foo.com/a", "bar.com/b"];
var subUpdate = buildPhishingUpdate(
[{ "chunkNum": 50,
"chunkType": "s",
"urls": subUrls }]);
var addUpdate = buildPhishingUpdate(
[{ "chunkNum": 1,
"urls": addUrls }]);
var assertions = {
"tableData": "test-phish-simple;a:1:s:50",
"urlsExist": [ "bar.com/b" ],
"urlsDontExist": ["foo.com/a" ],
"subsDontExist": [ "foo.com/a" ], // this sub was found, it shouldn't exist anymore
};
doTest([subUpdate, addUpdate], assertions);
}
// Very similar to testSubEmptiesAdd, except that the domain entry will
// still have an item left over that needs to be synced.
function testSubPartiallyEmptiesAdd() {
var subUrls = ["1:foo.com/a"];
var addUrls = ["foo.com/a", "foo.com/b", "bar.com/b"];
var subUpdate = buildPhishingUpdate(
[{ "chunkNum": 1,
"chunkType": "s",
"urls": subUrls }]);
var addUpdate = buildPhishingUpdate(
[{ "chunkNum": 1, // adds and subtracts don't share a chunk numbering space
"urls": addUrls }]);
var assertions = {
"tableData": "test-phish-simple;a:1:s:1",
"urlsExist": [ "foo.com/b", "bar.com/b" ],
"urlsDontExist": ["foo.com/a" ],
"subsDontExist": [ "foo.com/a" ], // this sub was found, it shouldn't exist anymore
};
doTest([subUpdate, addUpdate], assertions);
}
// We SHOULD be testing that pending subs are removed using
// subsDontExist assertions. Since we don't have a good interface for getting
// at sub entries, we'll verify it by side-effect. Subbing a url once
// then adding it twice should leave the url intact.
function testPendingSubRemoved() {
var subUrls = ["1:foo.com/a", "2:foo.com/b"];
var addUrls = ["foo.com/a", "foo.com/b"];
var subUpdate = buildPhishingUpdate(
[{ "chunkNum": 1,
"chunkType": "s",
"urls": subUrls }]);
var addUpdate1 = buildPhishingUpdate(
[{ "chunkNum": 1, // adds and subtracts don't share a chunk numbering space
"urls": addUrls }]);
var addUpdate2 = buildPhishingUpdate(
[{ "chunkNum": 2,
"urls": addUrls }]);
var assertions = {
"tableData": "test-phish-simple;a:1-2:s:1",
"urlsExist": [ "foo.com/a", "foo.com/b" ],
"subsDontExist": [ "foo.com/a", "foo.com/b" ], // this sub was found, it shouldn't exist anymore
};
doTest([subUpdate, addUpdate1, addUpdate2], assertions);
}
// Make sure that a saved sub is removed when the sub chunk is expired.
function testPendingSubExpire() {
var subUrls = ["1:foo.com/a", "1:foo.com/b"];
var addUrls = ["foo.com/a", "foo.com/b"];
var subUpdate = buildPhishingUpdate(
[{ "chunkNum": 1,
"chunkType": "s",
"urls": subUrls }]);
var expireUpdate = buildPhishingUpdate(
[{ "chunkNum": 1,
"chunkType": "sd" }]);
var addUpdate = buildPhishingUpdate(
[{ "chunkNum": 1, // adds and subtracts don't share a chunk numbering space
"urls": addUrls }]);
var assertions = {
"tableData": "test-phish-simple;a:1",
"urlsExist": [ "foo.com/a", "foo.com/b" ],
"subsDontExist": [ "foo.com/a", "foo.com/b" ], // this sub was expired
};
doTest([subUpdate, expireUpdate, addUpdate], assertions);
}
// Make sure that the sub url removes from only the chunk that it specifies
function testDuplicateAdds() {
var urls = ["foo.com/a"];
var addUpdate1 = buildPhishingUpdate(
[{ "chunkNum": 1,
"urls": urls }]);
var addUpdate2 = buildPhishingUpdate(
[{ "chunkNum": 2,
"urls": urls }]);
var subUpdate = buildPhishingUpdate(
[{ "chunkNum": 3,
"chunkType": "s",
"urls": ["2:foo.com/a"]}]);
var assertions = {
"tableData": "test-phish-simple;a:1-2:s:3",
"urlsExist": [ "foo.com/a"],
"subsDontExist": [ "foo.com/a"],
};
doTest([addUpdate1, addUpdate2, subUpdate], assertions);
}
// Tests a sub which matches some existing adds but leaves others.
function testSubPartiallyMatches() {
var addUrls = ["1:foo.com/a", "2:foo.com/b"];
var addUpdate = buildPhishingUpdate(
[{ "chunkNum": 1,
"urls": addUrls }]);
var subUpdate = buildPhishingUpdate(
[{ "chunkNum": 1,
"chunkType": "s",
"urls": addUrls }]);
var assertions = {
"tableData": "test-phish-simple;a:1:s:1",
"urlsDontExist": ["foo.com/a"],
"subsDontExist": ["foo.com/a"],
"subsExist": ["foo.com/b"],
};
doTest([addUpdate, subUpdate], assertions);
}
// XXX: because subsExist isn't actually implemented, this is the same
// test as above but with a second add chunk that should fail to be added
// because of a pending sub chunk.
function testSubPartiallyMatches2() {
var addUrls = ["foo.com/a"];
var subUrls = ["1:foo.com/a", "2:foo.com/b"];
var addUrls2 = ["foo.com/b"];
var addUpdate = buildPhishingUpdate(
[{ "chunkNum": 1,
"urls": addUrls }]);
var subUpdate = buildPhishingUpdate(
[{ "chunkNum": 1,
"chunkType": "s",
"urls": subUrls }]);
var addUpdate2 = buildPhishingUpdate(
[{ "chunkNum": 2,
"urls": addUrls2 }]);
var assertions = {
"tableData": "test-phish-simple;a:1-2:s:1",
"urlsDontExist": ["foo.com/a", "foo.com/b"],
"subsDontExist": ["foo.com/a", "foo.com/b"],
};
doTest([addUpdate, subUpdate, addUpdate2], assertions);
}
// Verify that two subs for the same domain but from different chunks
// match (tests that existing sub entries are properly updated)
function testSubsDifferentChunks() {
var subUrls1 = [ "3:foo.com/a" ];
var subUrls2 = [ "3:foo.com/b" ];
var addUrls = [ "foo.com/a", "foo.com/b", "foo.com/c" ];
var subUpdate1 = buildPhishingUpdate(
[{ "chunkNum": 1,
"chunkType": "s",
"urls": subUrls1 }]);
var subUpdate2 = buildPhishingUpdate(
[{ "chunkNum": 2,
"chunkType": "s",
"urls": subUrls2 }]);
var addUpdate = buildPhishingUpdate(
[{ "chunkNum": 3,
"urls": addUrls }]);
var assertions = {
"tableData": "test-phish-simple;a:3:s:1-2",
"urlsExist": [ "foo.com/c" ],
"urlsDontExist": [ "foo.com/a", "foo.com/b" ],
"subsDontExist": [ "foo.com/a", "foo.com/b" ],
};
doTest([subUpdate1, subUpdate2, addUpdate], assertions);
}
// for bug 534079
function testSubsDifferentChunksSameHostId() {
var subUrls1 = [ "1:foo.com/a" ];
var subUrls2 = [ "1:foo.com/b", "2:foo.com/c" ];
var addUrls = [ "foo.com/a", "foo.com/b" ];
var addUrls2 = [ "foo.com/c" ];
var subUpdate1 = buildPhishingUpdate(
[{ "chunkNum": 1,
"chunkType": "s",
"urls": subUrls1 }]);
var subUpdate2 = buildPhishingUpdate(
[{ "chunkNum": 2,
"chunkType": "s",
"urls": subUrls2 }]);
var addUpdate = buildPhishingUpdate(
[{ "chunkNum": 1,
"urls": addUrls }]);
var addUpdate2 = buildPhishingUpdate(
[{ "chunkNum": 2,
"urls": addUrls2 }]);
var assertions = {
"tableData": "test-phish-simple;a:1-2:s:1-2",
"urlsDontExist": [ "foo.com/c", "foo.com/b", "foo.com/a" ],
};
doTest([addUpdate, addUpdate2, subUpdate1, subUpdate2], assertions);
}
// Test lists of expired chunks
function testExpireLists() {
var addUpdate = buildPhishingUpdate(
[
{ "chunkNum": 1,
"urls": [ "foo.com/a" ],
},
{ "chunkNum": 3,
"urls": [ "bar.com/a" ],
},
{ "chunkNum": 4,
"urls": [ "baz.com/a" ],
},
{ "chunkNum": 5,
"urls": [ "blah.com/a" ],
},
]);
var subUpdate = buildPhishingUpdate(
[
{ "chunkNum": 1,
"chunkType": "s",
"urls": [ "50:foo.com/1" ],
},
{ "chunkNum": 2,
"chunkType": "s",
"urls": [ "50:bar.com/1" ],
},
{ "chunkNum": 3,
"chunkType": "s",
"urls": [ "50:baz.com/1" ],
},
{ "chunkNum": 5,
"chunkType": "s",
"urls": [ "50:blah.com/1" ],
},
]);
var expireUpdate = buildPhishingUpdate(
[ { "chunkType": "ad:1,3-5" },
{ "chunkType": "sd:1-3,5" }]);
var assertions = {
// "tableData" : "test-phish-simple;"
"tableData": "",
};
doTest([addUpdate, subUpdate, expireUpdate], assertions);
}
// Test a duplicate add chunk.
function testDuplicateAddChunks() {
var addUrls1 = [ "foo.com/a" ];
var addUrls2 = [ "bar.com/b" ];
var update = buildPhishingUpdate(
[
{ "chunkNum": 1,
"urls": addUrls1,
},
{ "chunkNum": 1,
"urls": addUrls2,
}]);
var assertions = {
"tableData": "test-phish-simple;a:1",
"urlsExist": addUrls1,
"urlsDontExist": addUrls2,
};
doTest([update], assertions);
}
// This test is a bit tricky. We want to test that an add removes all
// subs with the same add chunk id, even if there is no match. To do
// that we need to add the same add chunk twice, with an expiration
// in the middle. This would be easier if subsDontExist actually
// worked...
function testExpireWholeSub() {
var subUrls = ["1:foo.com/a"];
var update = buildPhishingUpdate(
[{ "chunkNum": 5,
"chunkType": "s",
"urls": subUrls,
},
// empty add chunk should still cause foo.com/a to go away.
{ "chunkNum": 1,
"urls": [],
},
// and now adding chunk 1 again with foo.com/a should succeed,
// because the sub should have been expired with the empty
// add chunk.
// we need to expire this chunk to let us add chunk 1 again.
{
"chunkType": "ad:1",
},
{ "chunkNum": 1,
"urls": [ "foo.com/a" ],
}]);
var assertions = {
"tableData": "test-phish-simple;a:1:s:5",
"urlsExist": ["foo.com/a"],
};
doTest([update], assertions);
}
// This test is roughly the opposite of testExpireWholeSub(). We add
// the empty add first, and make sure that it prevents a sub for that
// add from being applied.
function testPreventWholeSub() {
var subUrls = ["1:foo.com/a"];
var update = buildPhishingUpdate(
[ // empty add chunk should cause foo.com/a to not be saved
{ "chunkNum": 1,
"urls": [],
},
{ "chunkNum": 5,
"chunkType": "s",
"urls": subUrls,
},
// and now adding chunk 1 again with foo.com/a should succeed,
// because the sub should have been expired with the empty
// add chunk.
// we need to expire this chunk to let us add chunk 1 again.
{
"chunkType": "ad:1",
},
{ "chunkNum": 1,
"urls": [ "foo.com/a" ],
}]);
var assertions = {
"tableData": "test-phish-simple;a:1:s:5",
"urlsExist": ["foo.com/a"],
};
doTest([update], assertions);
}
function run_test() {
runTests([
testSimpleAdds,
testMultipleAdds,
testSimpleSub,
testSubEmptiesAdd,
testSubPartiallyEmptiesAdd,
testPendingSubRemoved,
testPendingSubExpire,
testDuplicateAdds,
testSubPartiallyMatches,
testSubPartiallyMatches2,
testSubsDifferentChunks,
testSubsDifferentChunksSameHostId,
testExpireLists,
]);
}
do_test_pending();