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: // Test startup and restart when no add-ons are installed michael@0: // bug 944006 michael@0: michael@0: Components.utils.import("resource://gre/modules/Promise.jsm"); michael@0: michael@0: // Load XPI Provider to get schema version ID michael@0: let XPIScope = Components.utils.import("resource://gre/modules/addons/XPIProvider.jsm"); michael@0: const DB_SCHEMA = XPIScope.DB_SCHEMA; michael@0: michael@0: createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2"); michael@0: michael@0: function run_test() { michael@0: // Kick off the task-based tests... michael@0: run_next_test(); michael@0: } michael@0: michael@0: // Test for a preference to either exist with a specified value, or not exist at all michael@0: function checkPending() { michael@0: try { michael@0: do_check_false(Services.prefs.getBoolPref("extensions.pendingOperations")); michael@0: } michael@0: catch (e) { michael@0: // OK michael@0: } michael@0: } michael@0: michael@0: function checkString(aPref, aValue) { michael@0: try { michael@0: do_check_eq(Services.prefs.getCharPref(aPref), aValue) michael@0: } michael@0: catch (e) { michael@0: //OK michael@0: } michael@0: } michael@0: michael@0: // Make sure all our extension state is empty/nonexistent michael@0: function check_empty_state() { michael@0: do_check_false(gExtensionsJSON.exists()); michael@0: do_check_false(gExtensionsINI.exists()); michael@0: michael@0: do_check_eq(Services.prefs.getIntPref("extensions.databaseSchema"), DB_SCHEMA); michael@0: michael@0: checkString("extensions.bootstrappedAddons", "{}"); michael@0: checkString("extensions.installCache", "[]"); michael@0: checkPending(); michael@0: } michael@0: michael@0: // After first run with no add-ons, we expect: michael@0: // no extensions.json is created michael@0: // no extensions.ini michael@0: // database schema version preference is set michael@0: // bootstrap add-ons preference is not found michael@0: // add-on directory state preference is an empty array michael@0: // no pending operations michael@0: add_task(function first_run() { michael@0: startupManager(); michael@0: check_empty_state(); michael@0: yield true; michael@0: }); michael@0: michael@0: // Now do something that causes a DB load, and re-check michael@0: function trigger_db_load() { michael@0: let addonDefer = Promise.defer(); michael@0: AddonManager.getAddonsByTypes(['extension'], addonDefer.resolve); michael@0: let addonList = yield addonDefer.promise; michael@0: michael@0: do_check_eq(addonList.length, 0); michael@0: check_empty_state(); michael@0: michael@0: yield true; michael@0: }; michael@0: add_task(trigger_db_load); michael@0: michael@0: // Now restart the manager and check again michael@0: add_task(function restart_and_recheck() { michael@0: restartManager(); michael@0: check_empty_state(); michael@0: yield true; michael@0: }); michael@0: michael@0: // and reload the DB again michael@0: add_task(trigger_db_load); michael@0: michael@0: // When we start up with no DB and an old database schema, we should update the michael@0: // schema number but not create a database michael@0: add_task(function upgrade_schema_version() { michael@0: shutdownManager(); michael@0: Services.prefs.setIntPref("extensions.databaseSchema", 1); michael@0: michael@0: startupManager(); michael@0: do_check_eq(Services.prefs.getIntPref("extensions.databaseSchema"), DB_SCHEMA); michael@0: check_empty_state(); michael@0: }); michael@0: