1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
|
// Flags: --no-warnings
'use strict';
const common = require('../common');
if (!common.hasQuic)
common.skip('missing quic');
const { createQuicSocket } = require('net');
const assert = require('assert');
const Countdown = require('../common/countdown');
const { key, cert, ca } = require('../common/quic');
const options = { key, cert, ca, alpn: 'zzz', idleTimeout: 0 };
// QuicSockets must throw errors when maxConnectionsPerHost is not a
// safe integer or is out of range.
{
[-1, 0, Number.MAX_SAFE_INTEGER + 1, 1.1].forEach((maxConnectionsPerHost) => {
assert.throws(() => createQuicSocket({ maxConnectionsPerHost }), {
code: 'ERR_OUT_OF_RANGE'
});
});
}
// Test that new client sessions will be closed when it exceeds
// maxConnectionsPerHost.
(async function() {
const kMaxConnectionsPerHost = 5;
const client = createQuicSocket({ client: options });
const server = createQuicSocket({
maxConnectionsPerHost: kMaxConnectionsPerHost,
server: options
});
const countdown = new Countdown(kMaxConnectionsPerHost + 1, () => {
client.close();
server.close();
});
server.on('session', common.mustCall(() => {}, kMaxConnectionsPerHost));
server.on('close', common.mustCall(() => {
assert.strictEqual(server.serverBusyCount, 1);
}));
await server.listen();
const sessions = [];
for (let i = 0; i < kMaxConnectionsPerHost; i += 1) {
const req = await client.connect({
address: common.localhostIPv4,
port: server.endpoints[0].address.port,
});
req.on('error', common.mustNotCall());
req.on('close', common.mustCall(() => countdown.dec()));
sessions.push(req);
}
const extra = await client.connect({
address: common.localhostIPv4,
port: server.endpoints[0].address.port,
});
extra.on('error', common.mustNotCall());
extra.on('close', common.mustCall(() => {
assert.strictEqual(extra.closeCode.code, 2);
countdown.dec();
// Shutdown the remaining open sessions.
setImmediate(common.mustCall(() => {
for (const req of sessions)
req.close();
}));
}));
})().then(common.mustCall());
|