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.
		
		
		
		
		
			
		
			
				
					350 lines
				
				7.7 KiB
			
		
		
			
		
	
	
					350 lines
				
				7.7 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'use strict'
							 | 
						||
| 
								 | 
							
								const test = require('tape')
							 | 
						||
| 
								 | 
							
								const pino = require('../browser')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function noop () {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('throws if transmit object does not have send function', ({ end, throws }) => {
							 | 
						||
| 
								 | 
							
								  throws(() => {
							 | 
						||
| 
								 | 
							
								    pino({ browser: { transmit: {} } })
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  throws(() => {
							 | 
						||
| 
								 | 
							
								    pino({ browser: { transmit: { send: 'not a func' } } })
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  end()
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('calls send function after write', ({ end, is }) => {
							 | 
						||
| 
								 | 
							
								  let c = 0
							 | 
						||
| 
								 | 
							
								  const logger = pino({
							 | 
						||
| 
								 | 
							
								    browser: {
							 | 
						||
| 
								 | 
							
								      write: () => {
							 | 
						||
| 
								 | 
							
								        c++
							 | 
						||
| 
								 | 
							
								      },
							 | 
						||
| 
								 | 
							
								      transmit: {
							 | 
						||
| 
								 | 
							
								        send () { is(c, 1) }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  logger.fatal({ test: 'test' })
							 | 
						||
| 
								 | 
							
								  end()
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('passes send function the logged level', ({ end, is }) => {
							 | 
						||
| 
								 | 
							
								  const logger = pino({
							 | 
						||
| 
								 | 
							
								    browser: {
							 | 
						||
| 
								 | 
							
								      write () {},
							 | 
						||
| 
								 | 
							
								      transmit: {
							 | 
						||
| 
								 | 
							
								        send (level) {
							 | 
						||
| 
								 | 
							
								          is(level, 'fatal')
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  logger.fatal({ test: 'test' })
							 | 
						||
| 
								 | 
							
								  end()
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('passes send function message strings in logEvent object when asObject is not set', ({ end, same, is }) => {
							 | 
						||
| 
								 | 
							
								  const logger = pino({
							 | 
						||
| 
								 | 
							
								    browser: {
							 | 
						||
| 
								 | 
							
								      write: noop,
							 | 
						||
| 
								 | 
							
								      transmit: {
							 | 
						||
| 
								 | 
							
								        send (level, { messages }) {
							 | 
						||
| 
								 | 
							
								          is(messages[0], 'test')
							 | 
						||
| 
								 | 
							
								          is(messages[1], 'another test')
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  logger.fatal('test', 'another test')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  end()
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('passes send function message objects in logEvent object when asObject is not set', ({ end, same, is }) => {
							 | 
						||
| 
								 | 
							
								  const logger = pino({
							 | 
						||
| 
								 | 
							
								    browser: {
							 | 
						||
| 
								 | 
							
								      write: noop,
							 | 
						||
| 
								 | 
							
								      transmit: {
							 | 
						||
| 
								 | 
							
								        send (level, { messages }) {
							 | 
						||
| 
								 | 
							
								          same(messages[0], { test: 'test' })
							 | 
						||
| 
								 | 
							
								          is(messages[1], 'another test')
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  logger.fatal({ test: 'test' }, 'another test')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  end()
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('passes send function message strings in logEvent object when asObject is set', ({ end, same, is }) => {
							 | 
						||
| 
								 | 
							
								  const logger = pino({
							 | 
						||
| 
								 | 
							
								    browser: {
							 | 
						||
| 
								 | 
							
								      asObject: true,
							 | 
						||
| 
								 | 
							
								      write: noop,
							 | 
						||
| 
								 | 
							
								      transmit: {
							 | 
						||
| 
								 | 
							
								        send (level, { messages }) {
							 | 
						||
| 
								 | 
							
								          is(messages[0], 'test')
							 | 
						||
| 
								 | 
							
								          is(messages[1], 'another test')
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  logger.fatal('test', 'another test')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  end()
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('passes send function message objects in logEvent object when asObject is set', ({ end, same, is }) => {
							 | 
						||
| 
								 | 
							
								  const logger = pino({
							 | 
						||
| 
								 | 
							
								    browser: {
							 | 
						||
| 
								 | 
							
								      asObject: true,
							 | 
						||
| 
								 | 
							
								      write: noop,
							 | 
						||
| 
								 | 
							
								      transmit: {
							 | 
						||
| 
								 | 
							
								        send (level, { messages }) {
							 | 
						||
| 
								 | 
							
								          same(messages[0], { test: 'test' })
							 | 
						||
| 
								 | 
							
								          is(messages[1], 'another test')
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  logger.fatal({ test: 'test' }, 'another test')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  end()
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('supplies a timestamp (ts) in logEvent object which is exactly the same as the `time` property in asObject mode', ({ end, is }) => {
							 | 
						||
| 
								 | 
							
								  let expected
							 | 
						||
| 
								 | 
							
								  const logger = pino({
							 | 
						||
| 
								 | 
							
								    browser: {
							 | 
						||
| 
								 | 
							
								      asObject: true, // implicit because `write`, but just to be explicit
							 | 
						||
| 
								 | 
							
								      write (o) {
							 | 
						||
| 
								 | 
							
								        expected = o.time
							 | 
						||
| 
								 | 
							
								      },
							 | 
						||
| 
								 | 
							
								      transmit: {
							 | 
						||
| 
								 | 
							
								        send (level, logEvent) {
							 | 
						||
| 
								 | 
							
								          is(logEvent.ts, expected)
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  logger.fatal('test')
							 | 
						||
| 
								 | 
							
								  end()
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('passes send function child bindings via logEvent object', ({ end, same, is }) => {
							 | 
						||
| 
								 | 
							
								  const logger = pino({
							 | 
						||
| 
								 | 
							
								    browser: {
							 | 
						||
| 
								 | 
							
								      write: noop,
							 | 
						||
| 
								 | 
							
								      transmit: {
							 | 
						||
| 
								 | 
							
								        send (level, logEvent) {
							 | 
						||
| 
								 | 
							
								          const messages = logEvent.messages
							 | 
						||
| 
								 | 
							
								          const bindings = logEvent.bindings
							 | 
						||
| 
								 | 
							
								          same(bindings[0], { first: 'binding' })
							 | 
						||
| 
								 | 
							
								          same(bindings[1], { second: 'binding2' })
							 | 
						||
| 
								 | 
							
								          same(messages[0], { test: 'test' })
							 | 
						||
| 
								 | 
							
								          is(messages[1], 'another test')
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  logger
							 | 
						||
| 
								 | 
							
								    .child({ first: 'binding' })
							 | 
						||
| 
								 | 
							
								    .child({ second: 'binding2' })
							 | 
						||
| 
								 | 
							
								    .fatal({ test: 'test' }, 'another test')
							 | 
						||
| 
								 | 
							
								  end()
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('passes send function level:{label, value} via logEvent object', ({ end, is }) => {
							 | 
						||
| 
								 | 
							
								  const logger = pino({
							 | 
						||
| 
								 | 
							
								    browser: {
							 | 
						||
| 
								 | 
							
								      write: noop,
							 | 
						||
| 
								 | 
							
								      transmit: {
							 | 
						||
| 
								 | 
							
								        send (level, logEvent) {
							 | 
						||
| 
								 | 
							
								          const label = logEvent.level.label
							 | 
						||
| 
								 | 
							
								          const value = logEvent.level.value
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          is(label, 'fatal')
							 | 
						||
| 
								 | 
							
								          is(value, 60)
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  logger.fatal({ test: 'test' }, 'another test')
							 | 
						||
| 
								 | 
							
								  end()
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('calls send function according to transmit.level', ({ end, is }) => {
							 | 
						||
| 
								 | 
							
								  let c = 0
							 | 
						||
| 
								 | 
							
								  const logger = pino({
							 | 
						||
| 
								 | 
							
								    browser: {
							 | 
						||
| 
								 | 
							
								      write: noop,
							 | 
						||
| 
								 | 
							
								      transmit: {
							 | 
						||
| 
								 | 
							
								        level: 'error',
							 | 
						||
| 
								 | 
							
								        send (level) {
							 | 
						||
| 
								 | 
							
								          c++
							 | 
						||
| 
								 | 
							
								          if (c === 1) is(level, 'error')
							 | 
						||
| 
								 | 
							
								          if (c === 2) is(level, 'fatal')
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  logger.warn('ignored')
							 | 
						||
| 
								 | 
							
								  logger.error('test')
							 | 
						||
| 
								 | 
							
								  logger.fatal('test')
							 | 
						||
| 
								 | 
							
								  end()
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('transmit.level defaults to logger level', ({ end, is }) => {
							 | 
						||
| 
								 | 
							
								  let c = 0
							 | 
						||
| 
								 | 
							
								  const logger = pino({
							 | 
						||
| 
								 | 
							
								    level: 'error',
							 | 
						||
| 
								 | 
							
								    browser: {
							 | 
						||
| 
								 | 
							
								      write: noop,
							 | 
						||
| 
								 | 
							
								      transmit: {
							 | 
						||
| 
								 | 
							
								        send (level) {
							 | 
						||
| 
								 | 
							
								          c++
							 | 
						||
| 
								 | 
							
								          if (c === 1) is(level, 'error')
							 | 
						||
| 
								 | 
							
								          if (c === 2) is(level, 'fatal')
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  logger.warn('ignored')
							 | 
						||
| 
								 | 
							
								  logger.error('test')
							 | 
						||
| 
								 | 
							
								  logger.fatal('test')
							 | 
						||
| 
								 | 
							
								  end()
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('transmit.level is effective even if lower than logger level', ({ end, is }) => {
							 | 
						||
| 
								 | 
							
								  let c = 0
							 | 
						||
| 
								 | 
							
								  const logger = pino({
							 | 
						||
| 
								 | 
							
								    level: 'error',
							 | 
						||
| 
								 | 
							
								    browser: {
							 | 
						||
| 
								 | 
							
								      write: noop,
							 | 
						||
| 
								 | 
							
								      transmit: {
							 | 
						||
| 
								 | 
							
								        level: 'info',
							 | 
						||
| 
								 | 
							
								        send (level) {
							 | 
						||
| 
								 | 
							
								          c++
							 | 
						||
| 
								 | 
							
								          if (c === 1) is(level, 'warn')
							 | 
						||
| 
								 | 
							
								          if (c === 2) is(level, 'error')
							 | 
						||
| 
								 | 
							
								          if (c === 3) is(level, 'fatal')
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  logger.warn('ignored')
							 | 
						||
| 
								 | 
							
								  logger.error('test')
							 | 
						||
| 
								 | 
							
								  logger.fatal('test')
							 | 
						||
| 
								 | 
							
								  end()
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('applies all serializers to messages and bindings (serialize:false - default)', ({ end, same, is }) => {
							 | 
						||
| 
								 | 
							
								  const logger = pino({
							 | 
						||
| 
								 | 
							
								    serializers: {
							 | 
						||
| 
								 | 
							
								      first: () => 'first',
							 | 
						||
| 
								 | 
							
								      second: () => 'second',
							 | 
						||
| 
								 | 
							
								      test: () => 'serialize it'
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    browser: {
							 | 
						||
| 
								 | 
							
								      write: noop,
							 | 
						||
| 
								 | 
							
								      transmit: {
							 | 
						||
| 
								 | 
							
								        send (level, logEvent) {
							 | 
						||
| 
								 | 
							
								          const messages = logEvent.messages
							 | 
						||
| 
								 | 
							
								          const bindings = logEvent.bindings
							 | 
						||
| 
								 | 
							
								          same(bindings[0], { first: 'first' })
							 | 
						||
| 
								 | 
							
								          same(bindings[1], { second: 'second' })
							 | 
						||
| 
								 | 
							
								          same(messages[0], { test: 'serialize it' })
							 | 
						||
| 
								 | 
							
								          is(messages[1].type, 'Error')
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  logger
							 | 
						||
| 
								 | 
							
								    .child({ first: 'binding' })
							 | 
						||
| 
								 | 
							
								    .child({ second: 'binding2' })
							 | 
						||
| 
								 | 
							
								    .fatal({ test: 'test' }, Error())
							 | 
						||
| 
								 | 
							
								  end()
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('applies all serializers to messages and bindings (serialize:true)', ({ end, same, is }) => {
							 | 
						||
| 
								 | 
							
								  const logger = pino({
							 | 
						||
| 
								 | 
							
								    serializers: {
							 | 
						||
| 
								 | 
							
								      first: () => 'first',
							 | 
						||
| 
								 | 
							
								      second: () => 'second',
							 | 
						||
| 
								 | 
							
								      test: () => 'serialize it'
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    browser: {
							 | 
						||
| 
								 | 
							
								      serialize: true,
							 | 
						||
| 
								 | 
							
								      write: noop,
							 | 
						||
| 
								 | 
							
								      transmit: {
							 | 
						||
| 
								 | 
							
								        send (level, logEvent) {
							 | 
						||
| 
								 | 
							
								          const messages = logEvent.messages
							 | 
						||
| 
								 | 
							
								          const bindings = logEvent.bindings
							 | 
						||
| 
								 | 
							
								          same(bindings[0], { first: 'first' })
							 | 
						||
| 
								 | 
							
								          same(bindings[1], { second: 'second' })
							 | 
						||
| 
								 | 
							
								          same(messages[0], { test: 'serialize it' })
							 | 
						||
| 
								 | 
							
								          is(messages[1].type, 'Error')
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  logger
							 | 
						||
| 
								 | 
							
								    .child({ first: 'binding' })
							 | 
						||
| 
								 | 
							
								    .child({ second: 'binding2' })
							 | 
						||
| 
								 | 
							
								    .fatal({ test: 'test' }, Error())
							 | 
						||
| 
								 | 
							
								  end()
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('extracts correct bindings and raw messages over multiple transmits', ({ end, same, is }) => {
							 | 
						||
| 
								 | 
							
								  let messages = null
							 | 
						||
| 
								 | 
							
								  let bindings = null
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const logger = pino({
							 | 
						||
| 
								 | 
							
								    browser: {
							 | 
						||
| 
								 | 
							
								      write: noop,
							 | 
						||
| 
								 | 
							
								      transmit: {
							 | 
						||
| 
								 | 
							
								        send (level, logEvent) {
							 | 
						||
| 
								 | 
							
								          messages = logEvent.messages
							 | 
						||
| 
								 | 
							
								          bindings = logEvent.bindings
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const child = logger.child({ child: true })
							 | 
						||
| 
								 | 
							
								  const grandchild = child.child({ grandchild: true })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  logger.fatal({ test: 'parent:test1' })
							 | 
						||
| 
								 | 
							
								  logger.fatal({ test: 'parent:test2' })
							 | 
						||
| 
								 | 
							
								  same([], bindings)
							 | 
						||
| 
								 | 
							
								  same([{ test: 'parent:test2' }], messages)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  child.fatal({ test: 'child:test1' })
							 | 
						||
| 
								 | 
							
								  child.fatal({ test: 'child:test2' })
							 | 
						||
| 
								 | 
							
								  same([{ child: true }], bindings)
							 | 
						||
| 
								 | 
							
								  same([{ test: 'child:test2' }], messages)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  grandchild.fatal({ test: 'grandchild:test1' })
							 | 
						||
| 
								 | 
							
								  grandchild.fatal({ test: 'grandchild:test2' })
							 | 
						||
| 
								 | 
							
								  same([{ child: true }, { grandchild: true }], bindings)
							 | 
						||
| 
								 | 
							
								  same([{ test: 'grandchild:test2' }], messages)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  end()
							 | 
						||
| 
								 | 
							
								})
							 |