add test for messageQueue

replace setTimeout to Promised wait
This commit is contained in:
afrokick 2019-12-15 18:49:01 +03:00
parent c05fdbbdbe
commit fe6f513b01
7 changed files with 84 additions and 22 deletions

1
dist/src/index.js vendored
View File

@ -36,7 +36,6 @@ const init = ({ app, server, options }) => {
const messageQueue = realm.getMessageQueueById(client.getId()); const messageQueue = realm.getMessageQueueById(client.getId());
if (messageQueue) { if (messageQueue) {
let message; let message;
// tslint:disable
while (message = messageQueue.readMessage()) { while (message = messageQueue.readMessage()) {
messageHandler.handle(client, message); messageHandler.handle(client, message);
} }

View File

@ -16,7 +16,7 @@ class MessageQueue {
this.lastReadAt = new Date().getTime(); this.lastReadAt = new Date().getTime();
return this.messages.shift(); return this.messages.shift();
} }
return null; return undefined;
} }
getMessages() { getMessages() {
return this.messages; return this.messages;

View File

@ -46,9 +46,8 @@ const init = ({ app, server, options }: {
const messageQueue = realm.getMessageQueueById(client.getId()); const messageQueue = realm.getMessageQueueById(client.getId());
if (messageQueue) { if (messageQueue) {
let message: IMessage | null; let message: IMessage | undefined;
// tslint:disable
while (message = messageQueue.readMessage()) { while (message = messageQueue.readMessage()) {
messageHandler.handle(client, message); messageHandler.handle(client, message);
} }

View File

@ -5,7 +5,7 @@ export interface IMessageQueue {
addMessage(message: IMessage): void; addMessage(message: IMessage): void;
readMessage(): IMessage | null; readMessage(): IMessage | undefined;
getMessages(): IMessage[]; getMessages(): IMessage[];
} }
@ -22,13 +22,13 @@ export class MessageQueue implements IMessageQueue {
this.messages.push(message); this.messages.push(message);
} }
public readMessage(): IMessage | null { public readMessage(): IMessage | undefined {
if (this.messages.length > 0) { if (this.messages.length > 0) {
this.lastReadAt = new Date().getTime(); this.lastReadAt = new Date().getTime();
return this.messages.shift()!; return this.messages.shift()!;
} }
return null; return undefined;
} }
public getMessages(): IMessage[] { public getMessages(): IMessage[] {

View File

@ -0,0 +1,62 @@
import { expect } from 'chai';
import { MessageQueue } from '../../src/models/messageQueue';
import { MessageType } from '../../src/enums';
import { IMessage } from '../../src/models/message';
import { wait } from '../utils';
describe('MessageQueue', () => {
const createTestMessage = (): IMessage => {
return {
type: MessageType.OPEN,
src: 'src',
dst: 'dst'
};
};
describe('#addMessage', () => {
it('should add message to queue', () => {
const queue = new MessageQueue();
queue.addMessage(createTestMessage());
expect(queue.getMessages().length).to.eq(1);
});
});
describe('#readMessage', () => {
it('should return undefined for empty queue', () => {
const queue = new MessageQueue();
expect(queue.readMessage()).to.be.undefined;
});
it('should return message if any exists in queue', () => {
const queue = new MessageQueue();
const message = createTestMessage();
queue.addMessage(message);
expect(queue.readMessage()).to.deep.eq(message);
expect(queue.readMessage()).to.be.undefined;
});
});
describe('#getLastReadAt', () => {
it('should not be changed if no messages when read', () => {
const queue = new MessageQueue();
const lastReadAt = queue.getLastReadAt();
queue.readMessage();
expect(queue.getLastReadAt()).to.be.eq(lastReadAt);
});
it('should be changed when read message', async () => {
const queue = new MessageQueue();
const lastReadAt = queue.getLastReadAt();
queue.addMessage(createTestMessage());
await wait(10);
expect(queue.getLastReadAt()).to.be.eq(lastReadAt);
queue.readMessage();
expect(queue.getLastReadAt()).to.be.greaterThan(lastReadAt + 10);
});
});
});

View File

@ -2,9 +2,10 @@ import { expect } from 'chai';
import { Client } from '../../../src/models/client'; import { Client } from '../../../src/models/client';
import { Realm } from '../../../src/models/realm'; import { Realm } from '../../../src/models/realm';
import { CheckBrokenConnections } from '../../../src/services/checkBrokenConnections'; import { CheckBrokenConnections } from '../../../src/services/checkBrokenConnections';
import { wait } from '../../utils';
describe('checkBrokenConnections service', () => { describe('checkBrokenConnections service', () => {
it('should remove client after 2 checks', (done) => { it('should remove client after 2 checks', async () => {
const realm = new Realm(); const realm = new Realm();
const doubleCheckTime = 55;//~ equals to checkBrokenConnections.checkInterval * 2 const doubleCheckTime = 55;//~ equals to checkBrokenConnections.checkInterval * 2
const checkBrokenConnections = new CheckBrokenConnections({ realm, config: { alive_timeout: doubleCheckTime }, checkInterval: 30 }); const checkBrokenConnections = new CheckBrokenConnections({ realm, config: { alive_timeout: doubleCheckTime }, checkInterval: 30 });
@ -13,14 +14,14 @@ describe('checkBrokenConnections service', () => {
checkBrokenConnections.start(); checkBrokenConnections.start();
setTimeout(() => { await wait(checkBrokenConnections.checkInterval * 2 + 30);
expect(realm.getClientById('id')).to.be.undefined;
checkBrokenConnections.stop(); expect(realm.getClientById('id')).to.be.undefined;
done();
}, checkBrokenConnections.checkInterval * 2 + 30); checkBrokenConnections.stop();
}); });
it('should remove client after 1 ping', (done) => { it('should remove client after 1 ping', async () => {
const realm = new Realm(); const realm = new Realm();
const doubleCheckTime = 55;//~ equals to checkBrokenConnections.checkInterval * 2 const doubleCheckTime = 55;//~ equals to checkBrokenConnections.checkInterval * 2
const checkBrokenConnections = new CheckBrokenConnections({ realm, config: { alive_timeout: doubleCheckTime }, checkInterval: 30 }); const checkBrokenConnections = new CheckBrokenConnections({ realm, config: { alive_timeout: doubleCheckTime }, checkInterval: 30 });
@ -30,14 +31,14 @@ describe('checkBrokenConnections service', () => {
checkBrokenConnections.start(); checkBrokenConnections.start();
//set ping after first check //set ping after first check
setTimeout(() => { await wait(checkBrokenConnections.checkInterval);
client.setLastPing(new Date().getTime());
setTimeout(() => { client.setLastPing(new Date().getTime());
expect(realm.getClientById('id')).to.be.undefined;
checkBrokenConnections.stop(); await wait(checkBrokenConnections.checkInterval * 2 + 10);
done();
}, checkBrokenConnections.checkInterval * 2 + 10); expect(realm.getClientById('id')).to.be.undefined;
}, checkBrokenConnections.checkInterval);
checkBrokenConnections.stop();
}); });
}); });

1
test/utils.ts Normal file
View File

@ -0,0 +1 @@
export const wait = (ms: number): Promise<void> => new Promise(resolve => setTimeout(resolve, ms));