




























@@ -15,58 +15,68 @@ import {
1515} from "./idb-persistence.test-helpers.js";
1616import { LogService } from "./logger.js";
171718+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+1828describe("Matrix IndexedDB persistence", () => {
1929let tmpDir: string;
2030let warnSpy: ReturnType<typeof vi.spyOn>;
21312232beforeEach(async () => {
2333tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "matrix-idb-persist-"));
2434warnSpy = vi.spyOn(LogService, "warn").mockImplementation(() => {});
25-await clearAllIndexedDbState();
35+await clearTestIndexedDbState();
2636});
27372838afterEach(async () => {
2939warnSpy.mockRestore();
30-await clearAllIndexedDbState();
40+await clearTestIndexedDbState();
3141resetFileLockStateForTest();
3242fs.rmSync(tmpDir, { recursive: true, force: true });
3343});
34443545it("persists and restores database contents for the selected prefix", async () => {
3646const snapshotPath = path.join(tmpDir, "crypto-idb-snapshot.json");
3747await seedDatabase({
38-name: "openclaw-matrix-test::matrix-sdk-crypto",
48+name: cryptoDatabaseName,
3949storeName: "sessions",
4050records: [{ key: "room-1", value: { session: "abc123" } }],
4151});
4252await seedDatabase({
43-name: "other-prefix::matrix-sdk-crypto",
53+name: otherCryptoDatabaseName,
4454storeName: "sessions",
4555records: [{ key: "room-2", value: { session: "should-not-restore" } }],
4656});
47574858await persistIdbToDisk({
4959 snapshotPath,
50-databasePrefix: "openclaw-matrix-test",
60+databasePrefix: DATABASE_PREFIX,
5161});
5262expect(fs.existsSync(snapshotPath)).toBe(true);
53635464const mode = fs.statSync(snapshotPath).mode & 0o777;
5565expect(mode).toBe(0o600);
566657-await clearAllIndexedDbState();
67+await clearTestIndexedDbState();
58685969const restored = await restoreIdbFromDisk(snapshotPath);
6070expect(restored).toBe(true);
61716272const restoredRecords = await readDatabaseRecords({
63-name: "openclaw-matrix-test::matrix-sdk-crypto",
73+name: cryptoDatabaseName,
6474storeName: "sessions",
6575});
6676expect(restoredRecords).toEqual([{ key: "room-1", value: { session: "abc123" } }]);
67776878const 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});
71817282it("returns false and logs a warning for malformed snapshots", async () => {
@@ -103,14 +113,14 @@ describe("Matrix IndexedDB persistence", () => {
103113it("serializes concurrent persist operations via file lock", async () => {
104114const snapshotPath = path.join(tmpDir, "concurrent-persist.json");
105115await seedDatabase({
106-name: "openclaw-matrix-test::matrix-sdk-crypto",
116+name: cryptoDatabaseName,
107117storeName: "sessions",
108118records: [{ key: "room-1", value: { session: "abc123" } }],
109119});
110120111121await 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]);
115125116126expect(fs.existsSync(snapshotPath)).toBe(true);
@@ -123,12 +133,12 @@ describe("Matrix IndexedDB persistence", () => {
123133it("releases lock after persist completes", async () => {
124134const snapshotPath = path.join(tmpDir, "lock-release.json");
125135await seedDatabase({
126-name: "openclaw-matrix-test::matrix-sdk-crypto",
136+name: cryptoDatabaseName,
127137storeName: "sessions",
128138records: [{ key: "room-1", value: { session: "abc123" } }],
129139});
130140131-await persistIdbToDisk({ snapshotPath, databasePrefix: "openclaw-matrix-test" });
141+await persistIdbToDisk({ snapshotPath, databasePrefix: DATABASE_PREFIX });
132142133143const lockPath = `${snapshotPath}.lock`;
134144expect(fs.existsSync(lockPath)).toBe(false);
@@ -138,13 +148,13 @@ describe("Matrix IndexedDB persistence", () => {
138148it("releases lock after restore completes", async () => {
139149const snapshotPath = path.join(tmpDir, "lock-release-restore.json");
140150await seedDatabase({
141-name: "openclaw-matrix-test::matrix-sdk-crypto",
151+name: cryptoDatabaseName,
142152storeName: "sessions",
143153records: [{ key: "room-1", value: { session: "abc123" } }],
144154});
145155146-await persistIdbToDisk({ snapshotPath, databasePrefix: "openclaw-matrix-test" });
147-await clearAllIndexedDbState();
156+await persistIdbToDisk({ snapshotPath, databasePrefix: DATABASE_PREFIX });
157+await clearTestIndexedDbState();
148158await drainFileLockStateForTest();
149159150160await restoreIdbFromDisk(snapshotPath);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。