109 lines
2.9 KiB
JavaScript
109 lines
2.9 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
* http://creativecommons.org/publicdomain/zero/1.0/
|
|
*/
|
|
|
|
// This testing component is used in test_vacuum* tests.
|
|
|
|
const CAT_NAME = "vacuum-participant";
|
|
const CONTRACT_ID = "@unit.test.com/test-vacuum-participant;1";
|
|
|
|
import { MockRegistrar } from "resource://testing-common/MockRegistrar.sys.mjs";
|
|
import { TestUtils } from "resource://testing-common/TestUtils.sys.mjs";
|
|
|
|
export class VacuumParticipant {
|
|
#dbConn;
|
|
#expectedPageSize = 0;
|
|
#useIncrementalVacuum = false;
|
|
#grant = false;
|
|
|
|
/**
|
|
* Build a VacuumParticipant instance.
|
|
* Note: After creation you must await instance.promiseRegistered() to ensure
|
|
* Category Caches have been updated.
|
|
*
|
|
* @param {mozIStorageAsyncConnection} databaseConnection
|
|
* The connection to be vacuumed.
|
|
* @param {Number} [expectedPageSize]
|
|
* Used to change the database page size.
|
|
* @param {boolean} [useIncrementalVacuum]
|
|
* Whether to enable incremental vacuum on the database.
|
|
* @param {boolean} [grant]
|
|
* Whether the vacuum operation should be granted.
|
|
*/
|
|
constructor(
|
|
databaseConnection,
|
|
{ expectedPageSize = 0, useIncrementalVacuum = false, grant = true } = {}
|
|
) {
|
|
this.#dbConn = databaseConnection;
|
|
|
|
// Register as the only participant.
|
|
this.#unregisterAllParticipants();
|
|
this.#registerAsParticipant();
|
|
|
|
this.#expectedPageSize = expectedPageSize;
|
|
this.#useIncrementalVacuum = useIncrementalVacuum;
|
|
this.#grant = grant;
|
|
|
|
this.QueryInterface = ChromeUtils.generateQI([
|
|
"mozIStorageVacuumParticipant",
|
|
]);
|
|
}
|
|
|
|
promiseRegistered() {
|
|
// The category manager dispatches change notifications to the main thread,
|
|
// so we must wait one tick.
|
|
return TestUtils.waitForTick();
|
|
}
|
|
|
|
#registerAsParticipant() {
|
|
MockRegistrar.register(CONTRACT_ID, this);
|
|
Services.catMan.addCategoryEntry(
|
|
CAT_NAME,
|
|
"vacuumParticipant",
|
|
CONTRACT_ID,
|
|
false,
|
|
false
|
|
);
|
|
}
|
|
|
|
#unregisterAllParticipants() {
|
|
// First unregister other participants.
|
|
for (let { data: entry } of Services.catMan.enumerateCategory(CAT_NAME)) {
|
|
Services.catMan.deleteCategoryEntry("vacuum-participant", entry, false);
|
|
}
|
|
}
|
|
|
|
async dispose() {
|
|
this.#unregisterAllParticipants();
|
|
MockRegistrar.unregister(CONTRACT_ID);
|
|
await new Promise(resolve => {
|
|
this.#dbConn.asyncClose(resolve);
|
|
});
|
|
}
|
|
|
|
get expectedDatabasePageSize() {
|
|
return this.#expectedPageSize;
|
|
}
|
|
|
|
get useIncrementalVacuum() {
|
|
return this.#useIncrementalVacuum;
|
|
}
|
|
|
|
get databaseConnection() {
|
|
return this.#dbConn;
|
|
}
|
|
|
|
onBeginVacuum() {
|
|
if (!this.#grant) {
|
|
return false;
|
|
}
|
|
Services.obs.notifyObservers(null, "test-begin-vacuum");
|
|
return true;
|
|
}
|
|
onEndVacuum(succeeded) {
|
|
Services.obs.notifyObservers(
|
|
null,
|
|
succeeded ? "test-end-vacuum-success" : "test-end-vacuum-failure"
|
|
);
|
|
}
|
|
}
|