2024-07-10 21:10:08 +00:00
|
|
|
// Copyright 2024 Signal Messenger, LLC
|
|
|
|
// SPDX-License-Identifier: AGPL-3.0-only
|
|
|
|
|
|
|
|
import { assert } from 'chai';
|
|
|
|
import { findLast } from 'lodash';
|
2024-07-22 18:16:33 +00:00
|
|
|
import type { WritableDB } from '../../sql/Interface';
|
|
|
|
import { markAllCallHistoryRead } from '../../sql/Server';
|
2024-07-10 21:10:08 +00:00
|
|
|
import { SeenStatus } from '../../MessageSeenStatus';
|
|
|
|
import {
|
2024-08-06 19:29:13 +00:00
|
|
|
CallMode,
|
2024-07-10 21:10:08 +00:00
|
|
|
CallDirection,
|
|
|
|
CallType,
|
|
|
|
DirectCallStatus,
|
|
|
|
} from '../../types/CallDisposition';
|
|
|
|
import { strictAssert } from '../../util/assert';
|
2024-07-22 18:16:33 +00:00
|
|
|
import { createDB, insertData, updateToVersion } from './helpers';
|
2024-07-10 21:10:08 +00:00
|
|
|
|
|
|
|
describe('SQL/updateToSchemaVersion1100', () => {
|
2024-07-22 18:16:33 +00:00
|
|
|
let db: WritableDB;
|
2024-07-10 21:10:08 +00:00
|
|
|
beforeEach(() => {
|
2024-07-22 18:16:33 +00:00
|
|
|
db = createDB();
|
2024-08-27 13:20:23 +00:00
|
|
|
// index updated in 1170
|
|
|
|
updateToVersion(db, 1170);
|
2024-07-10 21:10:08 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
afterEach(() => {
|
|
|
|
db.close();
|
|
|
|
});
|
|
|
|
|
|
|
|
describe('Optimize markAllCallHistoryReadInConversation', () => {
|
|
|
|
it('is fast', () => {
|
|
|
|
const COUNT = 10_000;
|
2024-08-27 13:20:23 +00:00
|
|
|
const CONVERSATIONS = 30;
|
|
|
|
|
|
|
|
const conversations = Array.from(
|
|
|
|
{ length: CONVERSATIONS },
|
|
|
|
(_, index) => {
|
|
|
|
return {
|
|
|
|
id: `test-conversation-${index}`,
|
|
|
|
groupId: `test-conversation-${index}`,
|
|
|
|
serviceId: `test-conversation-${index}`,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
);
|
2024-07-10 21:10:08 +00:00
|
|
|
|
|
|
|
const messages = Array.from({ length: COUNT }, (_, index) => {
|
|
|
|
return {
|
|
|
|
id: `test-message-${index}`,
|
|
|
|
type: 'call-history',
|
|
|
|
seenStatus: SeenStatus.Unseen,
|
2024-08-27 13:20:23 +00:00
|
|
|
conversationId: `test-conversation-${index % CONVERSATIONS}`,
|
|
|
|
received_at: index,
|
2024-07-10 21:10:08 +00:00
|
|
|
json: {
|
|
|
|
callId: `test-call-${index}`,
|
|
|
|
},
|
|
|
|
};
|
|
|
|
});
|
|
|
|
|
|
|
|
const callsHistory = Array.from({ length: COUNT }, (_, index) => {
|
|
|
|
return {
|
|
|
|
callId: `test-call-${index}`,
|
2024-08-27 13:20:23 +00:00
|
|
|
peerId: `test-conversation-${index % CONVERSATIONS}`,
|
2024-07-10 21:10:08 +00:00
|
|
|
timestamp: index,
|
|
|
|
ringerId: null,
|
|
|
|
mode: CallMode.Direct,
|
|
|
|
type: CallType.Video,
|
|
|
|
direction: CallDirection.Incoming,
|
|
|
|
status: DirectCallStatus.Missed,
|
|
|
|
};
|
|
|
|
});
|
|
|
|
|
2024-08-27 13:20:23 +00:00
|
|
|
insertData(db, 'conversations', conversations);
|
2024-07-10 21:10:08 +00:00
|
|
|
insertData(db, 'messages', messages);
|
|
|
|
insertData(db, 'callsHistory', callsHistory);
|
|
|
|
|
|
|
|
const latestCallInConversation = findLast(callsHistory, call => {
|
|
|
|
return call.peerId === 'test-conversation-0';
|
|
|
|
});
|
|
|
|
|
|
|
|
strictAssert(latestCallInConversation, 'missing latest call');
|
|
|
|
|
|
|
|
const target = {
|
|
|
|
timestamp: latestCallInConversation.timestamp,
|
|
|
|
callId: latestCallInConversation.callId,
|
|
|
|
peerId: latestCallInConversation.peerId,
|
|
|
|
};
|
|
|
|
|
|
|
|
const start = performance.now();
|
2024-08-27 13:20:23 +00:00
|
|
|
const changes = markAllCallHistoryRead(db, target, true);
|
2024-07-10 21:10:08 +00:00
|
|
|
const end = performance.now();
|
2024-08-27 13:20:23 +00:00
|
|
|
assert.equal(changes, Math.ceil(COUNT / CONVERSATIONS));
|
2024-07-10 21:10:08 +00:00
|
|
|
assert.isBelow(end - start, 50);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|