EventLoggerTests.coffee 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. require('chai').should()
  2. expect = require("chai").expect
  3. SandboxedModule = require('sandboxed-module')
  4. modulePath = '../../../app/js/EventLogger'
  5. sinon = require("sinon")
  6. tk = require "timekeeper"
  7. describe 'EventLogger', ->
  8. beforeEach ->
  9. @start = Date.now()
  10. tk.freeze(new Date(@start))
  11. @EventLogger = SandboxedModule.require modulePath, requires:
  12. "logger-sharelatex": @logger = {error: sinon.stub(), warn: sinon.stub()}
  13. "metrics-sharelatex": @metrics = {inc: sinon.stub()}
  14. @channel = "applied-ops"
  15. @id_1 = "random-hostname:abc-1"
  16. @message_1 = "message-1"
  17. @id_2 = "random-hostname:abc-2"
  18. @message_2 = "message-2"
  19. afterEach ->
  20. tk.reset()
  21. describe 'checkEventOrder', ->
  22. describe 'when the events are in order', ->
  23. beforeEach ->
  24. @EventLogger.checkEventOrder(@channel, @id_1, @message_1)
  25. @status = @EventLogger.checkEventOrder(@channel, @id_2, @message_2)
  26. it 'should accept events in order', ->
  27. expect(@status).to.be.undefined
  28. it 'should increment the valid event metric', ->
  29. @metrics.inc.calledWith("event.#{@channel}.valid", 1)
  30. .should.equal.true
  31. describe 'when there is a duplicate events', ->
  32. beforeEach ->
  33. @EventLogger.checkEventOrder(@channel, @id_1, @message_1)
  34. @status = @EventLogger.checkEventOrder(@channel, @id_1, @message_1)
  35. it 'should return "duplicate" for the same event', ->
  36. expect(@status).to.equal "duplicate"
  37. it 'should increment the duplicate event metric', ->
  38. @metrics.inc.calledWith("event.#{@channel}.duplicate", 1)
  39. .should.equal.true
  40. describe 'when there are out of order events', ->
  41. beforeEach ->
  42. @EventLogger.checkEventOrder(@channel, @id_1, @message_1)
  43. @EventLogger.checkEventOrder(@channel, @id_2, @message_2)
  44. @status = @EventLogger.checkEventOrder(@channel, @id_1, @message_1)
  45. it 'should return "out-of-order" for the event', ->
  46. expect(@status).to.equal "out-of-order"
  47. it 'should increment the out-of-order event metric', ->
  48. @metrics.inc.calledWith("event.#{@channel}.out-of-order", 1)
  49. .should.equal.true
  50. describe 'after MAX_STALE_TIME_IN_MS', ->
  51. it 'should flush old entries', ->
  52. @EventLogger.MAX_EVENTS_BEFORE_CLEAN = 10
  53. @EventLogger.checkEventOrder(@channel, @id_1, @message_1)
  54. for i in [1..8]
  55. status = @EventLogger.checkEventOrder(@channel, @id_1, @message_1)
  56. expect(status).to.equal "duplicate"
  57. # the next event should flush the old entries aboce
  58. @EventLogger.MAX_STALE_TIME_IN_MS=1000
  59. tk.freeze(new Date(@start + 5 * 1000))
  60. # because we flushed the entries this should not be a duplicate
  61. @EventLogger.checkEventOrder(@channel, 'other-1', @message_2)
  62. status = @EventLogger.checkEventOrder(@channel, @id_1, @message_1)
  63. expect(status).to.be.undefined