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.
		
		
		
		
		
			
		
			
				
					183 lines
				
				5.6 KiB
			
		
		
			
		
	
	
					183 lines
				
				5.6 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'use strict'
							 | 
						||
| 
								 | 
							
								const pino = require('..')
							 | 
						||
| 
								 | 
							
								const fs = require('fs')
							 | 
						||
| 
								 | 
							
								const { test } = require('tap')
							 | 
						||
| 
								 | 
							
								const { sleep, getPathToNull } = require('./helper')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('replaces onTerminated option', async ({ throws }) => {
							 | 
						||
| 
								 | 
							
								  throws(() => {
							 | 
						||
| 
								 | 
							
								    pino({
							 | 
						||
| 
								 | 
							
								      onTerminated: () => {}
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								  }, Error('The onTerminated option has been removed, use pino.final instead'))
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('throws if not supplied a logger instance', async ({ throws }) => {
							 | 
						||
| 
								 | 
							
								  throws(() => {
							 | 
						||
| 
								 | 
							
								    pino.final()
							 | 
						||
| 
								 | 
							
								  }, Error('expected a pino logger instance'))
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('throws if the supplied handler is not a function', async ({ throws }) => {
							 | 
						||
| 
								 | 
							
								  throws(() => {
							 | 
						||
| 
								 | 
							
								    pino.final(pino(), 'dummy')
							 | 
						||
| 
								 | 
							
								  }, Error('if supplied, the handler parameter should be a function'))
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('throws if not supplied logger with pino.destination instance with sync false', async ({ throws, doesNotThrow }) => {
							 | 
						||
| 
								 | 
							
								  throws(() => {
							 | 
						||
| 
								 | 
							
								    pino.final(pino(fs.createWriteStream(getPathToNull())), () => {})
							 | 
						||
| 
								 | 
							
								  }, Error('final requires a stream that has a flushSync method, such as pino.destination'))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  doesNotThrow(() => {
							 | 
						||
| 
								 | 
							
								    pino.final(pino(pino.destination({ sync: false })), () => {})
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  doesNotThrow(() => {
							 | 
						||
| 
								 | 
							
								    pino.final(pino(pino.destination({ sync: false })), () => {})
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('returns an exit listener function', async ({ equal }) => {
							 | 
						||
| 
								 | 
							
								  equal(typeof pino.final(pino(pino.destination({ sync: false })), () => {}), 'function')
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('listener function immediately sync flushes when fired (sync false)', async ({ pass, fail }) => {
							 | 
						||
| 
								 | 
							
								  const dest = pino.destination({ dest: getPathToNull(), sync: false })
							 | 
						||
| 
								 | 
							
								  let passed = false
							 | 
						||
| 
								 | 
							
								  dest.flushSync = () => {
							 | 
						||
| 
								 | 
							
								    passed = true
							 | 
						||
| 
								 | 
							
								    pass('flushSync called')
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  pino.final(pino(dest), () => {})()
							 | 
						||
| 
								 | 
							
								  await sleep(10)
							 | 
						||
| 
								 | 
							
								  if (passed === false) fail('flushSync not called')
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('listener function immediately sync flushes when fired (sync true)', async ({ pass, fail }) => {
							 | 
						||
| 
								 | 
							
								  const dest = pino.destination({ dest: getPathToNull(), sync: true })
							 | 
						||
| 
								 | 
							
								  let passed = false
							 | 
						||
| 
								 | 
							
								  dest.flushSync = () => {
							 | 
						||
| 
								 | 
							
								    passed = true
							 | 
						||
| 
								 | 
							
								    pass('flushSync called')
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  pino.final(pino(dest), () => {})()
							 | 
						||
| 
								 | 
							
								  await sleep(10)
							 | 
						||
| 
								 | 
							
								  if (passed === false) fail('flushSync not called')
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('swallows the non-ready error', async ({ doesNotThrow }) => {
							 | 
						||
| 
								 | 
							
								  const dest = pino.destination({ dest: getPathToNull(), sync: false })
							 | 
						||
| 
								 | 
							
								  doesNotThrow(() => {
							 | 
						||
| 
								 | 
							
								    pino.final(pino(dest), () => {})()
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('listener function triggers handler function parameter', async ({ pass, fail }) => {
							 | 
						||
| 
								 | 
							
								  const dest = pino.destination({ dest: getPathToNull(), sync: false })
							 | 
						||
| 
								 | 
							
								  let passed = false
							 | 
						||
| 
								 | 
							
								  pino.final(pino(dest), () => {
							 | 
						||
| 
								 | 
							
								    passed = true
							 | 
						||
| 
								 | 
							
								    pass('handler function triggered')
							 | 
						||
| 
								 | 
							
								  })()
							 | 
						||
| 
								 | 
							
								  await sleep(10)
							 | 
						||
| 
								 | 
							
								  if (passed === false) fail('handler function not triggered')
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('passes any error to the handler', async ({ equal }) => {
							 | 
						||
| 
								 | 
							
								  const dest = pino.destination({ dest: getPathToNull(), sync: false })
							 | 
						||
| 
								 | 
							
								  pino.final(pino(dest), (err) => {
							 | 
						||
| 
								 | 
							
								    equal(err.message, 'test')
							 | 
						||
| 
								 | 
							
								  })(Error('test'))
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('passes a specialized final logger instance', async ({ equal, not, error }) => {
							 | 
						||
| 
								 | 
							
								  const dest = pino.destination({ dest: getPathToNull(), sync: false })
							 | 
						||
| 
								 | 
							
								  const logger = pino(dest)
							 | 
						||
| 
								 | 
							
								  pino.final(logger, (err, finalLogger) => {
							 | 
						||
| 
								 | 
							
								    error(err)
							 | 
						||
| 
								 | 
							
								    equal(typeof finalLogger.trace, 'function')
							 | 
						||
| 
								 | 
							
								    equal(typeof finalLogger.debug, 'function')
							 | 
						||
| 
								 | 
							
								    equal(typeof finalLogger.info, 'function')
							 | 
						||
| 
								 | 
							
								    equal(typeof finalLogger.warn, 'function')
							 | 
						||
| 
								 | 
							
								    equal(typeof finalLogger.error, 'function')
							 | 
						||
| 
								 | 
							
								    equal(typeof finalLogger.fatal, 'function')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    not(finalLogger.trace, logger.trace)
							 | 
						||
| 
								 | 
							
								    not(finalLogger.debug, logger.debug)
							 | 
						||
| 
								 | 
							
								    not(finalLogger.info, logger.info)
							 | 
						||
| 
								 | 
							
								    not(finalLogger.warn, logger.warn)
							 | 
						||
| 
								 | 
							
								    not(finalLogger.error, logger.error)
							 | 
						||
| 
								 | 
							
								    not(finalLogger.fatal, logger.fatal)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    equal(finalLogger.child, logger.child)
							 | 
						||
| 
								 | 
							
								    equal(finalLogger.levels, logger.levels)
							 | 
						||
| 
								 | 
							
								  })()
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('returns a specialized final logger instance if no handler is passed', async ({ equal, not }) => {
							 | 
						||
| 
								 | 
							
								  const dest = pino.destination({ dest: getPathToNull(), sync: false })
							 | 
						||
| 
								 | 
							
								  const logger = pino(dest)
							 | 
						||
| 
								 | 
							
								  const finalLogger = pino.final(logger)
							 | 
						||
| 
								 | 
							
								  equal(typeof finalLogger.trace, 'function')
							 | 
						||
| 
								 | 
							
								  equal(typeof finalLogger.debug, 'function')
							 | 
						||
| 
								 | 
							
								  equal(typeof finalLogger.info, 'function')
							 | 
						||
| 
								 | 
							
								  equal(typeof finalLogger.warn, 'function')
							 | 
						||
| 
								 | 
							
								  equal(typeof finalLogger.error, 'function')
							 | 
						||
| 
								 | 
							
								  equal(typeof finalLogger.fatal, 'function')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  not(finalLogger.trace, logger.trace)
							 | 
						||
| 
								 | 
							
								  not(finalLogger.debug, logger.debug)
							 | 
						||
| 
								 | 
							
								  not(finalLogger.info, logger.info)
							 | 
						||
| 
								 | 
							
								  not(finalLogger.warn, logger.warn)
							 | 
						||
| 
								 | 
							
								  not(finalLogger.error, logger.error)
							 | 
						||
| 
								 | 
							
								  not(finalLogger.fatal, logger.fatal)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  equal(finalLogger.child, logger.child)
							 | 
						||
| 
								 | 
							
								  equal(finalLogger.levels, logger.levels)
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('final logger instances synchronously flush after a log method call', async ({ pass, fail, error }) => {
							 | 
						||
| 
								 | 
							
								  const dest = pino.destination({ dest: getPathToNull(), sync: false })
							 | 
						||
| 
								 | 
							
								  const logger = pino(dest)
							 | 
						||
| 
								 | 
							
								  let passed = false
							 | 
						||
| 
								 | 
							
								  let count = 0
							 | 
						||
| 
								 | 
							
								  dest.flushSync = () => {
							 | 
						||
| 
								 | 
							
								    count++
							 | 
						||
| 
								 | 
							
								    if (count === 2) {
							 | 
						||
| 
								 | 
							
								      passed = true
							 | 
						||
| 
								 | 
							
								      pass('flushSync called')
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  pino.final(logger, (err, finalLogger) => {
							 | 
						||
| 
								 | 
							
								    error(err)
							 | 
						||
| 
								 | 
							
								    finalLogger.info('hello')
							 | 
						||
| 
								 | 
							
								  })()
							 | 
						||
| 
								 | 
							
								  await sleep(10)
							 | 
						||
| 
								 | 
							
								  if (passed === false) fail('flushSync not called')
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('also instruments custom log methods', async ({ pass, fail, error }) => {
							 | 
						||
| 
								 | 
							
								  const dest = pino.destination({ dest: getPathToNull(), sync: false })
							 | 
						||
| 
								 | 
							
								  const logger = pino({
							 | 
						||
| 
								 | 
							
								    customLevels: {
							 | 
						||
| 
								 | 
							
								      foo: 35
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }, dest)
							 | 
						||
| 
								 | 
							
								  let passed = false
							 | 
						||
| 
								 | 
							
								  let count = 0
							 | 
						||
| 
								 | 
							
								  dest.flushSync = () => {
							 | 
						||
| 
								 | 
							
								    count++
							 | 
						||
| 
								 | 
							
								    if (count === 2) {
							 | 
						||
| 
								 | 
							
								      passed = true
							 | 
						||
| 
								 | 
							
								      pass('flushSync called')
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  pino.final(logger, (err, finalLogger) => {
							 | 
						||
| 
								 | 
							
								    error(err)
							 | 
						||
| 
								 | 
							
								    finalLogger.foo('hello')
							 | 
						||
| 
								 | 
							
								  })()
							 | 
						||
| 
								 | 
							
								  await sleep(10)
							 | 
						||
| 
								 | 
							
								  if (passed === false) fail('flushSync not called')
							 | 
						||
| 
								 | 
							
								})
							 |