You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							438 lines
						
					
					
						
							9.2 KiB
						
					
					
				
			
		
		
	
	
							438 lines
						
					
					
						
							9.2 KiB
						
					
					
				| 'use strict'
 | |
| 
 | |
| const { once } = require('events')
 | |
| const { Transform, pipeline } = require('stream')
 | |
| 
 | |
| const { test } = require('tap')
 | |
| const build = require('../')
 | |
| 
 | |
| test('parse newlined delimited JSON', ({ same, plan }) => {
 | |
|   plan(2)
 | |
|   const expected = [{
 | |
|     level: 30,
 | |
|     time: 1617955768092,
 | |
|     pid: 2942,
 | |
|     hostname: 'MacBook-Pro.local',
 | |
|     msg: 'hello world'
 | |
|   }, {
 | |
|     level: 30,
 | |
|     time: 1617955768092,
 | |
|     pid: 2942,
 | |
|     hostname: 'MacBook-Pro.local',
 | |
|     msg: 'another message',
 | |
|     prop: 42
 | |
|   }]
 | |
| 
 | |
|   const stream = build(function (source) {
 | |
|     source.on('data', function (line) {
 | |
|       same(expected.shift(), line)
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   const lines = expected.map(JSON.stringify).join('\n')
 | |
|   stream.write(lines)
 | |
|   stream.end()
 | |
| })
 | |
| 
 | |
| test('parse newlined delimited JSON', ({ same, plan }) => {
 | |
|   plan(2)
 | |
|   const expected = [{
 | |
|     level: 30,
 | |
|     time: 1617955768092,
 | |
|     pid: 2942,
 | |
|     hostname: 'MacBook-Pro.local',
 | |
|     msg: 'hello world'
 | |
|   }, {
 | |
|     level: 30,
 | |
|     time: 1617955768092,
 | |
|     pid: 2942,
 | |
|     hostname: 'MacBook-Pro.local',
 | |
|     msg: 'another message',
 | |
|     prop: 42
 | |
|   }]
 | |
| 
 | |
|   const stream = build(function (source) {
 | |
|     source.on('data', function (line) {
 | |
|       same(expected.shift(), line)
 | |
|     })
 | |
|   }, { parse: 'json' })
 | |
| 
 | |
|   const lines = expected.map(JSON.stringify).join('\n')
 | |
|   stream.write(lines)
 | |
|   stream.end()
 | |
| })
 | |
| 
 | |
| test('null support', ({ same, plan }) => {
 | |
|   plan(1)
 | |
|   const stream = build(function (source) {
 | |
|     source.on('unknown', function (line) {
 | |
|       same('null', line)
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   stream.write('null\n')
 | |
|   stream.end()
 | |
| })
 | |
| 
 | |
| test('broken json', ({ same, plan }) => {
 | |
|   plan(2)
 | |
|   const expected = '{ "truncated'
 | |
|   const stream = build(function (source) {
 | |
|     source.on('unknown', function (line, error) {
 | |
|       same(expected, line)
 | |
|       same(error.message, 'Unexpected end of JSON input')
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   stream.write(expected + '\n')
 | |
|   stream.end()
 | |
| })
 | |
| 
 | |
| test('pure values', ({ same, ok, plan }) => {
 | |
|   plan(3)
 | |
|   const stream = build(function (source) {
 | |
|     source.on('data', function (line) {
 | |
|       same(line.data, 42)
 | |
|       ok(line.time)
 | |
|       same(new Date(line.time).getTime(), line.time)
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   stream.write('42\n')
 | |
|   stream.end()
 | |
| })
 | |
| 
 | |
| test('support async iteration', ({ same, plan }) => {
 | |
|   plan(2)
 | |
|   const expected = [{
 | |
|     level: 30,
 | |
|     time: 1617955768092,
 | |
|     pid: 2942,
 | |
|     hostname: 'MacBook-Pro.local',
 | |
|     msg: 'hello world'
 | |
|   }, {
 | |
|     level: 30,
 | |
|     time: 1617955768092,
 | |
|     pid: 2942,
 | |
|     hostname: 'MacBook-Pro.local',
 | |
|     msg: 'another message',
 | |
|     prop: 42
 | |
|   }]
 | |
| 
 | |
|   const stream = build(async function (source) {
 | |
|     for await (const line of source) {
 | |
|       same(expected.shift(), line)
 | |
|     }
 | |
|   })
 | |
| 
 | |
|   const lines = expected.map(JSON.stringify).join('\n')
 | |
|   stream.write(lines)
 | |
|   stream.end()
 | |
| })
 | |
| 
 | |
| test('rejecting errors the stream', async ({ same, plan }) => {
 | |
|   const stream = build(async function (source) {
 | |
|     throw new Error('kaboom')
 | |
|   })
 | |
| 
 | |
|   const [err] = await once(stream, 'error')
 | |
|   same(err.message, 'kaboom')
 | |
| })
 | |
| 
 | |
| test('set metadata', ({ same, plan, equal }) => {
 | |
|   plan(9)
 | |
| 
 | |
|   const expected = [{
 | |
|     level: 30,
 | |
|     time: 1617955768092,
 | |
|     pid: 2942,
 | |
|     hostname: 'MacBook-Pro.local',
 | |
|     msg: 'hello world'
 | |
|   }, {
 | |
|     level: 30,
 | |
|     time: 1617955768092,
 | |
|     pid: 2942,
 | |
|     hostname: 'MacBook-Pro.local',
 | |
|     msg: 'another message',
 | |
|     prop: 42
 | |
|   }]
 | |
| 
 | |
|   const stream = build(function (source) {
 | |
|     source.on('data', function (line) {
 | |
|       const obj = expected.shift()
 | |
|       same(this.lastLevel, obj.level)
 | |
|       same(this.lastTime, obj.time)
 | |
|       same(this.lastObj, obj)
 | |
|       same(obj, line)
 | |
|     })
 | |
|   }, { metadata: true })
 | |
| 
 | |
|   equal(stream[Symbol.for('pino.metadata')], true)
 | |
|   const lines = expected.map(JSON.stringify).join('\n')
 | |
|   stream.write(lines)
 | |
|   stream.end()
 | |
| })
 | |
| 
 | |
| test('parse lines', ({ same, plan, equal }) => {
 | |
|   plan(9)
 | |
| 
 | |
|   const expected = [{
 | |
|     level: 30,
 | |
|     time: 1617955768092,
 | |
|     pid: 2942,
 | |
|     hostname: 'MacBook-Pro.local',
 | |
|     msg: 'hello world'
 | |
|   }, {
 | |
|     level: 30,
 | |
|     time: 1617955768092,
 | |
|     pid: 2942,
 | |
|     hostname: 'MacBook-Pro.local',
 | |
|     msg: 'another message',
 | |
|     prop: 42
 | |
|   }]
 | |
| 
 | |
|   const stream = build(function (source) {
 | |
|     source.on('data', function (line) {
 | |
|       const obj = expected.shift()
 | |
|       same(this.lastLevel, obj.level)
 | |
|       same(this.lastTime, obj.time)
 | |
|       same(this.lastObj, obj)
 | |
|       same(JSON.stringify(obj), line)
 | |
|     })
 | |
|   }, { metadata: true, parse: 'lines' })
 | |
| 
 | |
|   equal(stream[Symbol.for('pino.metadata')], true)
 | |
|   const lines = expected.map(JSON.stringify).join('\n')
 | |
|   stream.write(lines)
 | |
|   stream.end()
 | |
| })
 | |
| 
 | |
| test('custom parse line function', ({ same, plan, equal }) => {
 | |
|   plan(11)
 | |
| 
 | |
|   const expected = [{
 | |
|     level: 30,
 | |
|     time: 1617955768092,
 | |
|     pid: 2942,
 | |
|     hostname: 'MacBook-Pro.local',
 | |
|     msg: 'hello world'
 | |
|   }, {
 | |
|     level: 30,
 | |
|     time: 1617955768092,
 | |
|     pid: 2942,
 | |
|     hostname: 'MacBook-Pro.local',
 | |
|     msg: 'another message',
 | |
|     prop: 42
 | |
|   }]
 | |
|   let num = 0
 | |
| 
 | |
|   function parseLine (str) {
 | |
|     const obj = JSON.parse(str)
 | |
|     same(expected[num], obj)
 | |
|     return obj
 | |
|   }
 | |
| 
 | |
|   const stream = build(function (source) {
 | |
|     source.on('data', function (line) {
 | |
|       const obj = expected[num]
 | |
|       same(this.lastLevel, obj.level)
 | |
|       same(this.lastTime, obj.time)
 | |
|       same(this.lastObj, obj)
 | |
|       same(obj, line)
 | |
|       num++
 | |
|     })
 | |
|   }, { metadata: true, parseLine })
 | |
| 
 | |
|   equal(stream[Symbol.for('pino.metadata')], true)
 | |
|   const lines = expected.map(JSON.stringify).join('\n')
 | |
|   stream.write(lines)
 | |
|   stream.end()
 | |
| })
 | |
| 
 | |
| test('set metadata (default)', ({ same, plan, equal }) => {
 | |
|   plan(9)
 | |
| 
 | |
|   const expected = [{
 | |
|     level: 30,
 | |
|     time: 1617955768092,
 | |
|     pid: 2942,
 | |
|     hostname: 'MacBook-Pro.local',
 | |
|     msg: 'hello world'
 | |
|   }, {
 | |
|     level: 30,
 | |
|     time: 1617955768092,
 | |
|     pid: 2942,
 | |
|     hostname: 'MacBook-Pro.local',
 | |
|     msg: 'another message',
 | |
|     prop: 42
 | |
|   }]
 | |
| 
 | |
|   const stream = build(function (source) {
 | |
|     source.on('data', function (line) {
 | |
|       const obj = expected.shift()
 | |
|       same(this.lastLevel, obj.level)
 | |
|       same(this.lastTime, obj.time)
 | |
|       same(this.lastObj, obj)
 | |
|       same(obj, line)
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   equal(stream[Symbol.for('pino.metadata')], true)
 | |
|   const lines = expected.map(JSON.stringify).join('\n')
 | |
|   stream.write(lines)
 | |
|   stream.end()
 | |
| })
 | |
| 
 | |
| test('do not set metadata', ({ same, plan, equal }) => {
 | |
|   plan(9)
 | |
| 
 | |
|   const expected = [{
 | |
|     level: 30,
 | |
|     time: 1617955768092,
 | |
|     pid: 2942,
 | |
|     hostname: 'MacBook-Pro.local',
 | |
|     msg: 'hello world'
 | |
|   }, {
 | |
|     level: 30,
 | |
|     time: 1617955768092,
 | |
|     pid: 2942,
 | |
|     hostname: 'MacBook-Pro.local',
 | |
|     msg: 'another message',
 | |
|     prop: 42
 | |
|   }]
 | |
| 
 | |
|   const stream = build(function (source) {
 | |
|     source.on('data', function (line) {
 | |
|       const obj = expected.shift()
 | |
|       same(this.lastLevel, undefined)
 | |
|       same(this.lastTime, undefined)
 | |
|       same(this.lastObj, undefined)
 | |
|       same(obj, line)
 | |
|     })
 | |
|   }, { metadata: false })
 | |
| 
 | |
|   equal(stream[Symbol.for('pino.metadata')], undefined)
 | |
|   const lines = expected.map(JSON.stringify).join('\n')
 | |
|   stream.write(lines)
 | |
|   stream.end()
 | |
| })
 | |
| 
 | |
| test('close logic', ({ same, plan, pass }) => {
 | |
|   plan(3)
 | |
|   const expected = [{
 | |
|     level: 30,
 | |
|     time: 1617955768092,
 | |
|     pid: 2942,
 | |
|     hostname: 'MacBook-Pro.local',
 | |
|     msg: 'hello world'
 | |
|   }, {
 | |
|     level: 30,
 | |
|     time: 1617955768092,
 | |
|     pid: 2942,
 | |
|     hostname: 'MacBook-Pro.local',
 | |
|     msg: 'another message',
 | |
|     prop: 42
 | |
|   }]
 | |
| 
 | |
|   const stream = build(function (source) {
 | |
|     source.on('data', function (line) {
 | |
|       same(expected.shift(), line)
 | |
|     })
 | |
|   }, {
 | |
|     close (err, cb) {
 | |
|       pass('close called')
 | |
|       process.nextTick(cb, err)
 | |
|     }
 | |
|   })
 | |
| 
 | |
|   const lines = expected.map(JSON.stringify).join('\n')
 | |
|   stream.write(lines)
 | |
|   stream.end()
 | |
| })
 | |
| 
 | |
| test('close with promises', ({ same, plan, pass }) => {
 | |
|   plan(3)
 | |
|   const expected = [{
 | |
|     level: 30,
 | |
|     time: 1617955768092,
 | |
|     pid: 2942,
 | |
|     hostname: 'MacBook-Pro.local',
 | |
|     msg: 'hello world'
 | |
|   }, {
 | |
|     level: 30,
 | |
|     time: 1617955768092,
 | |
|     pid: 2942,
 | |
|     hostname: 'MacBook-Pro.local',
 | |
|     msg: 'another message',
 | |
|     prop: 42
 | |
|   }]
 | |
| 
 | |
|   const stream = build(function (source) {
 | |
|     source.on('data', function (line) {
 | |
|       same(expected.shift(), line)
 | |
|     })
 | |
|   }, {
 | |
|     async close () {
 | |
|       pass('close called')
 | |
|     }
 | |
|   })
 | |
| 
 | |
|   const lines = expected.map(JSON.stringify).join('\n')
 | |
|   stream.write(lines)
 | |
|   stream.end()
 | |
| })
 | |
| 
 | |
| test('support Transform streams', ({ same, plan, error }) => {
 | |
|   plan(7)
 | |
| 
 | |
|   const expected1 = [{
 | |
|     level: 30,
 | |
|     time: 1617955768092,
 | |
|     pid: 2942,
 | |
|     hostname: 'MacBook-Pro.local',
 | |
|     msg: 'hello world'
 | |
|   }, {
 | |
|     level: 30,
 | |
|     time: 1617955768092,
 | |
|     pid: 2942,
 | |
|     hostname: 'MacBook-Pro.local',
 | |
|     msg: 'another message',
 | |
|     prop: 42
 | |
|   }]
 | |
| 
 | |
|   const expected2 = []
 | |
| 
 | |
|   const stream1 = build(function (source) {
 | |
|     const transform = new Transform({
 | |
|       objectMode: true,
 | |
|       autoDestroy: true,
 | |
|       transform (chunk, enc, cb) {
 | |
|         same(expected1.shift(), chunk)
 | |
|         chunk.service = 'from transform'
 | |
|         expected2.push(chunk)
 | |
|         cb(null, JSON.stringify(chunk) + '\n')
 | |
|       }
 | |
|     })
 | |
| 
 | |
|     pipeline(source, transform, () => {})
 | |
| 
 | |
|     return transform
 | |
|   }, { enablePipelining: true })
 | |
| 
 | |
|   const stream2 = build(function (source) {
 | |
|     source.on('data', function (line) {
 | |
|       same(expected2.shift(), line)
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   pipeline(stream1, stream2, function (err) {
 | |
|     error(err)
 | |
|     same(expected1, [])
 | |
|     same(expected2, [])
 | |
|   })
 | |
| 
 | |
|   const lines = expected1.map(JSON.stringify).join('\n')
 | |
|   stream1.write(lines)
 | |
|   stream1.end()
 | |
| })
 |