forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			232 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			232 lines
		
	
	
	
		
			6.1 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 testLoadSaveLargeSet() {
 | |
|   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((x, y) => x - y);
 | |
| 
 | |
|   let pset = newPset();
 | |
|   pset.setPrefixes(arr, arr.length);
 | |
| 
 | |
|   doExpectedLookups(pset, arr, 1);
 | |
|   doRandomLookups(pset, arr, 1000);
 | |
| 
 | |
|   checkContents(pset, arr);
 | |
| 
 | |
|   // Now try to save, restore, and redo the lookups
 | |
|   var file = Services.dirsvc.get("ProfLD", Ci.nsIFile);
 | |
|   file.append("testLarge.pset");
 | |
| 
 | |
|   pset.storeToFile(file);
 | |
| 
 | |
|   let psetLoaded = newPset();
 | |
|   psetLoaded.loadFromFile(file);
 | |
| 
 | |
|   doExpectedLookups(psetLoaded, arr, 1);
 | |
|   doRandomLookups(psetLoaded, arr, 1000);
 | |
| 
 | |
|   checkContents(psetLoaded, arr);
 | |
| }
 | |
| 
 | |
| 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);
 | |
| }
 | |
| 
 | |
| function testLoadSaveNoDelta() {
 | |
|   let N = 100;
 | |
|   let arr = [];
 | |
| 
 | |
|   for (let i = 0; i < N; i++) {
 | |
|     // construct a tree without deltas by making the distance
 | |
|     // between entries larger than 16 bits
 | |
|     arr.push(((1 << 16) + 1) * i);
 | |
|   }
 | |
| 
 | |
|   let pset = newPset();
 | |
|   pset.setPrefixes(arr, arr.length);
 | |
| 
 | |
|   doExpectedLookups(pset, arr, 1);
 | |
| 
 | |
|   var file = Services.dirsvc.get("ProfLD", Ci.nsIFile);
 | |
|   file.append("testNoDelta.pset");
 | |
| 
 | |
|   pset.storeToFile(file);
 | |
|   pset.loadFromFile(file);
 | |
| 
 | |
|   doExpectedLookups(pset, arr, 1);
 | |
| }
 | |
| 
 | |
| var tests = [testBasicPset,
 | |
|              testSimplePset,
 | |
|              testReSetPrefixes,
 | |
|              testLoadSaveLargeSet,
 | |
|              testDuplicates,
 | |
|              testTinySet,
 | |
|              testLoadSaveNoDelta];
 | |
| 
 | |
| 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]();
 | |
|   }
 | |
| }
 | 
