mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 02:09:05 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			178 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			178 lines
		
	
	
	
		
			4.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
// newPset: returns an empty nsIUrlClassifierPrefixSet.
 | 
						|
function newPset() {
 | 
						|
  let pset = Cc["@mozilla.org/url-classifier/prefixset;1"].createInstance(
 | 
						|
    Ci.nsIUrlClassifierPrefixSet
 | 
						|
  );
 | 
						|
  pset.init("all");
 | 
						|
  return pset;
 | 
						|
}
 | 
						|
 | 
						|
// 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;
 | 
						|
}
 | 
						|
 | 
						|
// checkContents: Check whether the PrefixSet pset contains
 | 
						|
// the prefixes in the passed array.
 | 
						|
function checkContents(pset, prefixes) {
 | 
						|
  var outcount = {},
 | 
						|
    outset = {};
 | 
						|
  outset = pset.getPrefixes(outcount);
 | 
						|
  let inset = prefixes;
 | 
						|
  Assert.equal(inset.length, outset.length);
 | 
						|
  inset.sort((x, y) => x - y);
 | 
						|
  for (let i = 0; i < inset.length; i++) {
 | 
						|
    Assert.equal(inset[i], outset[i]);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
function wrappedProbe(pset, prefix) {
 | 
						|
  return pset.contains(prefix);
 | 
						|
}
 | 
						|
 | 
						|
// 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));
 | 
						|
    }
 | 
						|
 | 
						|
    Assert.ok(!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");
 | 
						|
      Assert.ok(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, 50, 100, 2000, 78000, 1593203];
 | 
						|
  pset.setPrefixes(prefixes, prefixes.length);
 | 
						|
 | 
						|
  Assert.ok(wrappedProbe(pset, 100));
 | 
						|
  Assert.ok(!wrappedProbe(pset, 100000));
 | 
						|
  Assert.ok(wrappedProbe(pset, 1593203));
 | 
						|
  Assert.ok(!wrappedProbe(pset, 999));
 | 
						|
  Assert.ok(!wrappedProbe(pset, 0));
 | 
						|
 | 
						|
  checkContents(pset, prefixes);
 | 
						|
}
 | 
						|
 | 
						|
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);
 | 
						|
 | 
						|
  Assert.ok(wrappedProbe(pset, 1));
 | 
						|
  Assert.ok(wrappedProbe(pset, 2));
 | 
						|
  Assert.ok(wrappedProbe(pset, 5));
 | 
						|
  Assert.ok(wrappedProbe(pset, 9));
 | 
						|
  Assert.ok(!wrappedProbe(pset, 4));
 | 
						|
  Assert.ok(!wrappedProbe(pset, 8));
 | 
						|
 | 
						|
  checkContents(pset, prefixes);
 | 
						|
}
 | 
						|
 | 
						|
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);
 | 
						|
 | 
						|
  checkContents(pset, prefixes);
 | 
						|
}
 | 
						|
 | 
						|
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++) {
 | 
						|
    Assert.ok(!wrappedProbe(pset, prefixes[i]));
 | 
						|
  }
 | 
						|
 | 
						|
  checkContents(pset, secondPrefixes);
 | 
						|
}
 | 
						|
 | 
						|
function testTinySet() {
 | 
						|
  let pset = Cc["@mozilla.org/url-classifier/prefixset;1"].createInstance(
 | 
						|
    Ci.nsIUrlClassifierPrefixSet
 | 
						|
  );
 | 
						|
  let prefixes = [1];
 | 
						|
  pset.setPrefixes(prefixes, prefixes.length);
 | 
						|
 | 
						|
  Assert.ok(wrappedProbe(pset, 1));
 | 
						|
  Assert.ok(!wrappedProbe(pset, 100000));
 | 
						|
  checkContents(pset, prefixes);
 | 
						|
 | 
						|
  prefixes = [];
 | 
						|
  pset.setPrefixes(prefixes, prefixes.length);
 | 
						|
  Assert.ok(!wrappedProbe(pset, 1));
 | 
						|
  checkContents(pset, prefixes);
 | 
						|
}
 | 
						|
 | 
						|
var tests = [
 | 
						|
  testBasicPset,
 | 
						|
  testSimplePset,
 | 
						|
  testReSetPrefixes,
 | 
						|
  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]();
 | 
						|
  }
 | 
						|
}
 |