overleaf/services/real-time/test/unit/js/EventLoggerTests.js

106 lines
4 KiB
JavaScript
Raw Normal View History

/* eslint-disable
no-return-assign,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
* decaffeinate suggestions:
* DS102: Remove unnecessary code created because of implicit returns
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
require('chai').should();
const {
expect
} = require("chai");
const SandboxedModule = require('sandboxed-module');
const modulePath = '../../../app/js/EventLogger';
const sinon = require("sinon");
const tk = require("timekeeper");
2019-03-19 06:55:12 -04:00
describe('EventLogger', function() {
beforeEach(function() {
this.start = Date.now();
tk.freeze(new Date(this.start));
this.EventLogger = SandboxedModule.require(modulePath, { requires: {
"logger-sharelatex": (this.logger = {error: sinon.stub(), warn: sinon.stub()}),
"metrics-sharelatex": (this.metrics = {inc: sinon.stub()})
}
});
this.channel = "applied-ops";
this.id_1 = "random-hostname:abc-1";
this.message_1 = "message-1";
this.id_2 = "random-hostname:abc-2";
return this.message_2 = "message-2";
});
2019-03-19 06:55:12 -04:00
afterEach(function() { return tk.reset(); });
2019-03-19 06:55:12 -04:00
return describe('checkEventOrder', function() {
2019-03-19 06:55:12 -04:00
describe('when the events are in order', function() {
beforeEach(function() {
this.EventLogger.checkEventOrder(this.channel, this.id_1, this.message_1);
return this.status = this.EventLogger.checkEventOrder(this.channel, this.id_2, this.message_2);
});
it('should accept events in order', function() {
return expect(this.status).to.be.undefined;
});
return it('should increment the valid event metric', function() {
return this.metrics.inc.calledWith(`event.${this.channel}.valid`, 1)
.should.equal.true;
});
});
describe('when there is a duplicate events', function() {
beforeEach(function() {
this.EventLogger.checkEventOrder(this.channel, this.id_1, this.message_1);
return this.status = this.EventLogger.checkEventOrder(this.channel, this.id_1, this.message_1);
});
it('should return "duplicate" for the same event', function() {
return expect(this.status).to.equal("duplicate");
});
return it('should increment the duplicate event metric', function() {
return this.metrics.inc.calledWith(`event.${this.channel}.duplicate`, 1)
.should.equal.true;
});
});
describe('when there are out of order events', function() {
beforeEach(function() {
this.EventLogger.checkEventOrder(this.channel, this.id_1, this.message_1);
this.EventLogger.checkEventOrder(this.channel, this.id_2, this.message_2);
return this.status = this.EventLogger.checkEventOrder(this.channel, this.id_1, this.message_1);
});
it('should return "out-of-order" for the event', function() {
return expect(this.status).to.equal("out-of-order");
});
return it('should increment the out-of-order event metric', function() {
return this.metrics.inc.calledWith(`event.${this.channel}.out-of-order`, 1)
.should.equal.true;
});
});
return describe('after MAX_STALE_TIME_IN_MS', function() { return it('should flush old entries', function() {
let status;
this.EventLogger.MAX_EVENTS_BEFORE_CLEAN = 10;
this.EventLogger.checkEventOrder(this.channel, this.id_1, this.message_1);
for (let i = 1; i <= 8; i++) {
status = this.EventLogger.checkEventOrder(this.channel, this.id_1, this.message_1);
expect(status).to.equal("duplicate");
}
// the next event should flush the old entries aboce
this.EventLogger.MAX_STALE_TIME_IN_MS=1000;
tk.freeze(new Date(this.start + (5 * 1000)));
// because we flushed the entries this should not be a duplicate
this.EventLogger.checkEventOrder(this.channel, 'other-1', this.message_2);
status = this.EventLogger.checkEventOrder(this.channel, this.id_1, this.message_1);
return expect(status).to.be.undefined;
}); });
});
});