1// Flags: --expose-internals 2 3'use strict'; 4 5const common = require('../common'); 6if (!common.hasCrypto) 7 common.skip('missing crypto'); 8const http2 = require('http2'); 9const assert = require('assert'); 10const { kSocket } = require('internal/http2/util'); 11const { ServerHttp2Session } = require('internal/http2/core'); 12 13const server = http2.createServer(); 14server.on('stream', common.mustNotCall()); 15 16let test = 0; 17 18server.on('session', common.mustCall((session) => { 19 assert.strictEqual(session instanceof ServerHttp2Session, true); 20 switch (++test) { 21 case 1: 22 server.on('error', common.mustNotCall()); 23 session.on('error', common.expectsError({ 24 name: 'Error', 25 message: 'test' 26 })); 27 session[kSocket].emit('error', new Error('test')); 28 break; 29 case 2: 30 // If the server does not have a socketError listener, 31 // error will be silent on the server but will close 32 // the session 33 session[kSocket].emit('error', new Error('test')); 34 break; 35 } 36}, 2)); 37 38server.on('sessionError', common.mustCall((err, session) => { 39 assert.strictEqual(err.name, 'Error'); 40 assert.strictEqual(err.message, 'test'); 41 assert.strictEqual(session instanceof ServerHttp2Session, true); 42}, 2)); 43 44server.listen(0, common.mustCall(() => { 45 const url = `http://localhost:${server.address().port}`; 46 http2.connect(url) 47 .on('error', common.mustCall((err) => { 48 if (err.code !== 'ECONNRESET') { 49 assert.strictEqual(err.code, 'ERR_HTTP2_SESSION_ERROR'); 50 assert.strictEqual(err.message, 'Session closed with error code 2'); 51 } 52 })) 53 .on('close', () => { 54 server.removeAllListeners('error'); 55 http2.connect(url) 56 .on('error', common.mustCall((err) => { 57 if (err.code !== 'ECONNRESET') { 58 assert.strictEqual(err.code, 'ERR_HTTP2_SESSION_ERROR'); 59 assert.strictEqual(err.message, 'Session closed with error code 2'); 60 } 61 })) 62 .on('close', () => server.close()); 63 }); 64})); 65