diff --git a/toolkit/components/search/tests/xpcshell/head_search.js b/toolkit/components/search/tests/xpcshell/head_search.js index dc5522dd660a..4cb0a3fbbbe7 100644 --- a/toolkit/components/search/tests/xpcshell/head_search.js +++ b/toolkit/components/search/tests/xpcshell/head_search.js @@ -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; +}); diff --git a/toolkit/components/search/tests/xpcshell/test_addEngine_callback.js b/toolkit/components/search/tests/xpcshell/test_addEngine_callback.js index 22daf16d5f88..25538005813a 100644 --- a/toolkit/components/search/tests/xpcshell/test_addEngine_callback.js +++ b/toolkit/components/search/tests/xpcshell/test_addEngine_callback.js @@ -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(); } diff --git a/toolkit/components/search/tests/xpcshell/test_defaultEngine.js b/toolkit/components/search/tests/xpcshell/test_defaultEngine.js index cb8cf7e84aa0..26645fec2642 100644 --- a/toolkit/components/search/tests/xpcshell/test_defaultEngine.js +++ b/toolkit/components/search/tests/xpcshell/test_defaultEngine.js @@ -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); -} +}); diff --git a/toolkit/components/search/tests/xpcshell/test_identifiers.js b/toolkit/components/search/tests/xpcshell/test_identifiers.js index c0d9a985d198..ca4d1e2dba15 100644 --- a/toolkit/components/search/tests/xpcshell/test_identifiers.js +++ b/toolkit/components/search/tests/xpcshell/test_identifiers.js @@ -7,7 +7,6 @@ "use strict"; -const Ci = Components.interfaces; const SEARCH_APP_DIR = 1; function run_test() { diff --git a/toolkit/components/search/tests/xpcshell/test_invalid_engine_from_dir.js b/toolkit/components/search/tests/xpcshell/test_invalid_engine_from_dir.js index 26bd957ae07c..c6455735ac8a 100644 --- a/toolkit/components/search/tests/xpcshell/test_invalid_engine_from_dir.js +++ b/toolkit/components/search/tests/xpcshell/test_invalid_engine_from_dir.js @@ -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. diff --git a/toolkit/components/search/tests/xpcshell/test_json_cache.js b/toolkit/components/search/tests/xpcshell/test_json_cache.js index 96c8067e7691..ea3457ae5642 100644 --- a/toolkit/components/search/tests/xpcshell/test_json_cache.js +++ b/toolkit/components/search/tests/xpcshell/test_json_cache.js @@ -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}}; diff --git a/toolkit/components/search/tests/xpcshell/test_multipleIcons.js b/toolkit/components/search/tests/xpcshell/test_multipleIcons.js index 253ea7f9d026..992a13aa253f 100644 --- a/toolkit/components/search/tests/xpcshell/test_multipleIcons.js +++ b/toolkit/components/search/tests/xpcshell/test_multipleIcons.js @@ -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"); - }); -} +}); diff --git a/toolkit/components/search/tests/xpcshell/test_nocache.js b/toolkit/components/search/tests/xpcshell/test_nocache.js index 0b8ce5c6869f..fcb0ee9362a2 100644 --- a/toolkit/components/search/tests/xpcshell/test_nocache.js +++ b/toolkit/components/search/tests/xpcshell/test_nocache.js @@ -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(); +}); diff --git a/toolkit/components/search/tests/xpcshell/test_nodb_pluschanges.js b/toolkit/components/search/tests/xpcshell/test_nodb_pluschanges.js index 9cccdb38acb6..10d08b22a28c 100644 --- a/toolkit/components/search/tests/xpcshell/test_nodb_pluschanges.js +++ b/toolkit/components/search/tests/xpcshell/test_nodb_pluschanges.js @@ -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", ""); - }); - 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(); +}); diff --git a/toolkit/components/search/tests/xpcshell/test_notifications.js b/toolkit/components/search/tests/xpcshell/test_notifications.js index e5c18b4b67ad..93e23b43178e 100644 --- a/toolkit/components/search/tests/xpcshell/test_notifications.js +++ b/toolkit/components/search/tests/xpcshell/test_notifications.js @@ -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); } diff --git a/toolkit/components/search/tests/xpcshell/test_prefSync.js b/toolkit/components/search/tests/xpcshell/test_prefSync.js index 29b4f5001d85..33dc5353a494 100644 --- a/toolkit/components/search/tests/xpcshell/test_prefSync.js +++ b/toolkit/components/search/tests/xpcshell/test_prefSync.js @@ -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); -} +}); diff --git a/toolkit/components/search/tests/xpcshell/test_purpose.js b/toolkit/components/search/tests/xpcshell/test_purpose.js index 256ca21dae66..107e9fbb8127 100644 --- a/toolkit/components/search/tests/xpcshell/test_purpose.js +++ b/toolkit/components/search/tests/xpcshell/test_purpose.js @@ -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); -} +}); diff --git a/toolkit/components/search/tests/xpcshell/test_rel_searchform.js b/toolkit/components/search/tests/xpcshell/test_rel_searchform.js index c9918a320d54..e49ae47b1b05 100644 --- a/toolkit/components/search/tests/xpcshell/test_rel_searchform.js +++ b/toolkit/components/search/tests/xpcshell/test_rel_searchform.js @@ -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 // 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 . - 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"); } -} +}); diff --git a/toolkit/components/search/tests/xpcshell/test_resultDomain.js b/toolkit/components/search/tests/xpcshell/test_resultDomain.js index ff3a4fecac7c..d7458a923f6e 100644 --- a/toolkit/components/search/tests/xpcshell/test_resultDomain.js +++ b/toolkit/components/search/tests/xpcshell/test_resultDomain.js @@ -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"); }); diff --git a/toolkit/components/search/tests/xpcshell/test_save_sorted_engines.js b/toolkit/components/search/tests/xpcshell/test_save_sorted_engines.js index cd2ee8e8a261..05149cd73194 100644 --- a/toolkit/components/search/tests/xpcshell/test_save_sorted_engines.js +++ b/toolkit/components/search/tests/xpcshell/test_save_sorted_engines.js @@ -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(); +}); diff --git a/toolkit/components/search/tests/xpcshell/test_serialize_file.js b/toolkit/components/search/tests/xpcshell/test_serialize_file.js index 84cf289be1ad..e999bfcdca06 100644 --- a/toolkit/components/search/tests/xpcshell/test_serialize_file.js +++ b/toolkit/components/search/tests/xpcshell/test_serialize_file.js @@ -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(); -}