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
			| 
											3 years ago
										 | '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' | ||
|  |   }) | ||
|  | }) |