michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: let Cu = Components.utils; michael@0: let Ci = Components.interfaces; michael@0: michael@0: Cu.import("resource://gre/modules/osfile.jsm"); michael@0: Cu.import("resource://gre/modules/Task.jsm"); michael@0: Cu.import("resource://testing-common/httpd.js"); michael@0: michael@0: /* michael@0: * test_nocache: Start search engine michael@0: * - without search.json michael@0: * michael@0: * Ensure that : michael@0: * - nothing explodes; michael@0: * - search.json is created. michael@0: */ michael@0: michael@0: michael@0: function run_test() michael@0: { michael@0: removeCache(); 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: michael@0: let search = Services.search; michael@0: michael@0: do_test_pending(); michael@0: michael@0: // Check that cache is created at startup michael@0: afterCache(function cacheCreated() { michael@0: // Check that search.json has been created. michael@0: let cache = gProfD.clone(); michael@0: cache.append("search.json"); michael@0: do_check_true(cache.exists()); michael@0: }); michael@0: michael@0: // Perform initialization michael@0: search.init(function ss_initialized(rv) { michael@0: do_check_true(Components.isSuccessCode(rv)); 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 engine = search.getEngineByName("Test search engine"); michael@0: if (!engine) { michael@0: return; michael@0: } michael@0: Services.obs.removeObserver(observer, "browser-search-engine-modified"); michael@0: do_print("Engine has been added, let's wait for the cache to be built"); michael@0: afterCache(function() { michael@0: do_print("Success"); michael@0: michael@0: Task.spawn(function task() { michael@0: do_print("Searching test engine in cache"); michael@0: try { michael@0: let path = OS.Path.join(OS.Constants.Path.profileDir, "search.json"); michael@0: let data = yield OS.File.read(path); michael@0: let text = new TextDecoder().decode(data); michael@0: let cache = JSON.parse(text); michael@0: let found = false; michael@0: for (let dirName in cache.directories) { michael@0: for (let engine of cache.directories[dirName].engines) { michael@0: if (engine._id == "[app]/test-search-engine.xml") { michael@0: found = true; michael@0: break; michael@0: } michael@0: } michael@0: if (found) { michael@0: break; michael@0: } michael@0: } michael@0: do_check_true(found); michael@0: } catch (ex) { michael@0: do_throw(ex); michael@0: } finally { michael@0: removeCache(); michael@0: httpServer.stop(function() { michael@0: // httpServer doesn't seem to stop cleanly if there is no callback michael@0: }); 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", false); michael@0: michael@0: // Add an engine, check if it appears in the cache michael@0: search.addEngine("http://localhost:" + httpServer.identity.primaryPort + michael@0: "/data/engine.xml", michael@0: Ci.nsISearchEngine.DATA_XML, michael@0: null, false); michael@0: }); michael@0: }