overleaf/services/real-time/test/unit/coffee/EventLoggerTests.coffee
2019-03-22 11:20:38 +00:00

76 lines
No EOL
2.7 KiB
CoffeeScript

require('chai').should()
expect = require("chai").expect
SandboxedModule = require('sandboxed-module')
modulePath = '../../../app/js/EventLogger'
sinon = require("sinon")
tk = require "timekeeper"
describe 'EventLogger', ->
beforeEach ->
@start = Date.now()
tk.freeze(new Date(@start))
@EventLogger = SandboxedModule.require modulePath, requires:
"logger-sharelatex": @logger = {error: sinon.stub()}
"metrics-sharelatex": @metrics = {inc: sinon.stub()}
@channel = "applied-ops"
@id_1 = "random-hostname:abc-1"
@message_1 = "message-1"
@id_2 = "random-hostname:abc-2"
@message_2 = "message-2"
afterEach ->
tk.reset()
describe 'checkEventOrder', ->
describe 'when the events are in order', ->
beforeEach ->
@EventLogger.checkEventOrder(@channel, @id_1, @message_1)
@status = @EventLogger.checkEventOrder(@channel, @id_2, @message_2)
it 'should accept events in order', ->
expect(@status).to.be.undefined
it 'should increment the valid event metric', ->
@metrics.inc.calledWith("event.#{@channel}.valid", 1)
.should.equal.true
describe 'when there is a duplicate events', ->
beforeEach ->
@EventLogger.checkEventOrder(@channel, @id_1, @message_1)
@status = @EventLogger.checkEventOrder(@channel, @id_1, @message_1)
it 'should return "duplicate" for the same event', ->
expect(@status).to.equal "duplicate"
it 'should increment the duplicate event metric', ->
@metrics.inc.calledWith("event.#{@channel}.duplicate", 1)
.should.equal.true
describe 'when there are out of order events', ->
beforeEach ->
@EventLogger.checkEventOrder(@channel, @id_1, @message_1)
@EventLogger.checkEventOrder(@channel, @id_2, @message_2)
@status = @EventLogger.checkEventOrder(@channel, @id_1, @message_1)
it 'should return "out-of-order" for the event', ->
expect(@status).to.equal "out-of-order"
it 'should increment the out-of-order event metric', ->
@metrics.inc.calledWith("event.#{@channel}.out-of-order", 1)
.should.equal.true
describe 'after MAX_STALE_TIME_IN_MS', ->
it 'should flush old entries', ->
@EventLogger.MAX_EVENTS_BEFORE_CLEAN = 10
@EventLogger.checkEventOrder(@channel, @id_1, @message_1)
for i in [1..8]
status = @EventLogger.checkEventOrder(@channel, @id_1, @message_1)
expect(status).to.equal "duplicate"
# the next event should flush the old entries aboce
@EventLogger.MAX_STALE_TIME_IN_MS=1000
tk.freeze(new Date(@start + 5 * 1000))
# because we flushed the entries this should not be a duplicate
@EventLogger.checkEventOrder(@channel, 'other-1', @message_2)
status = @EventLogger.checkEventOrder(@channel, @id_1, @message_1)
expect(status).to.be.undefined