mirror of
https://github.com/balena-os/balena-supervisor.git
synced 2025-05-31 23:00:48 +00:00
logger: Add unit tests
Change-type: minor Signed-off-by: Petros Angelatos <petrosagg@gmail.com>
This commit is contained in:
parent
bba1da370b
commit
202362241c
@ -1,39 +1,106 @@
|
|||||||
|
https = require 'https'
|
||||||
|
stream = require 'stream'
|
||||||
|
zlib = require 'zlib'
|
||||||
|
|
||||||
|
Promise = require 'bluebird'
|
||||||
m = require 'mochainon'
|
m = require 'mochainon'
|
||||||
{ expect } = m.chai
|
{ expect } = m.chai
|
||||||
{ spy, useFakeTimers } = m.sinon
|
{ stub } = m.sinon
|
||||||
|
|
||||||
Logger = require '../src/logger'
|
Logger = require '../src/logger'
|
||||||
|
|
||||||
describe 'Logger', ->
|
describe 'Logger', ->
|
||||||
before ->
|
beforeEach ->
|
||||||
@fakeBinder = {
|
@_req = new stream.PassThrough()
|
||||||
logBatch: spy()
|
@_req.flushHeaders = m.sinon.spy()
|
||||||
}
|
@_req.end = m.sinon.spy()
|
||||||
|
|
||||||
|
@_req.body = ''
|
||||||
|
@_req
|
||||||
|
.pipe(zlib.createGunzip())
|
||||||
|
.on 'data', (chunk) =>
|
||||||
|
@_req.body += chunk
|
||||||
|
|
||||||
|
stub(https, 'request').returns(@_req)
|
||||||
|
|
||||||
@fakeEventTracker = {
|
@fakeEventTracker = {
|
||||||
track: spy()
|
track: m.sinon.spy()
|
||||||
}
|
}
|
||||||
@logger = new Logger({ eventTracker: @fakeEventTracker })
|
|
||||||
@logger.init({ pubnub: {}, channel: 'foo', offlineMode: 'false', enable: 'true', nativeLogger: 'true', apiBinder: @fakeBinder })
|
|
||||||
|
|
||||||
after ->
|
@logger = new Logger({eventTracker: @fakeEventTracker})
|
||||||
@logger.stop()
|
@logger.init({
|
||||||
|
apiEndpoint: 'https://example.com'
|
||||||
|
uuid: 'deadbeef'
|
||||||
|
deviceApiKey: 'secretkey'
|
||||||
|
offlineMode: false
|
||||||
|
})
|
||||||
|
|
||||||
it 'publishes logs to the resin API by default', (done) ->
|
afterEach ->
|
||||||
theTime = Date.now()
|
https.request.restore()
|
||||||
@logger.log(message: 'Hello!', timestamp: theTime)
|
|
||||||
setTimeout( =>
|
|
||||||
expect(@fakeBinder.logBatch).to.be.calledWith([ { message: 'Hello!', timestamp: theTime } ])
|
|
||||||
@fakeBinder.logBatch.reset()
|
|
||||||
done()
|
|
||||||
, 1020)
|
|
||||||
|
|
||||||
it 'allows logging system messages which are also reported to the eventTracker', (done) ->
|
it 'waits the grace period before sending any logs', ->
|
||||||
clock = useFakeTimers()
|
clock = m.sinon.useFakeTimers()
|
||||||
clock.tick(10)
|
@logger.log({message: 'foobar', serviceId: 15})
|
||||||
@logger.logSystemMessage('Hello there!', { someProp: 'someVal' }, 'Some event name')
|
clock.tick(4999)
|
||||||
clock.restore()
|
clock.restore()
|
||||||
setTimeout( =>
|
|
||||||
expect(@fakeBinder.logBatch).to.be.calledWith([ { message: 'Hello there!', timestamp: 10, isSystem: true } ])
|
Promise.delay(10)
|
||||||
|
.then =>
|
||||||
|
expect(@_req.body).to.equal('')
|
||||||
|
|
||||||
|
it 'tears down the connection after inactivity', ->
|
||||||
|
clock = m.sinon.useFakeTimers()
|
||||||
|
@logger.log({message: 'foobar', serviceId: 15})
|
||||||
|
clock.tick(61000)
|
||||||
|
clock.restore()
|
||||||
|
|
||||||
|
Promise.delay(10)
|
||||||
|
.then =>
|
||||||
|
expect(@_req.end.calledOnce).to.be.true
|
||||||
|
|
||||||
|
|
||||||
|
it 'sends logs as gzipped ndjson', ->
|
||||||
|
clock = m.sinon.useFakeTimers()
|
||||||
|
@logger.log({ message: 'foobar', serviceId: 15 })
|
||||||
|
@logger.log({ timestamp: 1337, message: 'foobar', serviceId: 15 })
|
||||||
|
@logger.log({ message: 'foobar' }) # shold be ignored
|
||||||
|
clock.tick(10000)
|
||||||
|
clock.restore()
|
||||||
|
|
||||||
|
expect(https.request.calledOnce).to.be.true
|
||||||
|
opts = https.request.firstCall.args[0]
|
||||||
|
|
||||||
|
expect(opts.href).to.equal('https://example.com/device/v2/deadbeef/log-stream')
|
||||||
|
expect(opts.method).to.equal('POST')
|
||||||
|
expect(opts.headers).to.deep.equal({
|
||||||
|
'Authorization': 'Bearer secretkey'
|
||||||
|
'Content-Type': 'application/x-ndjson'
|
||||||
|
'Content-Encoding': 'gzip'
|
||||||
|
})
|
||||||
|
|
||||||
|
# small delay for the streams to propagate data
|
||||||
|
Promise.delay(10)
|
||||||
|
.then =>
|
||||||
|
lines = @_req.body.split('\n')
|
||||||
|
expect(lines.length).to.equal(3)
|
||||||
|
expect(lines[2]).to.equal('')
|
||||||
|
|
||||||
|
msg = JSON.parse(lines[0])
|
||||||
|
expect(msg).to.deep.equal({ timestamp: 0, message: 'foobar', serviceId: 15 })
|
||||||
|
msg = JSON.parse(lines[1])
|
||||||
|
expect(msg).to.deep.equal({ timestamp: 1337, message: 'foobar', serviceId: 15 })
|
||||||
|
|
||||||
|
it 'allows logging system messages which are also reported to the eventTracker', ->
|
||||||
|
clock = m.sinon.useFakeTimers()
|
||||||
|
@logger.logSystemMessage('Hello there!', { someProp: 'someVal' }, 'Some event name')
|
||||||
|
clock.tick(10000)
|
||||||
|
clock.restore()
|
||||||
|
|
||||||
|
Promise.delay(10)
|
||||||
|
.then =>
|
||||||
expect(@fakeEventTracker.track).to.be.calledWith('Some event name', { someProp: 'someVal' })
|
expect(@fakeEventTracker.track).to.be.calledWith('Some event name', { someProp: 'someVal' })
|
||||||
done()
|
lines = @_req.body.split('\n')
|
||||||
, 1020)
|
expect(lines.length).to.equal(2)
|
||||||
|
expect(lines[1]).to.equal('')
|
||||||
|
|
||||||
|
msg = JSON.parse(lines[0])
|
||||||
|
expect(msg).to.deep.equal({ message: 'Hello there!', timestamp: 0, isSystem: true })
|
||||||
|
Loading…
x
Reference in New Issue
Block a user