feat(cli): add message revice test

pull/90/head
moonrailgun 2 years ago
parent 8a9dd4f65c
commit d09682139f

@ -3,6 +3,7 @@ import { io, Socket } from 'socket.io-client';
import msgpackParser from 'socket.io-msgpack-parser'; import msgpackParser from 'socket.io-msgpack-parser';
import fs from 'fs-extra'; import fs from 'fs-extra';
import ora from 'ora'; import ora from 'ora';
import randomString from 'crypto-random-string';
const CLIENT_CREATION_INTERVAL_IN_MS = 5; const CLIENT_CREATION_INTERVAL_IN_MS = 5;
@ -10,40 +11,100 @@ export const benchmarkConnectionsCommand: CommandModule = {
command: 'connections <url>', command: 'connections <url>',
describe: 'Test Tailchat Connections', describe: 'Test Tailchat Connections',
builder: (yargs) => builder: (yargs) =>
yargs.demandOption('url', 'Backend Url').option('file', { yargs
describe: 'Account Token Path', .demandOption('url', 'Backend Url')
demandOption: true, .option('file', {
type: 'string', describe: 'Account Token Path',
default: './accounts', demandOption: true,
}), type: 'string',
default: './accounts',
})
.option('groupId', {
describe: 'Group Id which send Message',
type: 'string',
})
.option('converseId', {
describe: 'Converse Id which send Message',
type: 'string',
}),
async handler(args) { async handler(args) {
console.log('Reading account tokens from', args.file); const url = args.url as string;
const account = await fs.readFile(args.file as string, { const file = args.file as string;
const groupId = args.groupId as string;
const converseId = args.converseId as string;
console.log('Reading account tokens from', file);
const account = await fs.readFile(file as string, {
encoding: 'utf8', encoding: 'utf8',
}); });
createClients( const sockets = await createClients(
args.url as string, url as string,
account.split('\n').map((s) => s.trim()) account.split('\n').map((s) => s.trim())
); );
if (groupId && converseId) {
// send message test
const randomMessage = randomString({ length: 16 });
const spinner = ora()
.info(`Start message receive test, message: ${randomMessage}`)
.start();
const start = Date.now();
let receiveCount = 0;
const len = sockets.length;
function receivedCallback() {
receiveCount += 1;
spinner.text = `Receive: ${receiveCount}/${len}`;
if (receiveCount === len) {
spinner.succeed(
`All client received, usage: ${Date.now() - start}ms`
);
}
}
sockets.forEach((socket) => {
socket.on('notify:chat.message.add', (message) => {
const content = message.content;
if (message.converseId === converseId && randomMessage === content) {
receivedCallback();
}
});
});
sockets[0].emit('chat.message.sendMessage', {
groupId,
converseId,
content: randomMessage,
});
}
}, },
}; };
async function createClients(url: string, accountTokens: string[]) { async function createClients(
url: string,
accountTokens: string[]
): Promise<Socket[]> {
const maxCount = accountTokens.length; const maxCount = accountTokens.length;
const spinner = ora().info(`Create Client Connection to ${url}`).start(); const spinner = ora().info(`Create Client Connection to ${url}`).start();
let i = 0; let i = 0;
const sockets: Socket[] = [];
for (const token of accountTokens) { for (const token of accountTokens) {
await sleep(CLIENT_CREATION_INTERVAL_IN_MS); await sleep(CLIENT_CREATION_INTERVAL_IN_MS);
spinner.text = `Progress: ${++i}/${maxCount}`; spinner.text = `Progress: ${++i}/${maxCount}`;
await createClient(url, token); const socket = await createClient(url, token);
sockets.push(socket);
} }
spinner.succeed(`${maxCount} clients has been create.`); spinner.succeed(`${maxCount} clients has been create.`);
return sockets;
} }
function createClient(url: string, token: string): Promise<Socket> { function createClient(url: string, token: string): Promise<Socket> {
return new Promise((resolve, reject) => { return new Promise<Socket>((resolve, reject) => {
const socket = io(url, { const socket = io(url, {
transports: ['websocket'], transports: ['websocket'],
auth: { auth: {
@ -63,6 +124,10 @@ function createClient(url: string, token: string): Promise<Socket> {
socket.on('disconnect', (reason) => { socket.on('disconnect', (reason) => {
console.log(`disconnect due to ${reason}`); console.log(`disconnect due to ${reason}`);
}); });
}).then(async (socket) => {
await socket.emitWithAck('chat.converse.findAndJoinRoom', {});
return socket;
}); });
} }

@ -24,9 +24,15 @@ export const benchmarkRegisterCommand: CommandModule = {
demandOption: true, demandOption: true,
type: 'number', type: 'number',
default: 100, default: 100,
})
.option('invite', {
describe: 'Invite Code',
type: 'string',
}), }),
async handler(args) { async handler(args) {
const url = args.url as string;
const count = args.count as number; const count = args.count as number;
const invite = args.invite as string | undefined;
const tokens: string[] = []; const tokens: string[] = [];
const start = Date.now(); const start = Date.now();
@ -35,10 +41,11 @@ export const benchmarkRegisterCommand: CommandModule = {
for (let i = 0; i < count; i++) { for (let i = 0; i < count; i++) {
spinner.text = `Progress: ${i + 1}/${count}`; spinner.text = `Progress: ${i + 1}/${count}`;
const token = await registerTemporaryAccount( const token = await registerTemporaryAccount(url, `benchUser-${i}`);
args.url as string, if (invite) {
`benchUser-${i}` // Apply group invite
); applyGroupInviteCode(url, token, invite);
}
tokens.push(token); tokens.push(token);
} }
@ -64,3 +71,18 @@ async function registerTemporaryAccount(
return res.data.token; return res.data.token;
} }
async function applyGroupInviteCode(
url: string,
token: string,
inviteCode: string
) {
await got.post(`${url}/api/group/invite/applyInvite`, {
json: {
code: inviteCode,
},
headers: {
'X-Token': token,
},
});
}

Loading…
Cancel
Save