gecko/toolkit/components/url-classifier/tests/unit/test_prefixset.js

175 lines
4.8 KiB
JavaScript

// newPset: returns an empty nsIUrlClassifierPrefixSet.
function newPset() {
return Cc["@mozilla.org/url-classifier/prefixset;1"]
.createInstance(Ci.nsIUrlClassifierPrefixSet);
}
// arrContains: returns true if |arr| contains the element |target|. Uses binary
// search and requires |arr| to be sorted.
function arrContains(arr, target) {
let start = 0;
let end = arr.length - 1;
let i = 0;
while (end > start) {
i = start + (end - start >> 1);
let value = arr[i];
if (value < target)
start = i+1;
else if (value > target)
end = i-1;
else
break;
}
if (start == end)
i = start;
return (!(i < 0 || i >= arr.length) && arr[i] == target);
}
function wrappedProbe(pset, prefix) {
let key = pset.getKey();
let dummy = {};
return pset.probe(prefix, key, dummy);
};
// doRandomLookups: we use this to test for false membership with random input
// over the range of prefixes (unsigned 32-bits integers).
// pset: a nsIUrlClassifierPrefixSet to test.
// prefixes: an array of prefixes supposed to make up the prefix set.
// N: number of random lookups to make.
function doRandomLookups(pset, prefixes, N) {
for (let i = 0; i < N; i++) {
let randInt = prefixes[0];
while (arrContains(prefixes, randInt))
randInt = Math.floor(Math.random() * Math.pow(2, 32));
do_check_false(wrappedProbe(pset, randInt));
}
}
// doExpectedLookups: we use this to test expected membership.
// pset: a nsIUrlClassifierPrefixSet to test.
// prefixes:
function doExpectedLookups(pset, prefixes, N) {
for (let i = 0; i < N; i++) {
prefixes.forEach(function (x) {
dump("Checking " + x + "\n");
do_check_true(wrappedProbe(pset, x));
});
}
}
// testBasicPset: A very basic test of the prefix set to make sure that it
// exists and to give a basic example of its use.
function testBasicPset() {
let pset = Cc["@mozilla.org/url-classifier/prefixset;1"]
.createInstance(Ci.nsIUrlClassifierPrefixSet);
let prefixes = [2,100,50,2000,78000,1593203];
pset.setPrefixes(prefixes, prefixes.length);
do_check_true(wrappedProbe(pset, 100));
do_check_false(wrappedProbe(pset, 100000));
do_check_true(wrappedProbe(pset, 1593203));
do_check_false(wrappedProbe(pset, 999));
do_check_false(wrappedProbe(pset, 0));
}
function testDuplicates() {
let pset = Cc["@mozilla.org/url-classifier/prefixset;1"]
.createInstance(Ci.nsIUrlClassifierPrefixSet);
let prefixes = [1,1,2,2,2,3,3,3,3,3,3,5,6,6,7,7,9,9,9];
pset.setPrefixes(prefixes, prefixes.length);
do_check_true(wrappedProbe(pset, 1));
do_check_true(wrappedProbe(pset, 2));
do_check_true(wrappedProbe(pset, 5));
do_check_true(wrappedProbe(pset, 9));
do_check_false(wrappedProbe(pset, 4));
do_check_false(wrappedProbe(pset, 8));
}
function testSimplePset() {
let pset = newPset();
let prefixes = [1,2,100,400,123456789];
pset.setPrefixes(prefixes, prefixes.length);
doRandomLookups(pset, prefixes, 100);
doExpectedLookups(pset, prefixes, 1);
}
function testUnsortedPset() {
let pset = newPset();
let prefixes = [5,1,20,100,200000,100000];
pset.setPrefixes(prefixes, prefixes.length);
doRandomLookups(pset, prefixes, 100);
doExpectedLookups(pset, prefixes, 1);
}
function testReSetPrefixes() {
let pset = newPset();
let prefixes = [1, 5, 100, 1000, 150000];
pset.setPrefixes(prefixes, prefixes.length);
doExpectedLookups(pset, prefixes, 1);
let secondPrefixes = [12, 50, 300, 2000, 5000, 200000];
pset.setPrefixes(secondPrefixes, secondPrefixes.length);
doExpectedLookups(pset, secondPrefixes, 1);
for (let i = 0; i < prefixes.length; i++) {
do_check_false(wrappedProbe(pset, prefixes[i]));
}
}
function testLargeSet() {
let N = 1000;
let arr = [];
for (let i = 0; i < N; i++) {
let randInt = Math.floor(Math.random() * Math.pow(2, 32));
arr.push(randInt);
}
arr.sort(function(x,y) x - y);
let pset = newPset();
pset.setPrefixes(arr, arr.length);
doExpectedLookups(pset, arr, 1);
doRandomLookups(pset, arr, 1000);
}
function testTinySet() {
let pset = Cc["@mozilla.org/url-classifier/prefixset;1"]
.createInstance(Ci.nsIUrlClassifierPrefixSet);
let prefixes = [1];
pset.setPrefixes(prefixes, prefixes.length);
do_check_true(wrappedProbe(pset, 1));
do_check_false(wrappedProbe(pset, 100000));
prefixes = [];
pset.setPrefixes(prefixes, prefixes.length);
do_check_false(wrappedProbe(pset, 1));
}
let tests = [testBasicPset,
testSimplePset,
testUnsortedPset,
testReSetPrefixes,
testLargeSet,
testDuplicates,
testTinySet];
function run_test() {
// None of the tests use |executeSoon| or any sort of callbacks, so we can
// just run them in succession.
for (let i = 0; i < tests.length; i++) {
dump("Running " + tests[i].name + "\n");
tests[i]();
}
}