summaryrefslogtreecommitdiffstats
path: root/storage/test/unit/VacuumParticipant.sys.mjs
diff options
context:
space:
mode:
Diffstat (limited to 'storage/test/unit/VacuumParticipant.sys.mjs')
-rw-r--r--storage/test/unit/VacuumParticipant.sys.mjs109
1 files changed, 109 insertions, 0 deletions
diff --git a/storage/test/unit/VacuumParticipant.sys.mjs b/storage/test/unit/VacuumParticipant.sys.mjs
new file mode 100644
index 0000000000..9f1c39826e
--- /dev/null
+++ b/storage/test/unit/VacuumParticipant.sys.mjs
@@ -0,0 +1,109 @@
+/* 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"
+ );
+ }
+}