Skip to content

Commit ae87f78

Browse files
committed
test(matrix): isolate IndexedDB persistence fixtures
1 parent 4545a0e commit ae87f78

3 files changed

Lines changed: 37 additions & 24 deletions

File tree

extensions/matrix/src/matrix/sdk/idb-persistence.lock-order.test.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ let persistIdbToDisk: typeof import("./idb-persistence.js").persistIdbToDisk;
2929
let restoreIdbFromDisk: typeof import("./idb-persistence.js").restoreIdbFromDisk;
3030
type CapturedLockOptions =
3131
typeof import("./idb-persistence-lock.js").MATRIX_IDB_SNAPSHOT_LOCK_OPTIONS;
32+
const DATABASE_PREFIX = "openclaw-matrix-lock-order-test";
33+
const cryptoDatabaseName = `${DATABASE_PREFIX}::matrix-sdk-crypto`;
3234

3335
beforeAll(async () => {
3436
({ persistIdbToDisk, restoreIdbFromDisk } = await import("./idb-persistence.js"));
@@ -43,33 +45,32 @@ describe("Matrix IndexedDB persistence lock ordering", () => {
4345
withFileLockMock.mockImplementation(
4446
async <T>(_filePath: string, _options: unknown, fn: () => Promise<T>) => await fn(),
4547
);
46-
await clearAllIndexedDbState();
48+
await clearAllIndexedDbState({ databasePrefix: DATABASE_PREFIX });
4749
});
4850

4951
afterEach(async () => {
50-
await clearAllIndexedDbState();
52+
await clearAllIndexedDbState({ databasePrefix: DATABASE_PREFIX });
5153
fs.rmSync(tmpDir, { recursive: true, force: true });
5254
});
5355

5456
it("captures the snapshot after the file lock is acquired", async () => {
5557
const snapshotPath = path.join(tmpDir, "crypto-idb-snapshot.json");
56-
const dbName = "openclaw-matrix-test::matrix-sdk-crypto";
5758
await seedDatabase({
58-
name: dbName,
59+
name: cryptoDatabaseName,
5960
storeName: "sessions",
6061
records: [{ key: "room-1", value: { session: "old-session" } }],
6162
});
6263

6364
withFileLockMock.mockImplementationOnce(async (_filePath, _options, fn) => {
6465
await seedDatabase({
65-
name: dbName,
66+
name: cryptoDatabaseName,
6667
storeName: "sessions",
6768
records: [{ key: "room-1", value: { session: "new-session" } }],
6869
});
6970
return await fn();
7071
});
7172

72-
await persistIdbToDisk({ snapshotPath, databasePrefix: "openclaw-matrix-test" });
73+
await persistIdbToDisk({ snapshotPath, databasePrefix: DATABASE_PREFIX });
7374

7475
const data = JSON.parse(fs.readFileSync(snapshotPath, "utf8")) as Array<{
7576
stores: Array<{
@@ -89,7 +90,7 @@ describe("Matrix IndexedDB persistence lock ordering", () => {
8990
capturedOptions.push(options as CapturedLockOptions);
9091
return 0;
9192
});
92-
await persistIdbToDisk({ snapshotPath, databasePrefix: "openclaw-matrix-test" });
93+
await persistIdbToDisk({ snapshotPath, databasePrefix: DATABASE_PREFIX });
9394

9495
fs.writeFileSync(snapshotPath, "[]", "utf8");
9596
withFileLockMock.mockImplementationOnce(async (_filePath, options) => {

extensions/matrix/src/matrix/sdk/idb-persistence.test-helpers.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
1-
export async function clearAllIndexedDbState(): Promise<void> {
1+
export async function clearAllIndexedDbState(params?: { databasePrefix?: string }): Promise<void> {
22
const databases = await indexedDB.databases();
3+
const expectedPrefix = params?.databasePrefix ? `${params.databasePrefix}::` : null;
34
await Promise.all(
45
databases
56
.map((entry) => entry.name)
67
.filter((name): name is string => Boolean(name))
8+
.filter((name) => !expectedPrefix || name.startsWith(expectedPrefix))
79
.map(
810
(name) =>
911
new Promise<void>((resolve, reject) => {

extensions/matrix/src/matrix/sdk/idb-persistence.test.ts

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,58 +15,68 @@ import {
1515
} from "./idb-persistence.test-helpers.js";
1616
import { LogService } from "./logger.js";
1717

18+
const DATABASE_PREFIX = "openclaw-matrix-persistence-test";
19+
const OTHER_DATABASE_PREFIX = "openclaw-matrix-persistence-other-test";
20+
const cryptoDatabaseName = `${DATABASE_PREFIX}::matrix-sdk-crypto`;
21+
const otherCryptoDatabaseName = `${OTHER_DATABASE_PREFIX}::matrix-sdk-crypto`;
22+
23+
async function clearTestIndexedDbState(): Promise<void> {
24+
await clearAllIndexedDbState({ databasePrefix: DATABASE_PREFIX });
25+
await clearAllIndexedDbState({ databasePrefix: OTHER_DATABASE_PREFIX });
26+
}
27+
1828
describe("Matrix IndexedDB persistence", () => {
1929
let tmpDir: string;
2030
let warnSpy: ReturnType<typeof vi.spyOn>;
2131

2232
beforeEach(async () => {
2333
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "matrix-idb-persist-"));
2434
warnSpy = vi.spyOn(LogService, "warn").mockImplementation(() => {});
25-
await clearAllIndexedDbState();
35+
await clearTestIndexedDbState();
2636
});
2737

2838
afterEach(async () => {
2939
warnSpy.mockRestore();
30-
await clearAllIndexedDbState();
40+
await clearTestIndexedDbState();
3141
resetFileLockStateForTest();
3242
fs.rmSync(tmpDir, { recursive: true, force: true });
3343
});
3444

3545
it("persists and restores database contents for the selected prefix", async () => {
3646
const snapshotPath = path.join(tmpDir, "crypto-idb-snapshot.json");
3747
await seedDatabase({
38-
name: "openclaw-matrix-test::matrix-sdk-crypto",
48+
name: cryptoDatabaseName,
3949
storeName: "sessions",
4050
records: [{ key: "room-1", value: { session: "abc123" } }],
4151
});
4252
await seedDatabase({
43-
name: "other-prefix::matrix-sdk-crypto",
53+
name: otherCryptoDatabaseName,
4454
storeName: "sessions",
4555
records: [{ key: "room-2", value: { session: "should-not-restore" } }],
4656
});
4757

4858
await persistIdbToDisk({
4959
snapshotPath,
50-
databasePrefix: "openclaw-matrix-test",
60+
databasePrefix: DATABASE_PREFIX,
5161
});
5262
expect(fs.existsSync(snapshotPath)).toBe(true);
5363

5464
const mode = fs.statSync(snapshotPath).mode & 0o777;
5565
expect(mode).toBe(0o600);
5666

57-
await clearAllIndexedDbState();
67+
await clearTestIndexedDbState();
5868

5969
const restored = await restoreIdbFromDisk(snapshotPath);
6070
expect(restored).toBe(true);
6171

6272
const restoredRecords = await readDatabaseRecords({
63-
name: "openclaw-matrix-test::matrix-sdk-crypto",
73+
name: cryptoDatabaseName,
6474
storeName: "sessions",
6575
});
6676
expect(restoredRecords).toEqual([{ key: "room-1", value: { session: "abc123" } }]);
6777

6878
const dbs = await indexedDB.databases();
69-
expect(dbs.some((entry) => entry.name === "other-prefix::matrix-sdk-crypto")).toBe(false);
79+
expect(dbs.some((entry) => entry.name === otherCryptoDatabaseName)).toBe(false);
7080
});
7181

7282
it("returns false and logs a warning for malformed snapshots", async () => {
@@ -103,14 +113,14 @@ describe("Matrix IndexedDB persistence", () => {
103113
it("serializes concurrent persist operations via file lock", async () => {
104114
const snapshotPath = path.join(tmpDir, "concurrent-persist.json");
105115
await seedDatabase({
106-
name: "openclaw-matrix-test::matrix-sdk-crypto",
116+
name: cryptoDatabaseName,
107117
storeName: "sessions",
108118
records: [{ key: "room-1", value: { session: "abc123" } }],
109119
});
110120

111121
await Promise.all([
112-
persistIdbToDisk({ snapshotPath, databasePrefix: "openclaw-matrix-test" }),
113-
persistIdbToDisk({ snapshotPath, databasePrefix: "openclaw-matrix-test" }),
122+
persistIdbToDisk({ snapshotPath, databasePrefix: DATABASE_PREFIX }),
123+
persistIdbToDisk({ snapshotPath, databasePrefix: DATABASE_PREFIX }),
114124
]);
115125

116126
expect(fs.existsSync(snapshotPath)).toBe(true);
@@ -123,12 +133,12 @@ describe("Matrix IndexedDB persistence", () => {
123133
it("releases lock after persist completes", async () => {
124134
const snapshotPath = path.join(tmpDir, "lock-release.json");
125135
await seedDatabase({
126-
name: "openclaw-matrix-test::matrix-sdk-crypto",
136+
name: cryptoDatabaseName,
127137
storeName: "sessions",
128138
records: [{ key: "room-1", value: { session: "abc123" } }],
129139
});
130140

131-
await persistIdbToDisk({ snapshotPath, databasePrefix: "openclaw-matrix-test" });
141+
await persistIdbToDisk({ snapshotPath, databasePrefix: DATABASE_PREFIX });
132142

133143
const lockPath = `${snapshotPath}.lock`;
134144
expect(fs.existsSync(lockPath)).toBe(false);
@@ -138,13 +148,13 @@ describe("Matrix IndexedDB persistence", () => {
138148
it("releases lock after restore completes", async () => {
139149
const snapshotPath = path.join(tmpDir, "lock-release-restore.json");
140150
await seedDatabase({
141-
name: "openclaw-matrix-test::matrix-sdk-crypto",
151+
name: cryptoDatabaseName,
142152
storeName: "sessions",
143153
records: [{ key: "room-1", value: { session: "abc123" } }],
144154
});
145155

146-
await persistIdbToDisk({ snapshotPath, databasePrefix: "openclaw-matrix-test" });
147-
await clearAllIndexedDbState();
156+
await persistIdbToDisk({ snapshotPath, databasePrefix: DATABASE_PREFIX });
157+
await clearTestIndexedDbState();
148158
await drainFileLockStateForTest();
149159

150160
await restoreIdbFromDisk(snapshotPath);

0 commit comments

Comments
 (0)