// Flags: --expose-internals 'use strict'; require('../common'); const assert = require('assert'); const { E, SystemError, codes } = require('internal/errors'); assert.throws( () => { new SystemError(); }, { name: 'TypeError', message: 'Cannot read property \'match\' of undefined' } ); E('ERR_TEST', 'custom message', SystemError); const { ERR_TEST } = codes; { const ctx = { code: 'ETEST', message: 'code message', syscall: 'syscall_test', path: '/str', dest: '/str2' }; assert.throws( () => { throw new ERR_TEST(ctx); }, { code: 'ERR_TEST', name: 'SystemError', message: 'custom message: syscall_test returned ETEST (code message)' + ' /str => /str2', info: ctx } ); } { const ctx = { code: 'ETEST', message: 'code message', syscall: 'syscall_test', path: Buffer.from('/buf'), dest: '/str2' }; assert.throws( () => { throw new ERR_TEST(ctx); }, { code: 'ERR_TEST', name: 'SystemError', message: 'custom message: syscall_test returned ETEST (code message)' + ' /buf => /str2', info: ctx } ); } { const ctx = { code: 'ETEST', message: 'code message', syscall: 'syscall_test', path: Buffer.from('/buf'), dest: Buffer.from('/buf2') }; assert.throws( () => { throw new ERR_TEST(ctx); }, { code: 'ERR_TEST', name: 'SystemError', message: 'custom message: syscall_test returned ETEST (code message)' + ' /buf => /buf2', info: ctx } ); } { const ctx = { code: 'ERR', errno: 123, message: 'something happened', syscall: 'syscall_test', path: Buffer.from('a'), dest: Buffer.from('b') }; const err = new ERR_TEST(ctx); assert.strictEqual(err.info, ctx); assert.strictEqual(err.code, 'ERR_TEST'); err.code = 'test'; assert.strictEqual(err.code, 'test'); // Test legacy properties. These shouldn't be used anymore // but let us make sure they still work assert.strictEqual(err.errno, 123); assert.strictEqual(err.syscall, 'syscall_test'); assert.strictEqual(err.path, 'a'); assert.strictEqual(err.dest, 'b'); // Make sure it's mutable err.code = 'test'; err.errno = 321; err.syscall = 'test'; err.path = 'path'; err.dest = 'path'; assert.strictEqual(err.errno, 321); assert.strictEqual(err.syscall, 'test'); assert.strictEqual(err.path, 'path'); assert.strictEqual(err.dest, 'path'); } { const ctx = { code: 'ERR_TEST', message: 'Error occurred', syscall: 'syscall_test' }; assert.throws( () => { const err = new ERR_TEST(ctx); err.name = 'Foobar'; throw err; }, { code: 'ERR_TEST', name: 'Foobar', message: 'custom message: syscall_test returned ERR_TEST ' + '(Error occurred)', info: ctx } ); }