Revision control

Copy as Markdown

Other Tools

/**
* Atypical gloda unit test that tests nuke migration. Gloda is not designed
* to be shutdown and started up again in the same process lifetime. It tries
* to be clever with caching accessors that clobber themselves out of existence
* which are hard to make come back to life, and probably other things.
*
* So what we do is create a global-messages-db.sqlite with an unacceptably
* old schema version before tickling gloda to startup. If gloda comes up
* with a database connection and it has the right schema version, we declare
* that gloda has successfully loaded. Our only historical screw-up here was
* very blatant (and was actually a result of trying to avoid complexity in
* the nuke path! oh the irony!) so we don't need to get all hardcore.
*/
/**
* The DB version to use. We set this as a non-const variable so that
* test_nuke_migration_from_future.js can change it.
*/
var BAD_DB_VERSION_TO_USE = 2;
/**
* Synchronously create and close the out-of-date database. Because we are
* only using synchronous APIs, we know everything is in fact dead. GC being
* what it is, the various C++ objects will probably stay alive through the
* next test, but will be inert because we have closed the database.
*/
function make_out_of_date_database() {
// Get the path to our global database
var dbFile = Services.dirsvc.get("ProfD", Ci.nsIFile);
dbFile.append("global-messages-db.sqlite");
// Create the database
var dbConnection = Services.storage.openUnsharedDatabase(dbFile);
dbConnection.schemaVersion = BAD_DB_VERSION_TO_USE;
// Close the database (will throw if there's a problem closing)
dbConnection.close();
}
// some copied and pasted preference setup from glodaTestHelper that is
// appropriate here.
// yes to indexing
Services.prefs.setBoolPref("mailnews.database.global.indexer.enabled", true);
// no to a sweep we don't control
Services.prefs.setBoolPref(
"mailnews.database.global.indexer.perform_initial_sweep",
false
);
function run_test() {
// - make the old database
make_out_of_date_database();
// - tickle gloda
// GlodaPublic.sys.mjs loads Gloda.sys.mjs which self-initializes and initializes the datastore
ChromeUtils.importESModule("resource:///modules/gloda/GlodaPublic.sys.mjs");
const { GlodaDatastore } = ChromeUtils.importESModule(
);
Assert.notEqual(GlodaDatastore.asyncConnection, null);
}