2007-07-25 23:39:22 -07:00
|
|
|
function dumpn(s) {
|
|
|
|
dump(s + "\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
const NS_APP_USER_PROFILE_50_DIR = "ProfD";
|
|
|
|
const NS_APP_USER_PROFILE_LOCAL_50_DIR = "ProfLD";
|
|
|
|
const Ci = Components.interfaces;
|
|
|
|
const Cc = Components.classes;
|
|
|
|
const Cr = Components.results;
|
|
|
|
|
2009-05-14 04:37:40 -07:00
|
|
|
do_get_profile();
|
|
|
|
|
2007-07-25 23:39:22 -07:00
|
|
|
var dirSvc = Cc["@mozilla.org/file/directory_service;1"].getService(Ci.nsIProperties);
|
|
|
|
|
|
|
|
var iosvc = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
|
|
|
|
|
2008-02-26 21:51:28 -08:00
|
|
|
// Disable hashcompleter noise for tests
|
|
|
|
var prefBranch = Cc["@mozilla.org/preferences-service;1"].
|
|
|
|
getService(Ci.nsIPrefBranch);
|
|
|
|
prefBranch.setIntPref("urlclassifier.gethashnoise", 0);
|
|
|
|
|
2008-10-19 20:07:46 -07:00
|
|
|
// Enable malware/phishing checking for tests
|
|
|
|
prefBranch.setBoolPref("browser.safebrowsing.malware.enabled", true);
|
|
|
|
prefBranch.setBoolPref("browser.safebrowsing.enabled", true);
|
|
|
|
|
2007-07-25 23:39:22 -07:00
|
|
|
function cleanUp() {
|
|
|
|
try {
|
|
|
|
// Delete a previously created sqlite file
|
|
|
|
var file = dirSvc.get('ProfLD', Ci.nsIFile);
|
|
|
|
file.append("urlclassifier3.sqlite");
|
|
|
|
if (file.exists())
|
|
|
|
file.remove(false);
|
|
|
|
} catch (e) {}
|
|
|
|
}
|
2008-01-12 13:32:01 -08:00
|
|
|
|
2008-01-12 14:22:03 -08:00
|
|
|
var dbservice = Cc["@mozilla.org/url-classifier/dbservice;1"].getService(Ci.nsIUrlClassifierDBService);
|
|
|
|
var streamUpdater = Cc["@mozilla.org/url-classifier/streamupdater;1"]
|
|
|
|
.getService(Ci.nsIUrlClassifierStreamUpdater);
|
|
|
|
|
|
|
|
|
2008-01-12 13:32:01 -08:00
|
|
|
/*
|
|
|
|
* Builds an update from an object that looks like:
|
|
|
|
*{ "test-phish-simple" : [{
|
|
|
|
* "chunkType" : "a", // 'a' is assumed if not specified
|
|
|
|
* "chunkNum" : 1, // numerically-increasing chunk numbers are assumed
|
|
|
|
* // if not specified
|
|
|
|
* "urls" : [ "foo.com/a", "foo.com/b", "bar.com/" ]
|
|
|
|
* }
|
|
|
|
*/
|
|
|
|
|
2008-01-29 12:57:18 -08:00
|
|
|
function buildUpdate(update, hashSize) {
|
|
|
|
if (!hashSize) {
|
|
|
|
hashSize = 32;
|
|
|
|
}
|
2008-01-12 13:32:01 -08:00
|
|
|
var updateStr = "n:1000\n";
|
|
|
|
|
|
|
|
for (var tableName in update) {
|
2008-01-29 12:57:18 -08:00
|
|
|
if (tableName != "")
|
|
|
|
updateStr += "i:" + tableName + "\n";
|
2008-01-12 13:32:01 -08:00
|
|
|
var chunks = update[tableName];
|
|
|
|
for (var j = 0; j < chunks.length; j++) {
|
|
|
|
var chunk = chunks[j];
|
|
|
|
var chunkType = chunk.chunkType ? chunk.chunkType : 'a';
|
|
|
|
var chunkNum = chunk.chunkNum ? chunk.chunkNum : j;
|
2008-01-29 12:57:18 -08:00
|
|
|
updateStr += chunkType + ':' + chunkNum + ':' + hashSize;
|
2008-01-12 13:32:01 -08:00
|
|
|
|
|
|
|
if (chunk.urls) {
|
|
|
|
var chunkData = chunk.urls.join("\n");
|
|
|
|
updateStr += ":" + chunkData.length + "\n" + chunkData;
|
|
|
|
}
|
|
|
|
|
|
|
|
updateStr += "\n";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return updateStr;
|
|
|
|
}
|
|
|
|
|
2008-01-29 12:57:18 -08:00
|
|
|
function buildPhishingUpdate(chunks, hashSize) {
|
|
|
|
return buildUpdate({"test-phish-simple" : chunks}, hashSize);
|
|
|
|
}
|
|
|
|
|
2008-04-15 15:39:44 -07:00
|
|
|
function buildMalwareUpdate(chunks, hashSize) {
|
|
|
|
return buildUpdate({"test-malware-simple" : chunks}, hashSize);
|
|
|
|
}
|
|
|
|
|
2008-01-29 12:57:18 -08:00
|
|
|
function buildBareUpdate(chunks, hashSize) {
|
|
|
|
return buildUpdate({"" : chunks}, hashSize);
|
2008-01-12 14:22:03 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Performs an update of the dbservice manually, bypassing the stream updater
|
|
|
|
*/
|
2008-02-27 00:51:02 -08:00
|
|
|
function doSimpleUpdate(updateText, success, failure, clientKey) {
|
2008-01-12 14:22:03 -08:00
|
|
|
var listener = {
|
|
|
|
QueryInterface: function(iid)
|
|
|
|
{
|
|
|
|
if (iid.equals(Ci.nsISupports) ||
|
|
|
|
iid.equals(Ci.nsIUrlClassifierUpdateObserver))
|
|
|
|
return this;
|
|
|
|
throw Cr.NS_ERROR_NO_INTERFACE;
|
|
|
|
},
|
|
|
|
|
|
|
|
updateUrlRequested: function(url) { },
|
2008-04-13 21:58:07 -07:00
|
|
|
streamFinished: function(status) { },
|
2008-01-12 14:22:03 -08:00
|
|
|
updateError: function(errorCode) { failure(errorCode); },
|
|
|
|
updateSuccess: function(requestedTimeout) { success(requestedTimeout); }
|
|
|
|
};
|
|
|
|
|
2008-04-15 15:39:44 -07:00
|
|
|
dbservice.beginUpdate(listener,
|
|
|
|
"test-phish-simple,test-malware-simple",
|
|
|
|
clientKey);
|
2008-02-27 00:51:02 -08:00
|
|
|
dbservice.beginStream("", "");
|
2008-01-12 14:22:03 -08:00
|
|
|
dbservice.updateStream(updateText);
|
|
|
|
dbservice.finishStream();
|
|
|
|
dbservice.finishUpdate();
|
|
|
|
}
|
|
|
|
|
2008-04-15 15:39:44 -07:00
|
|
|
/**
|
|
|
|
* Simulates a failed database update.
|
|
|
|
*/
|
|
|
|
function doErrorUpdate(tables, success, failure) {
|
|
|
|
var listener = {
|
|
|
|
QueryInterface: function(iid)
|
|
|
|
{
|
|
|
|
if (iid.equals(Ci.nsISupports) ||
|
|
|
|
iid.equals(Ci.nsIUrlClassifierUpdateObserver))
|
|
|
|
return this;
|
|
|
|
throw Cr.NS_ERROR_NO_INTERFACE;
|
|
|
|
},
|
|
|
|
|
|
|
|
updateUrlRequested: function(url) { },
|
2009-11-15 03:20:31 -08:00
|
|
|
streamFinished: function(status) { },
|
2008-04-15 15:39:44 -07:00
|
|
|
updateError: function(errorCode) { success(errorCode); },
|
|
|
|
updateSuccess: function(requestedTimeout) { failure(requestedTimeout); }
|
|
|
|
};
|
|
|
|
|
|
|
|
dbservice.beginUpdate(listener, tables, null);
|
|
|
|
dbservice.beginStream("", "");
|
|
|
|
dbservice.cancelUpdate();
|
|
|
|
}
|
|
|
|
|
2008-01-12 14:22:03 -08:00
|
|
|
/**
|
|
|
|
* Performs an update of the dbservice using the stream updater and a
|
|
|
|
* data: uri
|
|
|
|
*/
|
2008-02-27 00:51:02 -08:00
|
|
|
function doStreamUpdate(updateText, success, failure, downloadFailure, clientKey) {
|
2008-01-12 14:22:03 -08:00
|
|
|
var dataUpdate = "data:," + encodeURIComponent(updateText);
|
|
|
|
|
|
|
|
if (!downloadFailure)
|
|
|
|
downloadFailure = failure;
|
|
|
|
|
|
|
|
streamUpdater.updateUrl = dataUpdate;
|
2008-04-15 15:39:44 -07:00
|
|
|
streamUpdater.downloadUpdates("test-phish-simple,test-malware-simple", "",
|
|
|
|
clientKey, success, failure, downloadFailure);
|
2008-01-12 14:22:03 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
var gAssertions = {
|
|
|
|
|
|
|
|
tableData : function(expectedTables, cb)
|
|
|
|
{
|
|
|
|
dbservice.getTables(function(tables) {
|
|
|
|
// rebuild the tables in a predictable order.
|
|
|
|
var parts = tables.split("\n");
|
2008-02-27 00:51:02 -08:00
|
|
|
while (parts[parts.length - 1] == '') {
|
|
|
|
parts.pop();
|
|
|
|
}
|
2008-01-12 14:22:03 -08:00
|
|
|
parts.sort();
|
|
|
|
tables = parts.join("\n");
|
|
|
|
|
2008-02-27 00:51:02 -08:00
|
|
|
do_check_eq(tables, expectedTables);
|
2008-01-12 14:22:03 -08:00
|
|
|
cb();
|
|
|
|
});
|
|
|
|
},
|
|
|
|
|
|
|
|
checkUrls: function(urls, expected, cb)
|
|
|
|
{
|
2008-01-29 12:57:18 -08:00
|
|
|
// work with a copy of the list.
|
|
|
|
urls = urls.slice(0);
|
2008-01-12 14:22:03 -08:00
|
|
|
var doLookup = function() {
|
|
|
|
if (urls.length > 0) {
|
|
|
|
var fragment = urls.shift();
|
|
|
|
dbservice.lookup("http://" + fragment,
|
|
|
|
function(arg) {
|
|
|
|
do_check_eq(expected, arg);
|
|
|
|
doLookup();
|
|
|
|
}, true);
|
|
|
|
} else {
|
|
|
|
cb();
|
|
|
|
}
|
2010-02-09 15:48:51 -08:00
|
|
|
};
|
2008-01-12 14:22:03 -08:00
|
|
|
doLookup();
|
|
|
|
},
|
|
|
|
|
|
|
|
urlsDontExist: function(urls, cb)
|
|
|
|
{
|
|
|
|
this.checkUrls(urls, '', cb);
|
|
|
|
},
|
|
|
|
|
|
|
|
urlsExist: function(urls, cb)
|
|
|
|
{
|
|
|
|
this.checkUrls(urls, 'test-phish-simple', cb);
|
|
|
|
},
|
|
|
|
|
2008-01-29 12:57:18 -08:00
|
|
|
malwareUrlsExist: function(urls, cb)
|
|
|
|
{
|
|
|
|
this.checkUrls(urls, 'test-malware-simple', cb);
|
|
|
|
},
|
|
|
|
|
2008-01-12 14:22:03 -08:00
|
|
|
subsDontExist: function(urls, cb)
|
|
|
|
{
|
|
|
|
// XXX: there's no interface for checking items in the subs table
|
|
|
|
cb();
|
|
|
|
},
|
|
|
|
|
|
|
|
subsExist: function(urls, cb)
|
|
|
|
{
|
|
|
|
// XXX: there's no interface for checking items in the subs table
|
|
|
|
cb();
|
|
|
|
}
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Check a set of assertions against the gAssertions table.
|
|
|
|
*/
|
|
|
|
function checkAssertions(assertions, doneCallback)
|
|
|
|
{
|
|
|
|
var checkAssertion = function() {
|
|
|
|
for (var i in assertions) {
|
|
|
|
var data = assertions[i];
|
|
|
|
delete assertions[i];
|
|
|
|
gAssertions[i](data, checkAssertion);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
doneCallback();
|
|
|
|
}
|
|
|
|
|
|
|
|
checkAssertion();
|
|
|
|
}
|
|
|
|
|
|
|
|
function updateError(arg)
|
|
|
|
{
|
|
|
|
do_throw(arg);
|
|
|
|
}
|
|
|
|
|
2009-05-14 04:37:40 -07:00
|
|
|
// Runs a set of updates, and then checks a set of assertions.
|
2008-02-27 00:51:02 -08:00
|
|
|
function doUpdateTest(updates, assertions, successCallback, errorCallback, clientKey) {
|
|
|
|
var errorUpdate = function() {
|
|
|
|
checkAssertions(assertions, errorCallback);
|
|
|
|
}
|
|
|
|
|
2008-01-12 14:22:03 -08:00
|
|
|
var runUpdate = function() {
|
|
|
|
if (updates.length > 0) {
|
|
|
|
var update = updates.shift();
|
2008-02-27 00:51:02 -08:00
|
|
|
doStreamUpdate(update, runUpdate, errorUpdate, null, clientKey);
|
2008-01-12 14:22:03 -08:00
|
|
|
} else {
|
|
|
|
checkAssertions(assertions, successCallback);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
runUpdate();
|
|
|
|
}
|
|
|
|
|
|
|
|
var gTests;
|
|
|
|
var gNextTest = 0;
|
|
|
|
|
|
|
|
function runNextTest()
|
|
|
|
{
|
|
|
|
if (gNextTest >= gTests.length) {
|
|
|
|
do_test_finished();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2008-01-29 12:57:18 -08:00
|
|
|
dbservice.resetDatabase();
|
|
|
|
dbservice.setHashCompleter('test-phish-simple', null);
|
|
|
|
dumpn("running " + gTests[gNextTest]);
|
|
|
|
|
2008-01-12 14:22:03 -08:00
|
|
|
gTests[gNextTest++]();
|
|
|
|
}
|
|
|
|
|
|
|
|
function runTests(tests)
|
|
|
|
{
|
|
|
|
gTests = tests;
|
|
|
|
runNextTest();
|
|
|
|
}
|
|
|
|
|
2008-01-29 12:57:18 -08:00
|
|
|
function Timer(delay, cb) {
|
|
|
|
this.cb = cb;
|
|
|
|
var timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
|
|
|
|
timer.initWithCallback(this, delay, timer.TYPE_ONE_SHOT);
|
|
|
|
}
|
|
|
|
|
|
|
|
Timer.prototype = {
|
|
|
|
QueryInterface: function(iid) {
|
|
|
|
if (!iid.equals(Ci.nsISupports) && !iid.equals(Ci.nsITimerCallback)) {
|
|
|
|
throw Cr.NS_ERROR_NO_INTERFACE;
|
|
|
|
}
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
notify: function(timer) {
|
|
|
|
this.cb();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-07-25 23:39:22 -07:00
|
|
|
cleanUp();
|