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.
		
		
		
		
		
			
		
			
				
					
					
						
							92 lines
						
					
					
						
							2.4 KiB
						
					
					
				
			
		
		
	
	
							92 lines
						
					
					
						
							2.4 KiB
						
					
					
				| 'use strict'
 | |
| 
 | |
| const os = require('os')
 | |
| const { test } = require('tap')
 | |
| const { sink, once } = require('./helper')
 | |
| const pino = require('../')
 | |
| 
 | |
| const { pid } = process
 | |
| const hostname = os.hostname()
 | |
| 
 | |
| function testEscape (ch, key) {
 | |
|   test('correctly escape ' + ch, async ({ same }) => {
 | |
|     const stream = sink()
 | |
|     const instance = pino({
 | |
|       name: 'hello'
 | |
|     }, stream)
 | |
|     instance.fatal('this contains ' + key)
 | |
|     const result = await once(stream, 'data')
 | |
|     delete result.time
 | |
|     same(result, {
 | |
|       pid,
 | |
|       hostname,
 | |
|       level: 60,
 | |
|       name: 'hello',
 | |
|       msg: 'this contains ' + key
 | |
|     })
 | |
|   })
 | |
| }
 | |
| 
 | |
| testEscape('\\n', '\n')
 | |
| testEscape('\\/', '/')
 | |
| testEscape('\\\\', '\\')
 | |
| testEscape('\\r', '\r')
 | |
| testEscape('\\t', '\t')
 | |
| testEscape('\\b', '\b')
 | |
| 
 | |
| const toEscape = [
 | |
|   '\u0000', // NUL  Null character
 | |
|   '\u0001', // SOH  Start of Heading
 | |
|   '\u0002', // STX  Start of Text
 | |
|   '\u0003', // ETX  End-of-text character
 | |
|   '\u0004', // EOT  End-of-transmission character
 | |
|   '\u0005', // ENQ  Enquiry character
 | |
|   '\u0006', // ACK  Acknowledge character
 | |
|   '\u0007', // BEL  Bell character
 | |
|   '\u0008', // BS   Backspace
 | |
|   '\u0009', // HT   Horizontal tab
 | |
|   '\u000A', // LF   Line feed
 | |
|   '\u000B', // VT   Vertical tab
 | |
|   '\u000C', // FF   Form feed
 | |
|   '\u000D', // CR   Carriage return
 | |
|   '\u000E', // SO   Shift Out
 | |
|   '\u000F', // SI   Shift In
 | |
|   '\u0010', // DLE  Data Link Escape
 | |
|   '\u0011', // DC1  Device Control 1
 | |
|   '\u0012', // DC2  Device Control 2
 | |
|   '\u0013', // DC3  Device Control 3
 | |
|   '\u0014', // DC4  Device Control 4
 | |
|   '\u0015', // NAK  Negative-acknowledge character
 | |
|   '\u0016', // SYN  Synchronous Idle
 | |
|   '\u0017', // ETB  End of Transmission Block
 | |
|   '\u0018', // CAN  Cancel character
 | |
|   '\u0019', // EM   End of Medium
 | |
|   '\u001A', // SUB  Substitute character
 | |
|   '\u001B', // ESC  Escape character
 | |
|   '\u001C', // FS   File Separator
 | |
|   '\u001D', // GS   Group Separator
 | |
|   '\u001E', // RS   Record Separator
 | |
|   '\u001F' // US   Unit Separator
 | |
| ]
 | |
| 
 | |
| toEscape.forEach((key) => {
 | |
|   testEscape(JSON.stringify(key), key)
 | |
| })
 | |
| 
 | |
| test('correctly escape `hello \\u001F world \\n \\u0022`', async ({ same }) => {
 | |
|   const stream = sink()
 | |
|   const instance = pino({
 | |
|     name: 'hello'
 | |
|   }, stream)
 | |
|   instance.fatal('hello \u001F world \n \u0022')
 | |
|   const result = await once(stream, 'data')
 | |
|   delete result.time
 | |
|   same(result, {
 | |
|     pid,
 | |
|     hostname,
 | |
|     level: 60,
 | |
|     name: 'hello',
 | |
|     msg: 'hello \u001F world \n \u0022'
 | |
|   })
 | |
| })
 |