mirror of
https://github.com/nodejs/node.git
synced 2025-05-07 15:35:41 +00:00

This improves Node.js errors by always showing the attached properties when inspecting such an error. This applies especially to SystemError. It did often not show any properties but now all properties will be visible. This is done in a mainly backwards compatible way. Instead of using prototype getters and setters, the property is now set directly on the error. PR-URL: https://github.com/nodejs/node/pull/29677 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Benjamin Gruenbaum <benjamingr@gmail.com>
171 lines
4.4 KiB
JavaScript
171 lines
4.4 KiB
JavaScript
// Flags: --expose-internals
|
|
'use strict';
|
|
|
|
const common = require('../common');
|
|
const assert = require('assert');
|
|
const dgram = require('dgram');
|
|
const { inspect } = require('util');
|
|
const { SystemError } = require('internal/errors');
|
|
const { internalBinding } = require('internal/test/binding');
|
|
const {
|
|
UV_EBADF,
|
|
UV_EINVAL,
|
|
UV_ENOTSOCK
|
|
} = internalBinding('uv');
|
|
|
|
function getExpectedError(type) {
|
|
const code = common.isWindows ? 'ENOTSOCK' : 'EBADF';
|
|
const message = common.isWindows ?
|
|
'socket operation on non-socket' : 'bad file descriptor';
|
|
const errno = common.isWindows ? UV_ENOTSOCK : UV_EBADF;
|
|
const syscall = `uv_${type}_buffer_size`;
|
|
const suffix = common.isWindows ?
|
|
'ENOTSOCK (socket operation on non-socket)' : 'EBADF (bad file descriptor)';
|
|
const error = {
|
|
code: 'ERR_SOCKET_BUFFER_SIZE',
|
|
name: 'SystemError',
|
|
message: `Could not get or set buffer size: ${syscall} returned ${suffix}`,
|
|
info: {
|
|
code,
|
|
message,
|
|
errno,
|
|
syscall
|
|
}
|
|
};
|
|
return error;
|
|
}
|
|
|
|
{
|
|
// Should throw error if the socket is never bound.
|
|
const errorObj = getExpectedError('send');
|
|
|
|
const socket = dgram.createSocket('udp4');
|
|
|
|
assert.throws(() => {
|
|
socket.setSendBufferSize(8192);
|
|
}, (err) => {
|
|
assert.strictEqual(
|
|
inspect(err).replace(/^ +at .*\n/gm, ''),
|
|
`SystemError [ERR_SOCKET_BUFFER_SIZE]: ${errorObj.message}\n` +
|
|
" code: 'ERR_SOCKET_BUFFER_SIZE',\n" +
|
|
' info: {\n' +
|
|
` errno: ${errorObj.info.errno},\n` +
|
|
` code: '${errorObj.info.code}',\n` +
|
|
` message: '${errorObj.info.message}',\n` +
|
|
` syscall: '${errorObj.info.syscall}'\n` +
|
|
' },\n' +
|
|
` errno: [Getter/Setter: ${errorObj.info.errno}],\n` +
|
|
` syscall: [Getter/Setter: '${errorObj.info.syscall}']\n` +
|
|
'}'
|
|
);
|
|
return true;
|
|
});
|
|
|
|
common.expectsError(() => {
|
|
socket.getSendBufferSize();
|
|
}, errorObj);
|
|
}
|
|
|
|
{
|
|
const socket = dgram.createSocket('udp4');
|
|
|
|
// Should throw error if the socket is never bound.
|
|
const errorObj = getExpectedError('recv');
|
|
|
|
common.expectsError(() => {
|
|
socket.setRecvBufferSize(8192);
|
|
}, errorObj);
|
|
|
|
common.expectsError(() => {
|
|
socket.getRecvBufferSize();
|
|
}, errorObj);
|
|
}
|
|
|
|
{
|
|
// Should throw error if invalid buffer size is specified
|
|
const errorObj = {
|
|
code: 'ERR_SOCKET_BAD_BUFFER_SIZE',
|
|
type: TypeError,
|
|
message: /^Buffer size must be a positive integer$/
|
|
};
|
|
|
|
const badBufferSizes = [-1, Infinity, 'Doh!'];
|
|
|
|
const socket = dgram.createSocket('udp4');
|
|
|
|
socket.bind(common.mustCall(() => {
|
|
badBufferSizes.forEach((badBufferSize) => {
|
|
common.expectsError(() => {
|
|
socket.setRecvBufferSize(badBufferSize);
|
|
}, errorObj);
|
|
|
|
common.expectsError(() => {
|
|
socket.setSendBufferSize(badBufferSize);
|
|
}, errorObj);
|
|
});
|
|
socket.close();
|
|
}));
|
|
}
|
|
|
|
{
|
|
// Can set and get buffer sizes after binding the socket.
|
|
const socket = dgram.createSocket('udp4');
|
|
|
|
socket.bind(common.mustCall(() => {
|
|
socket.setRecvBufferSize(10000);
|
|
socket.setSendBufferSize(10000);
|
|
|
|
// note: linux will double the buffer size
|
|
const expectedBufferSize = common.isLinux ? 20000 : 10000;
|
|
assert.strictEqual(socket.getRecvBufferSize(), expectedBufferSize);
|
|
assert.strictEqual(socket.getSendBufferSize(), expectedBufferSize);
|
|
socket.close();
|
|
}));
|
|
}
|
|
|
|
{
|
|
const info = {
|
|
code: 'EINVAL',
|
|
message: 'invalid argument',
|
|
errno: UV_EINVAL,
|
|
syscall: 'uv_recv_buffer_size'
|
|
};
|
|
const errorObj = {
|
|
code: 'ERR_SOCKET_BUFFER_SIZE',
|
|
type: SystemError,
|
|
message: 'Could not get or set buffer size: uv_recv_buffer_size ' +
|
|
'returned EINVAL (invalid argument)',
|
|
info
|
|
};
|
|
const socket = dgram.createSocket('udp4');
|
|
socket.bind(common.mustCall(() => {
|
|
common.expectsError(() => {
|
|
socket.setRecvBufferSize(2147483648);
|
|
}, errorObj);
|
|
socket.close();
|
|
}));
|
|
}
|
|
|
|
{
|
|
const info = {
|
|
code: 'EINVAL',
|
|
message: 'invalid argument',
|
|
errno: UV_EINVAL,
|
|
syscall: 'uv_send_buffer_size'
|
|
};
|
|
const errorObj = {
|
|
code: 'ERR_SOCKET_BUFFER_SIZE',
|
|
type: SystemError,
|
|
message: 'Could not get or set buffer size: uv_send_buffer_size ' +
|
|
'returned EINVAL (invalid argument)',
|
|
info
|
|
};
|
|
const socket = dgram.createSocket('udp4');
|
|
socket.bind(common.mustCall(() => {
|
|
common.expectsError(() => {
|
|
socket.setSendBufferSize(2147483648);
|
|
}, errorObj);
|
|
socket.close();
|
|
}));
|
|
}
|