http2: add diagnostics channel 'http2.server.stream.finish' · nodejs/node@0234a8e

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.server.stream.finish' channel when

9+

// ServerHttp2Streams#respond() sends a regular stream as well as a push stream.

10+11+

const Countdown = require('../common/countdown');

12+

const assert = require('assert');

13+

const dc = require('diagnostics_channel');

14+

const http2 = require('http2');

15+

const { Duplex } = require('stream');

16+17+

const serverHttp2StreamFinishCount = 2;

18+19+

dc.subscribe('http2.server.stream.finish', common.mustCall(({ stream, headers, flags }) => {

20+

// Since ServerHttp2Stream is not exported from any module, this just checks

21+

// if the stream is an instance of Duplex and the constructor name is

22+

// 'ServerHttp2Stream'.

23+

assert.ok(stream instanceof Duplex);

24+

assert.strictEqual(stream.constructor.name, 'ServerHttp2Stream');

25+26+

assert.ok(headers && !Array.isArray(headers) && typeof headers === 'object');

27+28+

assert.strictEqual(typeof flags, 'number');

29+

}, serverHttp2StreamFinishCount));

30+31+

const server = http2.createServer();

32+

server.on('stream', common.mustCall((stream) => {

33+

stream.respond();

34+

stream.end();

35+36+

stream.pushStream({}, common.mustSucceed((pushStream) => {

37+

pushStream.respond();

38+

pushStream.end();

39+

}));

40+

}));

41+42+

server.listen(0, common.mustCall(() => {

43+

const port = server.address().port;

44+

const client = http2.connect(`http://localhost:${port}`);

45+46+

const countdown = new Countdown(serverHttp2StreamFinishCount, () => {

47+

client.close();

48+

server.close();

49+

});

50+51+

const stream = client.request({});

52+

stream.on('response', common.mustCall(() => {

53+

countdown.dec();

54+

}));

55+56+

client.on('stream', common.mustCall((pushStream) => {

57+

pushStream.on('push', common.mustCall(() => {

58+

countdown.dec();

59+

}));

60+

}));

61+

}));