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
						
					
					
				| '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')
 | |
| })
 |