signal-desktop/ts/test-mock/benchmarks/group_send_bench.ts

165 lines
4.2 KiB
TypeScript
Raw Normal View History

// Copyright 2022 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
/* eslint-disable no-await-in-loop, no-console */
import assert from 'assert';
import {
StorageState,
EnvelopeType,
ReceiptType,
} from '@signalapp/mock-server';
2022-07-08 20:46:25 +00:00
import {
Bootstrap,
debug,
stats,
RUN_COUNT,
GROUP_SIZE,
DISCARD_COUNT,
} from './fixtures';
const CONVERSATION_SIZE = 500; // messages
const LAST_MESSAGE = 'start sending messages now';
2023-03-13 23:41:47 +00:00
Bootstrap.benchmark(async (bootstrap: Bootstrap): Promise<void> => {
const { contacts, phone } = bootstrap;
const members = [...contacts].slice(0, GROUP_SIZE);
const group = await phone.createGroup({
title: 'Mock Group',
members: [phone, ...members],
});
await phone.setStorageState(
StorageState.getEmpty()
.addGroup(group, { whitelisted: true })
.pinGroup(group)
);
2023-03-13 23:41:47 +00:00
const app = await bootstrap.link();
2022-07-08 20:46:25 +00:00
2023-03-13 23:41:47 +00:00
const { server, desktop } = bootstrap;
const [first] = members;
2023-03-13 23:41:47 +00:00
const messages = new Array<Buffer>();
debug('encrypting');
// Fill left pane
for (const contact of members.slice().reverse()) {
const messageTimestamp = bootstrap.getTimestamp();
2023-03-13 23:41:47 +00:00
messages.push(
await contact.encryptText(desktop, `hello from: ${contact.profileName}`, {
timestamp: messageTimestamp,
sealed: true,
})
);
messages.push(
await phone.encryptSyncRead(desktop, {
timestamp: bootstrap.getTimestamp(),
messages: [
{
2023-03-13 23:41:47 +00:00
senderUUID: contact.device.uuid,
timestamp: messageTimestamp,
2023-03-13 23:41:47 +00:00
},
],
})
);
}
2023-03-13 23:41:47 +00:00
// Fill group
for (let i = 0; i < CONVERSATION_SIZE; i += 1) {
const contact = members[i % members.length];
const messageTimestamp = bootstrap.getTimestamp();
const isLast = i === CONVERSATION_SIZE - 1;
messages.push(
await contact.encryptText(
desktop,
isLast ? LAST_MESSAGE : `#${i} from: ${contact.profileName}`,
{
timestamp: messageTimestamp,
sealed: true,
group,
}
)
);
messages.push(
await phone.encryptSyncRead(desktop, {
timestamp: bootstrap.getTimestamp(),
messages: [
{
2023-03-13 23:41:47 +00:00
senderUUID: contact.device.uuid,
timestamp: messageTimestamp,
2023-03-13 23:41:47 +00:00
},
],
})
);
}
debug('encrypted');
2023-03-13 23:41:47 +00:00
await Promise.all(messages.map(message => server.send(desktop, message)));
2023-03-13 23:41:47 +00:00
const window = await app.getWindow();
2023-03-13 23:41:47 +00:00
debug('opening conversation');
{
const leftPane = window.locator('.left-pane-wrapper');
2023-03-13 23:41:47 +00:00
const item = leftPane
.locator(
'.module-conversation-list__item--contact-or-conversation' +
`>> text=${LAST_MESSAGE}`
)
.first();
await item.click();
}
const timeline = window.locator(
'.timeline-wrapper, .conversation .ConversationView'
);
2023-03-13 23:41:47 +00:00
const deltaList = new Array<number>();
for (let runId = 0; runId < RUN_COUNT + DISCARD_COUNT; runId += 1) {
debug('finding composition input and clicking it');
const input = await app.waitForEnabledComposer();
2023-03-13 23:41:47 +00:00
debug('entering message text');
await input.type(`my message ${runId}`);
await input.press('Enter');
debug('waiting for message on server side');
const { body, source, envelopeType } = await first.waitForMessage();
assert.strictEqual(body, `my message ${runId}`);
assert.strictEqual(source, desktop);
assert.strictEqual(envelopeType, EnvelopeType.SenderKey);
2023-03-13 23:41:47 +00:00
debug('waiting for timing from the app');
const { timestamp, delta } = await app.waitForMessageSend();
debug('sending delivery receipts');
const delivery = await first.encryptReceipt(desktop, {
timestamp: timestamp + 1,
messageTimestamps: [timestamp],
type: ReceiptType.Delivery,
});
await server.send(desktop, delivery);
debug('waiting for message state change');
const message = timeline.locator(`[data-testid="${timestamp}"]`);
await message.waitFor();
if (runId >= DISCARD_COUNT) {
deltaList.push(delta);
console.log('run=%d info=%j', runId - DISCARD_COUNT, { delta });
} else {
console.log('discarded=%d info=%j', runId, { delta });
}
}
2023-03-13 23:41:47 +00:00
console.log('stats info=%j', { delta: stats(deltaList, [99, 99.8]) });
});