mirror of
https://github.com/nodejs/node.git
synced 2025-04-30 23:56:58 +00:00

This commit improves the SystemError messages by allowing user to combine a custom message and the libuv error message. Also since we now prefer use subclasses to construct the errors instead of using `new errors.SystemError()` directly, this removes the behavior of assigning a default error code `ERR_SYSTEM_ERROR` to SystemError and requires the user to directly use the `ERR_SYSTEM_ERROR` class to construct errors instead. Also merges `makeNodeError` into the SystemError class definition since that's the only place the function gets used and it seems unnecessary to introduce another level of inheritance. SystemError now directly inherits from Error instead of an intermmediate Error class that inherits from Error. Class hierarchy before this patch: ERR_SOCKET_BUFFER_SIZE -> Error (use message formatted by SystemError) ERR_SYSTEM_ERROR -> NodeError (temp) -> Error After: ERR_SOCKET_BUFFER_SIZE -> SystemError -> Error ERR_TTY_INIT_FAILED -> SystemError -> Error ERR_SYSTEM_ERROR -> SystemError -> Error Error messages before this patch: ``` const dgram = require('dgram'); const socket = dgram.createSocket('udp4'); socket.setRecvBufferSize(8192); // Error [ERR_SOCKET_BUFFER_SIZE]: Could not get or set buffer // size: Error [ERR_SYSTEM_ERROR]: bad file descriptor: // EBADF [uv_recv_buffer_size] // at bufferSize (dgram.js:191:11) // at Socket.setRecvBufferSize (dgram.js:689:3) const tty = require('tty'); new tty.WriteStream(1 << 30); // Error [ERR_SYSTEM_ERROR]: invalid argument: EINVAL [uv_tty_init] // at new WriteStream (tty.js:84:11) ``` After: ``` const dgram = require('dgram'); const socket = dgram.createSocket('udp4'); socket.setRecvBufferSize(8192); // SystemError [ERR_SOCKET_BUFFER_SIZE]: Could not get or set buffer // size: uv_recv_buffer_size returned EBADF (bad file descriptor) // at bufferSize (dgram.js:191:11) // at Socket.setRecvBufferSize (dgram.js:689:3) const tty = require('tty'); new tty.WriteStream(1 << 30); // SystemError [ERR_TTY_INIT_FAILED]: TTY initialization failed: // uv_tty_init returned EINVAL (invalid argument) // at new WriteStream (tty.js:84:11) ``` PR-URL: https://github.com/nodejs/node/pull/19514 Reviewed-By: Michaël Zasso <targos@protonmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
149 lines
3.7 KiB
JavaScript
149 lines
3.7 KiB
JavaScript
'use strict';
|
|
// Flags: --expose-internals
|
|
|
|
const common = require('../common');
|
|
const assert = require('assert');
|
|
const dgram = require('dgram');
|
|
const { SystemError } = require('internal/errors');
|
|
const uv = process.binding('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.UV_ENOTSOCK : uv.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',
|
|
type: 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');
|
|
|
|
common.expectsError(() => {
|
|
socket.setSendBufferSize(8192);
|
|
}, errorObj);
|
|
|
|
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.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.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();
|
|
}));
|
|
}
|