Better handling of failed message migration attempts

This commit is contained in:
trevor-signal 2024-11-18 16:35:47 -05:00 committed by GitHub
parent 512dcaad45
commit a068456139
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 84 additions and 74 deletions

View file

@ -270,15 +270,19 @@ describe('Message', () => {
upgrade: v3,
});
const context = getDefaultContext({ logger });
const upgradeSchema = async (message: MessageAttributesType) =>
toVersion3(
await toVersion2(await toVersion1(message, context), context),
context
);
const actual = await upgradeSchema(input);
const actual = await Message.upgradeSchema(input, getDefaultContext(), {
versions: [toVersion1, toVersion2, toVersion3],
});
assert.deepEqual(actual, expected);
// if we try to upgrade it again, it will fail since it could not upgrade any
// versions
const upgradeAgainPromise = Message.upgradeSchema(
actual,
getDefaultContext(),
{ versions: [toVersion1, toVersion2, toVersion3] }
);
await assert.isRejected(upgradeAgainPromise);
});
it('should skip out-of-order upgrade steps', async () => {
@ -391,12 +395,12 @@ describe('Message', () => {
assert.deepEqual(actual, expected);
});
it('should return original message if upgrade function throws', async () => {
it('should throw if upgrade function throws', async () => {
const upgrade = async () => {
throw new Error('boom!');
};
const upgradeWithVersion = Message._withSchemaVersion({
schemaVersion: 3,
schemaVersion: 1,
upgrade,
});
@ -404,15 +408,12 @@ describe('Message', () => {
id: 'guid-guid-guid-guid',
schemaVersion: 0,
});
const expected = getDefaultMessage({
id: 'guid-guid-guid-guid',
schemaVersion: 0,
});
const actual = await upgradeWithVersion(
const upgradePromise = upgradeWithVersion(
input,
getDefaultContext({ logger })
);
assert.deepEqual(actual, expected);
await assert.isRejected(upgradePromise);
});
it('should return original message if upgrade function returns null', async () => {
@ -866,31 +867,5 @@ describe('Message', () => {
assert.deepEqual({ ...message, schemaVersion: 14 }, result);
});
it('if file does exist, but migration errors, does not increment version', async () => {
const message = getDefaultMessage({
schemaVersion: 13,
schemaMigrationAttempts: 0,
attachments: [
{
size: 128,
contentType: MIME.IMAGE_BMP,
path: 'no/file/here.png',
iv: 'iv',
digest: 'digest',
key: 'key',
},
],
contact: [],
});
const result = await Message.upgradeSchema(message, {
...getDefaultContext(),
doesAttachmentExist: async () => true,
ensureAttachmentIsReencryptable: async () => {
throw new Error("Can't reencrypt!");
},
});
assert.deepEqual(message, result);
});
});
});