Bug 1041534 - Refactor search tests to remove some code duplication. r=MattN

This commit is contained in:
Paolo Amadini 2014-07-25 10:28:45 +01:00
parent 5d377d2e9f
commit 407761efa7
16 changed files with 300 additions and 625 deletions

View File

@ -1,12 +1,17 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et: */
Components.utils.import("resource://gre/modules/Services.jsm");
Components.utils.import("resource://gre/modules/NetUtil.jsm");
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
Components.utils.import("resource://gre/modules/FileUtils.jsm");
Components.utils.import("resource://gre/modules/Promise.jsm");
Components.utils.import("resource://testing-common/AppInfo.jsm");
const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
Cu.import("resource://gre/modules/FileUtils.jsm");
Cu.import("resource://gre/modules/osfile.jsm");
Cu.import("resource://gre/modules/NetUtil.jsm");
Cu.import("resource://gre/modules/Promise.jsm");
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://gre/modules/Task.jsm");
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
Cu.import("resource://testing-common/AppInfo.jsm");
Cu.import("resource://testing-common/httpd.js");
const BROWSER_SEARCH_PREF = "browser.search.";
const NS_APP_SEARCH_DIR = "SrchPlugns";
@ -42,6 +47,17 @@ function removeMetadata()
}
}
function getSearchMetadata()
{
// Check that search-metadata.json has been created
let metadata = gProfD.clone();
metadata.append("search-metadata.json");
do_check_true(metadata.exists());
do_print("Parsing metadata");
return readJSONFile(metadata);
}
function removeCacheFile()
{
let file = gProfD.clone();
@ -138,3 +154,80 @@ function isSubObjectOf(expectedObj, actualObj) {
// Expand the amount of information available in error logs
Services.prefs.setBoolPref("browser.search.log", true);
/**
* After useHttpServer() is called, this string contains the URL of the "data"
* directory, including the final slash.
*/
let gDataUrl;
/**
* Initializes the HTTP server and ensures that it is terminated when tests end.
*
* @return The HttpServer object in case further customization is needed.
*/
function useHttpServer() {
let httpServer = new HttpServer();
httpServer.start(-1);
httpServer.registerDirectory("/", do_get_cwd());
gDataUrl = "http://localhost:" + httpServer.identity.primaryPort + "/data/";
do_register_cleanup(() => httpServer.stop(() => {}));
return httpServer;
}
/**
* Adds test engines and returns a promise resolved when they are installed.
*
* The engines are added in the given order.
*
* @param aItems
* Array of objects with the following properties:
* {
* name: Engine name, used to wait for it to be loaded.
* xmlFileName: Name of the XML file in the "data" folder.
* srcFileName: Name of the SRC file in the "data" folder.
* iconFileName: Name of the icon associated to the SRC file.
* details: Array containing the parameters of addEngineWithDetails,
* except for the engine name. Alternative to xmlFileName.
* }
*/
let addTestEngines = Task.async(function* (aItems) {
if (!gDataUrl) {
do_throw("useHttpServer must be called before addTestEngines.");
}
let engines = [];
for (let item of aItems) {
do_print("Adding engine: " + item.name);
yield new Promise((resolve, reject) => {
Services.obs.addObserver(function obs(subject, topic, data) {
try {
let engine = subject.QueryInterface(Ci.nsISearchEngine);
do_print("Observed " + data + " for " + engine.name);
if (data != "engine-added" || engine.name != item.name) {
return;
}
Services.obs.removeObserver(obs, "browser-search-engine-modified");
engines.push(engine);
resolve();
} catch (ex) {
reject(ex);
}
}, "browser-search-engine-modified", false);
if (item.xmlFileName) {
Services.search.addEngine(gDataUrl + item.xmlFileName,
Ci.nsISearchEngine.DATA_XML, null, false);
} else if (item.srcFileName) {
Services.search.addEngine(gDataUrl + item.srcFileName,
Ci.nsISearchEngine.DATA_TEXT,
gDataUrl + item.iconFileName, false);
} else {
Services.search.addEngineWithDetails(item.name, ...item.details);
}
});
}
return engines;
});

View File

@ -7,12 +7,6 @@
"use strict";
const Ci = Components.interfaces;
let gHttpServer;
let gBaseUrl;
Components.utils.import("resource://testing-common/httpd.js");
// Override the prompt service and nsIPrompt, since the search service currently
// prompts in response to certain installation failures we test here
// XXX this should disappear once bug 863474 is fixed
@ -69,7 +63,7 @@ add_test(function simple_callback_test() {
do_throw("search callback returned error: " + errorCode);
}
}
Services.search.addEngine(gBaseUrl + "/data/engine.xml",
Services.search.addEngine(gDataUrl + "engine.xml",
Ci.nsISearchEngine.DATA_XML,
null, false, searchCallback);
});
@ -87,7 +81,7 @@ add_test(function duplicate_failure_test() {
}
}
// Re-add the same engine added in the previous test
Services.search.addEngine(gBaseUrl + "/data/engine.xml",
Services.search.addEngine(gDataUrl + "engine.xml",
Ci.nsISearchEngine.DATA_XML,
null, false, searchCallback);
});
@ -112,15 +106,7 @@ add_test(function load_failure_test() {
function run_test() {
updateAppInfo();
gHttpServer = new HttpServer();
gHttpServer.start(-1);
gHttpServer.registerDirectory("/", do_get_cwd());
gBaseUrl = "http://localhost:" + gHttpServer.identity.primaryPort;
do_register_cleanup(function cleanup() {
gHttpServer.stop(function() {});
});
useHttpServer();
run_next_test();
}

View File

@ -8,40 +8,22 @@
"use strict";
const Ci = Components.interfaces;
function run_test() {
removeMetadata();
updateAppInfo();
useHttpServer();
Components.utils.import("resource://testing-common/httpd.js");
run_next_test();
}
let waitForEngines = {
"Test search engine": 1,
"A second test engine": 1
};
function search_observer(aSubject, aTopic, aData) {
let engine = aSubject.QueryInterface(Ci.nsISearchEngine);
do_print("Observer: " + aData + " for " + engine.name);
if (aData != "engine-added") {
return;
}
// If the engine is defined in `waitForEngines`, remove it from the list
if (waitForEngines[engine.name]) {
delete waitForEngines[engine.name];
} else {
// This engine is not one we're waiting for, so bail out early.
return;
}
// Only continue when both engines have been loaded.
if (Object.keys(waitForEngines).length)
return;
add_task(function* test_defaultEngine() {
let [engine1, engine2] = yield addTestEngines([
{ name: "Test search engine", xmlFileName: "engine.xml" },
{ name: "A second test engine", xmlFileName: "engine2.xml" },
]);
let search = Services.search;
let engine1 = search.getEngineByName("Test search engine");
let engine2 = search.getEngineByName("A second test engine");
search.defaultEngine = engine1;
do_check_eq(search.defaultEngine, engine1);
search.defaultEngine = engine2
@ -68,32 +50,4 @@ function search_observer(aSubject, aTopic, aData) {
do_check_eq(search.defaultEngine, engine1);
engine2.hidden = false;
do_check_eq(search.defaultEngine, engine2);
do_test_finished();
}
function run_test() {
removeMetadata();
updateAppInfo();
let httpServer = new HttpServer();
httpServer.start(-1);
httpServer.registerDirectory("/", do_get_cwd());
let baseUrl = "http://localhost:" + httpServer.identity.primaryPort;
do_register_cleanup(function cleanup() {
httpServer.stop(function() {});
Services.obs.removeObserver(search_observer, "browser-search-engine-modified");
});
do_test_pending();
Services.obs.addObserver(search_observer, "browser-search-engine-modified", false);
Services.search.addEngine(baseUrl + "/data/engine.xml",
Ci.nsISearchEngine.DATA_XML,
null, false);
Services.search.addEngine(baseUrl + "/data/engine2.xml",
Ci.nsISearchEngine.DATA_XML,
null, false);
}
});

View File

@ -7,7 +7,6 @@
"use strict";
const Ci = Components.interfaces;
const SEARCH_APP_DIR = 1;
function run_test() {

View File

@ -1,8 +1,6 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
const Ci = Components.interfaces;
/*
* Test that invalid engine files with xml extensions will not break
* initialization. See Bug 940446.

View File

@ -7,9 +7,6 @@
"use strict";
const Cc = Components.classes;
const Ci = Components.interfaces;
// Metadata to write to search-metadata.json for the test.
let gMetadata = {"[profile]/test-search-engine.xml":{"used":true}};

View File

@ -7,16 +7,18 @@
"use strict";
const Ci = Components.interfaces;
const Cu = Components.utils;
function run_test() {
removeMetadata();
updateAppInfo();
useHttpServer();
Cu.import("resource://testing-common/httpd.js");
run_next_test();
}
function test_multiIcon() {
let engine = Services.search.getEngineByName("IconsTest");
do_check_neq(engine, null);
do_print("Running tests on IconsTest engine");
add_task(function* test_multipleIcons() {
let [engine] = yield addTestEngines([
{ name: "IconsTest", xmlFileName: "engineImages.xml" },
]);
do_print("The default should be the 16x16 icon");
do_check_true(engine.iconURI.spec.contains("ico16"));
@ -44,35 +46,4 @@ Cu.import("resource://testing-common/httpd.js");
}));
do_test_finished();
}
function run_test() {
removeMetadata();
updateAppInfo();
let httpServer = new HttpServer();
httpServer.start(4444);
httpServer.registerDirectory("/", do_get_cwd());
do_register_cleanup(function cleanup() {
httpServer.stop(function() {});
});
do_test_pending();
let observer = function(aSubject, aTopic, aData) {
if (aData == "engine-loaded") {
test_multiIcon();
}
};
Services.obs.addObserver(observer, "browser-search-engine-modified", false);
do_print("Adding engine with multiple images");
Services.search.addEngine("http://localhost:4444/data/engineImages.xml",
Ci.nsISearchEngine.DATA_XML, null, false);
do_timeout(12000, function() {
do_throw("Timeout");
});
}
});

View File

@ -1,13 +1,6 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
let Cu = Components.utils;
let Ci = Components.interfaces;
Cu.import("resource://gre/modules/osfile.jsm");
Cu.import("resource://gre/modules/Task.jsm");
Cu.import("resource://testing-common/httpd.js");
/*
* test_nocache: Start search engine
* - without search.json
@ -17,21 +10,19 @@ Cu.import("resource://testing-common/httpd.js");
* - search.json is created.
*/
function run_test()
{
removeCache();
updateAppInfo();
do_load_manifest("data/chrome.manifest");
useHttpServer();
let httpServer = new HttpServer();
httpServer.start(-1);
httpServer.registerDirectory("/", do_get_cwd());
run_next_test();
}
add_task(function* test_nocache() {
let search = Services.search;
do_test_pending();
// Check that cache is created at startup
afterCache(function cacheCreated() {
// Check that search.json has been created.
@ -39,63 +30,36 @@ function run_test()
cache.append("search.json");
do_check_true(cache.exists());
});
yield new Promise((resolve, reject) => search.init(rv => {
Components.isSuccessCode(rv) ? resolve() : reject();
}));
// Perform initialization
search.init(function ss_initialized(rv) {
do_check_true(Components.isSuccessCode(rv));
// Add engine and wait for cache update
yield addTestEngines([
{ name: "Test search engine", xmlFileName: "engine.xml" },
]);
do_print("Setting up observer");
function observer(aSubject, aTopic, aData) {
do_print("Observing topic " + aTopic);
if ("engine-added" == aData) {
let engine = search.getEngineByName("Test search engine");
if (!engine) {
return;
}
Services.obs.removeObserver(observer, "browser-search-engine-modified");
do_print("Engine has been added, let's wait for the cache to be built");
afterCache(function() {
do_print("Success");
do_print("Engine has been added, let's wait for the cache to be built");
yield new Promise(resolve => afterCache(resolve));
Task.spawn(function task() {
do_print("Searching test engine in cache");
try {
let path = OS.Path.join(OS.Constants.Path.profileDir, "search.json");
let data = yield OS.File.read(path);
let text = new TextDecoder().decode(data);
let cache = JSON.parse(text);
let found = false;
for (let dirName in cache.directories) {
for (let engine of cache.directories[dirName].engines) {
if (engine._id == "[app]/test-search-engine.xml") {
found = true;
break;
}
}
if (found) {
break;
}
}
do_check_true(found);
} catch (ex) {
do_throw(ex);
} finally {
removeCache();
httpServer.stop(function() {
// httpServer doesn't seem to stop cleanly if there is no callback
});
do_test_finished();
}
});
});
do_print("Searching test engine in cache");
let path = OS.Path.join(OS.Constants.Path.profileDir, "search.json");
let data = yield OS.File.read(path);
let text = new TextDecoder().decode(data);
let cache = JSON.parse(text);
let found = false;
for (let dirName in cache.directories) {
for (let engine of cache.directories[dirName].engines) {
if (engine._id == "[app]/test-search-engine.xml") {
found = true;
break;
}
};
Services.obs.addObserver(observer, "browser-search-engine-modified", false);
}
if (found) {
break;
}
}
do_check_true(found);
// Add an engine, check if it appears in the cache
search.addEngine("http://localhost:" + httpServer.identity.primaryPort +
"/data/engine.xml",
Ci.nsISearchEngine.DATA_XML,
null, false);
});
}
removeCache();
});

View File

@ -19,90 +19,43 @@
* and configuration of Firefox.
*/
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cu = Components.utils;
const Cr = Components.results;
Cu.import("resource://testing-common/httpd.js");
function run_test()
{
do_print("Preparing test");
function run_test() {
removeMetadata();
updateAppInfo();
do_load_manifest("data/chrome.manifest");
useHttpServer();
let httpServer = new HttpServer();
httpServer.start(-1);
httpServer.registerDirectory("/", do_get_cwd());
let baseUrl = "http://localhost:" + httpServer.identity.primaryPort;
run_next_test();
}
add_task(function* test_nodb_pluschanges() {
let [engine1, engine2] = yield addTestEngines([
{ name: "Test search engine", xmlFileName: "engine.xml" },
{ name: "Sherlock test search engine", srcFileName: "engine.src",
iconFileName: "ico-size-16x16-png.ico" },
]);
let search = Services.search;
do_print("Setting up observer");
function observer(aSubject, aTopic, aData) {
do_print("Observing topic " + aTopic);
if ("engine-added" == aData) {
let engine1 = search.getEngineByName("Test search engine");
let engine2 = search.getEngineByName("Sherlock test search engine");
do_print("Currently, engine1 is " + engine1);
do_print("Currently, engine2 is " + engine2);
if(engine1 && engine2)
{
search.moveEngine(engine1, 0);
search.moveEngine(engine2, 1);
do_print("Next step is forcing flush");
do_timeout(0,
function() {
do_print("Forcing flush");
// Force flush
// Note: the timeout is needed, to avoid some reentrency
// issues in nsSearchService.
search.QueryInterface(Ci.nsIObserver).
observe(observer, "quit-application", "<no verb>");
});
afterCommit(
function()
{
do_print("Commit complete");
// Check that search-metadata.json has been created
let metadata = gProfD.clone();
metadata.append("search-metadata.json");
do_check_true(metadata.exists());
search.moveEngine(engine1, 0);
search.moveEngine(engine2, 1);
// Check that the entries are placed as specified correctly
let stream = NetUtil.newChannel(metadata).open();
do_print("Parsing metadata");
let json = parseJsonFromStream(stream);
do_check_eq(json["[app]/test-search-engine.xml"].order, 1);
do_check_eq(json["[profile]/sherlock-test-search-engine.xml"].order, 2);
// This is needed to avoid some reentrency issues in nsSearchService.
do_print("Next step is forcing flush");
yield new Promise(resolve => do_execute_soon(resolve));
do_print("Cleaning up");
httpServer.stop(function() {});
stream.close(); // Stream must be closed under Windows
removeMetadata();
do_test_finished();
}
);
}
}
};
Services.obs.addObserver(observer, "browser-search-engine-modified",
false);
do_print("Forcing flush");
let promiseCommit = new Promise(resolve => afterCommit(resolve));
search.QueryInterface(Ci.nsIObserver)
.observe(null, "quit-application", "");
yield promiseCommit;
do_print("Commit complete");
do_test_pending();
// Check that the entries are placed as specified correctly
let json = getSearchMetadata();
do_check_eq(json["[app]/test-search-engine.xml"].order, 1);
do_check_eq(json["[profile]/sherlock-test-search-engine.xml"].order, 2);
search.addEngine(baseUrl + "/data/engine.xml",
Ci.nsISearchEngine.DATA_XML,
null, false);
search.addEngine(baseUrl + "/data/engine.src",
Ci.nsISearchEngine.DATA_TEXT,
baseUrl + "/data/ico-size-16x16-png.ico",
false);
do_timeout(120000, function() {
do_throw("Timeout");
});
}
do_print("Cleaning up");
removeMetadata();
});

View File

@ -3,10 +3,6 @@
"use strict";
const Ci = Components.interfaces;
Components.utils.import("resource://testing-common/httpd.js");
let gTestLog = [];
/**
@ -62,13 +58,9 @@ function search_observer(subject, topic, data) {
function run_test() {
removeMetadata();
updateAppInfo();
let httpServer = new HttpServer();
httpServer.start(-1);
httpServer.registerDirectory("/", do_get_cwd());
useHttpServer();
do_register_cleanup(function cleanup() {
httpServer.stop(function() {});
Services.obs.removeObserver(search_observer, "browser-search-engine-modified");
});
@ -76,9 +68,7 @@ function run_test() {
Services.obs.addObserver(search_observer, "browser-search-engine-modified", false);
Services.search.addEngine("http://localhost:" +
httpServer.identity.primaryPort +
"/data/engine.xml",
Services.search.addEngine(gDataUrl + "engine.xml",
Ci.nsISearchEngine.DATA_XML,
null, false);
}

View File

@ -8,15 +8,6 @@
"use strict";
const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
Cu.import("resource://testing-common/httpd.js");
let waitForEngines = {
"Test search engine": 1,
"A second test engine": 1
};
const PREF_BRANCH = "browser.search.";
/**
@ -35,47 +26,35 @@ function setLocalizedPref(aPrefName, aValue) {
} catch (ex) {}
}
function search_observer(aSubject, aTopic, aData) {
let engine = aSubject.QueryInterface(Ci.nsISearchEngine);
do_print("Observer: " + aData + " for " + engine.name);
function run_test() {
removeMetadata();
updateAppInfo();
useHttpServer();
if (aData != "engine-added") {
return;
}
run_next_test();
}
// If the engine is defined in `waitForEngines`, remove it from the list
if (waitForEngines[engine.name]) {
delete waitForEngines[engine.name];
} else {
// This engine is not one we're waiting for, so bail out early.
return;
}
// Only continue when both engines have been loaded.
if (Object.keys(waitForEngines).length) {
return;
}
add_task(function* test_prefSync() {
let [engine1, engine2] = yield addTestEngines([
{ name: "Test search engine", xmlFileName: "engine.xml" },
{ name: "A second test engine", xmlFileName: "engine2.xml" },
]);
let search = Services.search;
let engine1Name = "Test search engine";
let engine2Name = "A second test engine";
let engine1 = search.getEngineByName(engine1Name);
let engine2 = search.getEngineByName(engine2Name);
// Initial sanity check:
search.defaultEngine = engine1;
do_check_eq(search.defaultEngine, engine1);
search.currentEngine = engine1;
do_check_eq(search.currentEngine, engine1);
setLocalizedPref("defaultenginename", engine2Name);
setLocalizedPref("defaultenginename", engine2.name);
// Default engine should be synced with the pref
do_check_eq(search.defaultEngine, engine2);
// Current engine should've stayed the same
do_check_eq(search.currentEngine, engine1);
setLocalizedPref("selectedEngine", engine2Name);
setLocalizedPref("selectedEngine", engine2.name);
// Default engine should've stayed the same
do_check_eq(search.defaultEngine, engine2);
// Current engine should've been updated
@ -86,7 +65,7 @@ function search_observer(aSubject, aTopic, aData) {
// set the value of defaultenginename on the default branch.
let defaultBranch = Services.prefs.getDefaultBranch("");
let prefName = PREF_BRANCH + "defaultenginename";
let prefVal = "data:text/plain," + prefName + "=" + engine1Name;
let prefVal = "data:text/plain," + prefName + "=" + engine1.name;
defaultBranch.setCharPref(prefName, prefVal, true);
search.currentEngine = engine1;
// Current engine should've been updated
@ -99,32 +78,4 @@ function search_observer(aSubject, aTopic, aData) {
search.defaultEngine = engine1;
do_check_eq(search.defaultEngine, engine1);
do_check_false(Services.prefs.prefHasUserValue("browser.search.defaultenginename"));
do_test_finished();
}
function run_test() {
removeMetadata();
updateAppInfo();
let httpServer = new HttpServer();
httpServer.start(-1);
httpServer.registerDirectory("/", do_get_cwd());
let baseUrl = "http://localhost:" + httpServer.identity.primaryPort;
do_register_cleanup(function cleanup() {
httpServer.stop(function() {});
Services.obs.removeObserver(search_observer, "browser-search-engine-modified");
});
do_test_pending();
Services.obs.addObserver(search_observer, "browser-search-engine-modified", false);
Services.search.addEngine(baseUrl + "/data/engine.xml",
Ci.nsISearchEngine.DATA_XML,
null, false);
Services.search.addEngine(baseUrl + "/data/engine2.xml",
Ci.nsISearchEngine.DATA_XML,
null, false);
}
});

View File

@ -8,19 +8,19 @@
"use strict";
const Ci = Components.interfaces;
function run_test() {
removeMetadata();
updateAppInfo();
do_load_manifest("data/chrome.manifest");
useHttpServer();
Components.utils.import("resource://testing-common/httpd.js");
run_next_test();
}
function search_observer(aSubject, aTopic, aData) {
let engine = aSubject.QueryInterface(Ci.nsISearchEngine);
do_print("Observer: " + aData + " for " + engine.name);
if (aData != "engine-added")
return;
if (engine.name != "Test search engine")
return;
add_task(function* test_purpose() {
let [engine] = yield addTestEngines([
{ name: "Test search engine", xmlFileName: "engine.xml" },
]);
function check_submission(aExpected, aSearchTerm, aType, aPurpose) {
do_check_eq(engine.getSubmission(aSearchTerm, aType, aPurpose).uri.spec,
@ -47,28 +47,4 @@ function search_observer(aSubject, aTopic, aData) {
check_submission("", "foo", "application/x-moz-default-purpose", "invalid");
do_test_finished();
};
function run_test() {
removeMetadata();
updateAppInfo();
do_load_manifest("data/chrome.manifest");
let httpServer = new HttpServer();
httpServer.start(-1);
httpServer.registerDirectory("/", do_get_cwd());
do_register_cleanup(function cleanup() {
httpServer.stop(function() {});
Services.obs.removeObserver(search_observer, "browser-search-engine-modified");
});
do_test_pending();
Services.obs.addObserver(search_observer, "browser-search-engine-modified", false);
Services.search.addEngine("http://localhost:" +
httpServer.identity.primaryPort +
"/data/engine.xml",
Ci.nsISearchEngine.DATA_XML,
null, false);
}
});

View File

@ -7,60 +7,27 @@
"use strict";
const Ci = Components.interfaces;
function run_test() {
removeMetadata();
updateAppInfo();
useHttpServer();
Components.utils.import("resource://testing-common/httpd.js");
run_next_test();
}
let engines = [
"engine-rel-searchform.xml",
"engine-rel-searchform-post.xml",
];
function search_observer(aSubject, aTopic, aData) {
let engine = aSubject.QueryInterface(Ci.nsISearchEngine);
do_print("Observer: " + aData + " for " + engine.name);
if (aData != "engine-added")
return;
let idx = engines.indexOf(engine.name);
if (idx < 0)
// The engine is some other engine unrelated to the test, so ignore it.
return;
add_task(function* test_rel_searchform() {
let engineNames = [
"engine-rel-searchform.xml",
"engine-rel-searchform-post.xml",
];
// The final searchForm of the engine should be a URL whose domain is the
// <ShortName> in the engine's XML and that has a ?search parameter. The
// point of the ?search parameter is to avoid accidentally matching the value
// returned as a last resort by Engine's searchForm getter, which is simply
// the prePath of the engine's first HTML <Url>.
do_check_eq(engine.searchForm, "http://" + engine.name + "/?search");
engines.splice(idx, 1);
if (!engines.length)
do_test_finished();
}
function run_test() {
removeMetadata();
updateAppInfo();
let httpServer = new HttpServer();
httpServer.start(-1);
httpServer.registerDirectory("/", do_get_cwd());
do_register_cleanup(function cleanup() {
httpServer.stop(function() {});
Services.obs.removeObserver(search_observer, "browser-search-engine-modified");
});
do_test_pending();
Services.obs.addObserver(search_observer, "browser-search-engine-modified", false);
for (let basename of engines) {
Services.search.addEngine("http://localhost:" +
httpServer.identity.primaryPort +
"/data/" + basename,
Ci.nsISearchEngine.DATA_XML,
null, false);
let items = [for (e of engineNames) { name: e, xmlFileName: e }];
for (let engine of yield addTestEngines(items)) {
do_check_eq(engine.searchForm, "http://" + engine.name + "/?search");
}
}
});

View File

@ -7,73 +7,27 @@
"use strict";
const Ci = Components.interfaces;
Components.utils.import("resource://testing-common/httpd.js");
let waitForEngines = new Set([ "Test search engine",
"A second test engine",
"bacon" ]);
function promiseEnginesAdded() {
let deferred = Promise.defer();
let observe = function observe(aSubject, aTopic, aData) {
let engine = aSubject.QueryInterface(Ci.nsISearchEngine);
do_print("Observer: " + aData + " for " + engine.name);
if (aData != "engine-added") {
return;
}
waitForEngines.delete(engine.name);
if (waitForEngines.size > 0) {
return;
}
let engine1 = Services.search.getEngineByName("Test search engine");
do_check_eq(engine1.getResultDomain(), "google.com");
do_check_eq(engine1.getResultDomain("text/html"), "google.com");
do_check_eq(engine1.getResultDomain("application/x-moz-default-purpose"),
"purpose.google.com");
do_check_eq(engine1.getResultDomain("fake-response-type"), "");
let engine2 = Services.search.getEngineByName("A second test engine");
do_check_eq(engine2.getResultDomain(), "duckduckgo.com");
let engine3 = Services.search.getEngineByName("bacon");
do_check_eq(engine3.getResultDomain(), "bacon.moz");
deferred.resolve();
};
Services.obs.addObserver(observe, "browser-search-engine-modified", false);
do_register_cleanup(function cleanup() {
Services.obs.removeObserver(observe, "browser-search-engine-modified");
});
return deferred.promise;
}
function run_test() {
removeMetadata();
updateAppInfo();
useHttpServer();
run_next_test();
}
add_task(function* check_resultDomain() {
let httpServer = new HttpServer();
httpServer.start(-1);
httpServer.registerDirectory("/", do_get_cwd());
let baseUrl = "http://localhost:" + httpServer.identity.primaryPort;
do_register_cleanup(function cleanup() {
httpServer.stop(function() {});
});
add_task(function* test_resultDomain() {
let [engine1, engine2, engine3] = yield addTestEngines([
{ name: "Test search engine", xmlFileName: "engine.xml" },
{ name: "A second test engine", xmlFileName: "engine2.xml" },
{ name: "bacon", details: ["", "bacon", "Search Bacon", "GET",
"http://www.bacon.moz/?search={searchTerms}"] },
]);
let promise = promiseEnginesAdded();
Services.search.addEngine(baseUrl + "/data/engine.xml",
Ci.nsISearchEngine.DATA_XML,
null, false);
Services.search.addEngine(baseUrl + "/data/engine2.xml",
Ci.nsISearchEngine.DATA_XML,
null, false);
Services.search.addEngineWithDetails("bacon", "", "bacon", "Search Bacon",
"GET", "http://www.bacon.moz/?search={searchTerms}");
yield promise;
do_check_eq(engine1.getResultDomain(), "google.com");
do_check_eq(engine1.getResultDomain("text/html"), "google.com");
do_check_eq(engine1.getResultDomain("application/x-moz-default-purpose"),
"purpose.google.com");
do_check_eq(engine1.getResultDomain("fake-response-type"), "");
do_check_eq(engine2.getResultDomain(), "duckduckgo.com");
do_check_eq(engine3.getResultDomain(), "bacon.moz");
});

View File

@ -17,108 +17,55 @@
* and configuration of Firefox.
*/
const Cc = Components.classes;
const Ci = Components.interfaces;
const Cu = Components.utils;
const Cr = Components.results;
Cu.import("resource://testing-common/httpd.js");
function run_test() {
do_print("Preparing test");
removeMetadata();
updateAppInfo();
useHttpServer();
let httpServer = new HttpServer();
httpServer.start(-1);
httpServer.registerDirectory("/", do_get_cwd());
let baseUrl = "http://localhost:" + httpServer.identity.primaryPort;
run_next_test();
}
function getSearchMetadata() {
// Check that search-metadata.json has been created
let metadata = gProfD.clone();
metadata.append("search-metadata.json");
do_check_true(metadata.exists());
let stream = NetUtil.newChannel(metadata).open();
do_print("Parsing metadata");
let json = parseJsonFromStream(stream);
stream.close(); // Stream must be closed under Windows
return json;
}
add_task(function* test_save_sorted_engines() {
let [engine1, engine2] = yield addTestEngines([
{ name: "Test search engine", xmlFileName: "engine.xml" },
{ name: "Sherlock test search engine", srcFileName: "engine.src",
iconFileName: "ico-size-16x16-png.ico" },
]);
let search = Services.search;
do_print("Setting up observer");
function observer(aSubject, aTopic, aData) {
do_print("Observing topic " + aTopic);
if ("engine-added" != aData) {
return;
}
// Test moving the engines
search.moveEngine(engine1, 0);
search.moveEngine(engine2, 1);
let engine1 = search.getEngineByName("Test search engine");
let engine2 = search.getEngineByName("Sherlock test search engine");
do_print("Currently, engine1 is " + engine1);
do_print("Currently, engine2 is " + engine2);
if (!engine1 || !engine2) {
return;
}
// Changes should be commited immediately
yield new Promise(resolve => afterCommit(resolve));
do_print("Commit complete after moveEngine");
// Test moving the engines
search.moveEngine(engine1, 0);
search.moveEngine(engine2, 1);
// Check that the entries are placed as specified correctly
let json = getSearchMetadata();
do_check_eq(json["[app]/test-search-engine.xml"].order, 1);
do_check_eq(json["[profile]/sherlock-test-search-engine.xml"].order, 2);
// Changes should be commited immediately
afterCommit(function() {
do_print("Commit complete after moveEngine");
// Test removing an engine
search.removeEngine(engine1);
yield new Promise(resolve => afterCommit(resolve));
do_print("Commit complete after removeEngine");
// Check that the entries are placed as specified correctly
let json = getSearchMetadata();
do_check_eq(json["[app]/test-search-engine.xml"].order, 1);
do_check_eq(json["[profile]/sherlock-test-search-engine.xml"].order, 2);
// Check that the order of the remaining engine was updated correctly
json = getSearchMetadata();
do_check_eq(json["[profile]/sherlock-test-search-engine.xml"].order, 1);
// Test removing an engine
search.removeEngine(engine1);
afterCommit(function() {
do_print("Commit complete after removeEngine");
// Test adding a new engine
search.addEngineWithDetails("foo", "", "foo", "", "GET",
"http://searchget/?search={searchTerms}");
yield new Promise(resolve => afterCommit(resolve));
do_print("Commit complete after addEngineWithDetails");
// Check that the order of the remaining engine was updated correctly
let json = getSearchMetadata();
do_check_eq(json["[profile]/sherlock-test-search-engine.xml"].order, 1);
json = getSearchMetadata();
do_check_eq(json["[profile]/foo.xml"].alias, "foo");
do_check_true(json["[profile]/foo.xml"].order > 0);
// Test adding a new engine
search.addEngineWithDetails("foo", "", "foo", "", "GET", "http://searchget/?search={searchTerms}");
afterCommit(function() {
do_print("Commit complete after addEngineWithDetails");
// Check that engine was added to the list of sorted engines
let json = getSearchMetadata();
do_check_eq(json["[profile]/foo.xml"].alias, "foo");
do_check_true(json["[profile]/foo.xml"].order > 0);
do_print("Cleaning up");
Services.obs.removeObserver(observer, "browser-search-engine-modified");
httpServer.stop(function() {});
removeMetadata();
do_test_finished();
});
});
});
};
Services.obs.addObserver(observer, "browser-search-engine-modified", false);
do_test_pending();
search.addEngine(baseUrl + "/data/engine.xml",
Ci.nsISearchEngine.DATA_XML,
null, false);
search.addEngine(baseUrl + "/data/engine.src",
Ci.nsISearchEngine.DATA_TEXT,
baseUrl + "/data/ico-size-16x16-png.ico",
false);
do_timeout(120000, function() {
do_throw("Timeout");
});
}
do_print("Cleaning up");
removeMetadata();
});

View File

@ -10,38 +10,27 @@
* - lazySerializeTask updates the file.
*/
const Ci = Components.interfaces;
const Cu = Components.utils;
function run_test() {
updateAppInfo();
useHttpServer();
Cu.import("resource://testing-common/httpd.js");
Cu.import("resource://gre/modules/NetUtil.jsm");
run_next_test();
}
add_test(function test_batchTask() {
let observer = function(aSubject, aTopic, aData) {
if (aTopic == "browser-search-engine-modified" && aData == "engine-loaded") {
let engine1 = Services.search.getEngineByName("Test search engine");
let engine2 = Services.search.getEngineByName("Sherlock test search engine");
if (engine1 && engine2) {
Services.obs.removeObserver(observer, aTopic);
// Test that files are written correctly.
let engineFile1 = engine1.wrappedJSObject._file;
let engineFile2 = engine2.wrappedJSObject._file;
do_check_true(engineFile1.exists());
do_check_true(engineFile2.exists());
do_check_neq(engineFile1.fileSize, 0);
do_check_neq(engineFile2.fileSize, 0);
run_next_test();
}
}
}
add_task(function test_batchTask() {
let [engine1, engine2] = yield addTestEngines([
{ name: "Test search engine", xmlFileName: "engine.xml" },
{ name: "Sherlock test search engine", srcFileName: "engine.src",
iconFileName: "ico-size-16x16-png.ico" },
]);
Services.obs.addObserver(observer, "browser-search-engine-modified", false);
Services.search.addEngine("http://localhost:4444/data/engine.xml",
Ci.nsISearchEngine.DATA_XML, null, false);
Services.search.addEngine("http://localhost:4444/data/engine.src",
Ci.nsISearchEngine.DATA_TEXT,
"http://localhost:4444/data/ico-size-16x16-png.ico",
false);
// Test that files are written correctly.
let engineFile1 = engine1.wrappedJSObject._file;
let engineFile2 = engine2.wrappedJSObject._file;
do_check_true(engineFile1.exists());
do_check_true(engineFile2.exists());
do_check_neq(engineFile1.fileSize, 0);
do_check_neq(engineFile2.fileSize, 0);
});
add_test(function test_addParam() {
@ -76,17 +65,3 @@ add_test(function test_addParam() {
}
Services.obs.addObserver(observer, "browser-search-service", false);
});
function run_test() {
updateAppInfo();
let httpServer = new HttpServer();
httpServer.start(4444);
httpServer.registerDirectory("/", do_get_cwd());
do_register_cleanup(function cleanup() {
httpServer.stop(function() {});
});
run_next_test();
}