michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: michael@0: /* michael@0: * test_nodb: Start search engine michael@0: * - without search-metadata.json michael@0: * - without search.sqlite michael@0: * michael@0: * Ensure that : michael@0: * - nothing explodes; michael@0: * - if we change the order, search-metadata.json is created; michael@0: * - this search-medata.json can be parsed; michael@0: * - the order stored in search-metadata.json is consistent. michael@0: * michael@0: * Notes: michael@0: * - we install the search engines of test "test_downloadAndAddEngines.js" michael@0: * to ensure that this test is independent from locale, commercial agreements michael@0: * and configuration of Firefox. michael@0: */ michael@0: michael@0: const Cc = Components.classes; michael@0: const Ci = Components.interfaces; michael@0: const Cu = Components.utils; michael@0: const Cr = Components.results; michael@0: michael@0: Cu.import("resource://testing-common/httpd.js"); michael@0: michael@0: michael@0: function run_test() michael@0: { michael@0: do_print("Preparing test"); michael@0: removeMetadata(); michael@0: updateAppInfo(); michael@0: do_load_manifest("data/chrome.manifest"); michael@0: michael@0: let httpServer = new HttpServer(); michael@0: httpServer.start(-1); michael@0: httpServer.registerDirectory("/", do_get_cwd()); michael@0: let baseUrl = "http://localhost:" + httpServer.identity.primaryPort; michael@0: michael@0: let search = Services.search; michael@0: michael@0: do_print("Setting up observer"); michael@0: function observer(aSubject, aTopic, aData) { michael@0: do_print("Observing topic " + aTopic); michael@0: if ("engine-added" == aData) { michael@0: let engine1 = search.getEngineByName("Test search engine"); michael@0: let engine2 = search.getEngineByName("Sherlock test search engine"); michael@0: do_print("Currently, engine1 is " + engine1); michael@0: do_print("Currently, engine2 is " + engine2); michael@0: if(engine1 && engine2) michael@0: { michael@0: search.moveEngine(engine1, 0); michael@0: search.moveEngine(engine2, 1); michael@0: do_print("Next step is forcing flush"); michael@0: do_timeout(0, michael@0: function() { michael@0: do_print("Forcing flush"); michael@0: // Force flush michael@0: // Note: the timeout is needed, to avoid some reentrency michael@0: // issues in nsSearchService. michael@0: search.QueryInterface(Ci.nsIObserver). michael@0: observe(observer, "quit-application", ""); michael@0: }); michael@0: afterCommit( michael@0: function() michael@0: { michael@0: do_print("Commit complete"); michael@0: // Check that search-metadata.json has been created michael@0: let metadata = gProfD.clone(); michael@0: metadata.append("search-metadata.json"); michael@0: do_check_true(metadata.exists()); michael@0: michael@0: // Check that the entries are placed as specified correctly michael@0: let stream = NetUtil.newChannel(metadata).open(); michael@0: do_print("Parsing metadata"); michael@0: let json = parseJsonFromStream(stream); michael@0: do_check_eq(json["[app]/test-search-engine.xml"].order, 1); michael@0: do_check_eq(json["[profile]/sherlock-test-search-engine.xml"].order, 2); michael@0: michael@0: do_print("Cleaning up"); michael@0: httpServer.stop(function() {}); michael@0: stream.close(); // Stream must be closed under Windows michael@0: removeMetadata(); michael@0: do_test_finished(); michael@0: } michael@0: ); michael@0: } michael@0: } michael@0: }; michael@0: Services.obs.addObserver(observer, "browser-search-engine-modified", michael@0: false); michael@0: michael@0: do_test_pending(); michael@0: michael@0: search.addEngine(baseUrl + "/data/engine.xml", michael@0: Ci.nsISearchEngine.DATA_XML, michael@0: null, false); michael@0: search.addEngine(baseUrl + "/data/engine.src", michael@0: Ci.nsISearchEngine.DATA_TEXT, michael@0: baseUrl + "/data/ico-size-16x16-png.ico", michael@0: false); michael@0: michael@0: do_timeout(120000, function() { michael@0: do_throw("Timeout"); michael@0: }); michael@0: }