http2: add diagnostics channel 'http2.client.stream.finish' · nodejs/node@566fc56
1+'use strict';
2+3+const common = require('../common');
4+if (!common.hasCrypto)
5+common.skip('missing crypto');
6+7+// This test ensures that the built-in HTTP/2 diagnostics channels are reporting
8+// the diagnostics messages for the 'http2.client.stream.finish' channel when
9+// ClientHttp2Streams are received by both:
10+// - the 'response' event
11+// - the 'push' event
12+13+const Countdown = require('../common/countdown');
14+const assert = require('assert');
15+const dc = require('diagnostics_channel');
16+const http2 = require('http2');
17+const { Duplex } = require('stream');
18+19+const clientHttp2StreamFinishCount = 2;
20+21+dc.subscribe('http2.client.stream.finish', common.mustCall(({ stream, headers, flags }) => {
22+// Since ClientHttp2Stream is not exported from any module, this just checks
23+// if the stream is an instance of Duplex and the constructor name is
24+// 'ClientHttp2Stream'.
25+assert.ok(stream instanceof Duplex);
26+assert.strictEqual(stream.constructor.name, 'ClientHttp2Stream');
27+28+assert.ok(headers && !Array.isArray(headers) && typeof headers === 'object');
29+30+assert.strictEqual(typeof flags, 'number');
31+}, clientHttp2StreamFinishCount));
32+33+const server = http2.createServer();
34+server.on('stream', common.mustCall((stream) => {
35+stream.respond();
36+stream.end();
37+38+stream.pushStream({}, common.mustSucceed((pushStream) => {
39+pushStream.respond();
40+pushStream.end();
41+}));
42+}));
43+44+server.listen(0, common.mustCall(() => {
45+const port = server.address().port;
46+const client = http2.connect(`http://localhost:${port}`);
47+48+const countdown = new Countdown(clientHttp2StreamFinishCount, () => {
49+client.close();
50+server.close();
51+});
52+53+const stream = client.request({});
54+stream.on('response', common.mustCall(() => {
55+countdown.dec();
56+}));
57+58+client.on('stream', common.mustCall((pushStream) => {
59+pushStream.on('push', common.mustCall(() => {
60+countdown.dec();
61+}));
62+}));
63+}));