mirror of
https://github.com/signalapp/Signal-Desktop.git
synced 2026-09-29 16:34:09 +01:00
Storage Service: A few correctness fixes
Co-authored-by: Scott Nonnenberg <scott@signal.org>
This commit is contained in:
co-authored by
Scott Nonnenberg
parent
ae0fecd185
commit
35bad4c170
@@ -0,0 +1,113 @@
|
||||
// Copyright 2026 Signal Messenger, LLC
|
||||
// SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
import { assert } from 'chai';
|
||||
import { sortBy } from 'lodash';
|
||||
|
||||
import type { WritableDB } from '../../sql/Interface.std.ts';
|
||||
import {
|
||||
createDB,
|
||||
updateToVersion,
|
||||
insertData,
|
||||
getTableData,
|
||||
} from './helpers.node.ts';
|
||||
import { getRandomBytes } from '../../Crypto.node.ts';
|
||||
|
||||
describe('SQL/updateToSchemaVersion1800', () => {
|
||||
let db: WritableDB;
|
||||
|
||||
beforeEach(() => {
|
||||
db = createDB();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
db.close();
|
||||
});
|
||||
|
||||
it('adds and sets addedAt, sets storageNeedsSync, deletes if missing both adminKey and storageId', () => {
|
||||
updateToVersion(db, 1790);
|
||||
const initialData = [
|
||||
{
|
||||
roomId: 'roomId1 (to be deleted)',
|
||||
rootKey: Buffer.from(getRandomBytes(32)),
|
||||
adminKey: null,
|
||||
storageID: null,
|
||||
storageVersion: null,
|
||||
storageUnknownFields: null,
|
||||
storageNeedsSync: 0,
|
||||
},
|
||||
{
|
||||
roomId: 'roomId2',
|
||||
rootKey: Buffer.from(getRandomBytes(32)),
|
||||
adminKey: Buffer.from(getRandomBytes(32)),
|
||||
storageID: null,
|
||||
storageVersion: null,
|
||||
storageUnknownFields: null,
|
||||
storageNeedsSync: 0,
|
||||
},
|
||||
{
|
||||
roomId: 'roomId3',
|
||||
rootKey: Buffer.from(getRandomBytes(32)),
|
||||
adminKey: Buffer.from(getRandomBytes(32)),
|
||||
storageID: 'storageId3',
|
||||
storageVersion: 3,
|
||||
storageUnknownFields: Buffer.from(getRandomBytes(32)),
|
||||
storageNeedsSync: 0,
|
||||
},
|
||||
{
|
||||
roomId: 'roomId4',
|
||||
rootKey: Buffer.from(getRandomBytes(32)),
|
||||
adminKey: null,
|
||||
storageID: 'storageId4',
|
||||
storageVersion: 4,
|
||||
storageUnknownFields: null,
|
||||
storageNeedsSync: 0,
|
||||
},
|
||||
];
|
||||
insertData(db, 'defunctCallLinks', initialData);
|
||||
|
||||
const now = Date.now();
|
||||
updateToVersion(db, 1800);
|
||||
|
||||
const actual = sortBy(getTableData(db, 'defunctCallLinks'));
|
||||
|
||||
assert.lengthOf(actual, 3);
|
||||
|
||||
const item1 = actual[0];
|
||||
assert.strictEqual(item1?.roomId, 'roomId2');
|
||||
assert.isAtLeast(item1?.addedAt as number, now);
|
||||
assert.isAtLeast(item1?.storageNeedsSync as number, 1);
|
||||
|
||||
const item2 = actual[1];
|
||||
assert.strictEqual(item2?.roomId, 'roomId3');
|
||||
assert.isNumber(item2?.addedAt);
|
||||
assert.isAtLeast(item2?.addedAt as number, now);
|
||||
assert.isAtLeast(item1?.storageNeedsSync as number, 1);
|
||||
|
||||
const item3 = actual[2];
|
||||
assert.strictEqual(item3?.roomId, 'roomId4');
|
||||
assert.isNumber(item3?.addedAt);
|
||||
assert.isAtLeast(item3?.addedAt as number, now);
|
||||
assert.isAtLeast(item1?.storageNeedsSync as number, 1);
|
||||
});
|
||||
|
||||
it('addes a NOT NULL constraint without a table rebuild', () => {
|
||||
updateToVersion(db, 1790);
|
||||
const beforeResult = db
|
||||
.prepare(
|
||||
"SELECT sql from sqlite_schema WHERE name = 'defunctCallLinks'",
|
||||
{ pluck: true }
|
||||
)
|
||||
.get();
|
||||
assert.notMatch(beforeResult, /addedAt INTEGER NOT NULL/);
|
||||
|
||||
updateToVersion(db, 1800);
|
||||
const afterResult = db
|
||||
.prepare(
|
||||
"SELECT sql from sqlite_schema WHERE name = 'defunctCallLinks'",
|
||||
{ pluck: true }
|
||||
)
|
||||
.get();
|
||||
assert.match(afterResult as string, /addedAt INTEGER NOT NULL/);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user