node/test/parallel/test-http2-ping.js
Ruben Bridgewater ac2fc0dd5f
errors: improve ERR_INVALID_ARG_TYPE
ERR_INVALID_ARG_TYPE is the most common error used throughout the
code base. This improves the error message by providing more details
to the user and by indicating more precisely which values are allowed
ones and which ones are not.

It adds the actual input to the error message in case it's a primitive.
If it's a class instance, it'll print the class name instead of
"object" and "falsy" or similar entries are not named "type" anymore.

PR-URL: https://github.com/nodejs/node/pull/29675
Reviewed-By: Rich Trott <rtrott@gmail.com>
2019-12-20 03:10:13 +01:00

139 lines
3.7 KiB
JavaScript

'use strict';
const common = require('../common');
if (!common.hasCrypto)
common.skip('missing crypto');
const async_hooks = require('async_hooks');
const assert = require('assert');
const http2 = require('http2');
const { inspect } = require('util');
const pings = new Set();
const events = [0, 0, 0, 0];
const hook = async_hooks.createHook({
init(id, type, trigger, resource) {
if (type === 'HTTP2PING') {
pings.add(id);
events[0]++;
}
},
before(id) {
if (pings.has(id)) {
events[1]++;
}
},
after(id) {
if (pings.has(id)) {
events[2]++;
}
},
destroy(id) {
if (pings.has(id)) {
events[3]++;
}
}
});
hook.enable();
process.on('exit', () => {
assert.deepStrictEqual(events, [4, 4, 4, 4]);
});
const server = http2.createServer();
server.on('stream', common.mustCall((stream) => {
assert(stream.session.ping(common.mustCall((err, duration, ret) => {
assert.strictEqual(err, null);
assert.strictEqual(typeof duration, 'number');
assert.strictEqual(ret.length, 8);
stream.end('ok');
})));
stream.respond();
}));
server.listen(0, common.mustCall(() => {
const client = http2.connect(`http://localhost:${server.address().port}`,
{ maxOutstandingPings: 2 });
client.on('connect', common.mustCall(() => {
{
const payload = Buffer.from('abcdefgh');
assert(client.ping(payload, common.mustCall((err, duration, ret) => {
assert.strictEqual(err, null);
assert.strictEqual(typeof duration, 'number');
assert.deepStrictEqual(payload, ret);
})));
}
{
const payload = Buffer.from('abcdefgi');
assert(client.ping(payload, common.mustCall((err, duration, ret) => {
assert.strictEqual(err, null);
assert.strictEqual(typeof duration, 'number');
assert.deepStrictEqual(payload, ret);
})));
}
// Only max 2 pings at a time based on the maxOutstandingPings option
assert(!client.ping(common.expectsError({
code: 'ERR_HTTP2_PING_CANCEL',
type: Error,
message: 'HTTP2 ping cancelled'
})));
// Should throw if payload is not of type ArrayBufferView
{
[1, true, {}, []].forEach((payload) =>
common.expectsError(
() => client.ping(payload),
{
type: TypeError,
code: 'ERR_INVALID_ARG_TYPE',
message: 'The "payload" argument must be an instance of Buffer, ' +
'TypedArray, or DataView.' +
common.invalidArgTypeHelper(payload)
}
)
);
}
// Should throw if payload length is not 8
{
const shortPayload = Buffer.from('abcdefg');
const longPayload = Buffer.from('abcdefghi');
[shortPayload, longPayload].forEach((payloadWithInvalidLength) =>
common.expectsError(
() => client.ping(payloadWithInvalidLength),
{
type: RangeError,
code: 'ERR_HTTP2_PING_LENGTH',
message: 'HTTP2 ping payload must be 8 bytes'
}
)
);
}
// Should throw error is callback is not of type function
{
const payload = Buffer.from('abcdefgh');
[1, true, {}, []].forEach((invalidCallback) =>
common.expectsError(
() => client.ping(payload, invalidCallback),
{
type: TypeError,
code: 'ERR_INVALID_CALLBACK',
message: 'Callback must be a function. ' +
`Received ${inspect(invalidCallback)}`
}
)
);
}
const req = client.request();
req.resume();
req.on('end', common.mustCall(() => {
client.close();
server.close();
}));
}));
}));