11cb0ef41Sopenharmony_ci'use strict';
21cb0ef41Sopenharmony_ci
31cb0ef41Sopenharmony_ciconst common = require('../common');
41cb0ef41Sopenharmony_ciif (!common.hasCrypto)
51cb0ef41Sopenharmony_ci  common.skip('missing crypto');
61cb0ef41Sopenharmony_ciconst assert = require('assert');
71cb0ef41Sopenharmony_ciconst h2 = require('http2');
81cb0ef41Sopenharmony_ciconst Countdown = require('../common/countdown');
91cb0ef41Sopenharmony_ci
101cb0ef41Sopenharmony_ci// Only allow one stream to be open at a time
111cb0ef41Sopenharmony_ciconst server = h2.createServer({ settings: { maxConcurrentStreams: 1 } });
121cb0ef41Sopenharmony_ci
131cb0ef41Sopenharmony_ci// The stream handler must be called only once
141cb0ef41Sopenharmony_ciserver.on('stream', common.mustCall((stream) => {
151cb0ef41Sopenharmony_ci  stream.respond();
161cb0ef41Sopenharmony_ci  stream.end('hello world');
171cb0ef41Sopenharmony_ci}));
181cb0ef41Sopenharmony_ci
191cb0ef41Sopenharmony_ciserver.listen(0, common.mustCall(() => {
201cb0ef41Sopenharmony_ci  const client = h2.connect(`http://localhost:${server.address().port}`);
211cb0ef41Sopenharmony_ci
221cb0ef41Sopenharmony_ci  const countdown = new Countdown(2, () => {
231cb0ef41Sopenharmony_ci    server.close();
241cb0ef41Sopenharmony_ci    client.close();
251cb0ef41Sopenharmony_ci  });
261cb0ef41Sopenharmony_ci
271cb0ef41Sopenharmony_ci  client.on('remoteSettings', common.mustCall((settings) => {
281cb0ef41Sopenharmony_ci    assert.strictEqual(settings.maxConcurrentStreams, 1);
291cb0ef41Sopenharmony_ci  }));
301cb0ef41Sopenharmony_ci
311cb0ef41Sopenharmony_ci  // This one should go through with no problems
321cb0ef41Sopenharmony_ci  {
331cb0ef41Sopenharmony_ci    const req = client.request({ ':method': 'POST' });
341cb0ef41Sopenharmony_ci    req.on('aborted', common.mustNotCall());
351cb0ef41Sopenharmony_ci    req.on('response', common.mustCall());
361cb0ef41Sopenharmony_ci    req.resume();
371cb0ef41Sopenharmony_ci    req.on('end', common.mustCall());
381cb0ef41Sopenharmony_ci    req.on('close', common.mustCall(() => countdown.dec()));
391cb0ef41Sopenharmony_ci    req.end();
401cb0ef41Sopenharmony_ci  }
411cb0ef41Sopenharmony_ci
421cb0ef41Sopenharmony_ci  {
431cb0ef41Sopenharmony_ci    // This one should be aborted
441cb0ef41Sopenharmony_ci    const req = client.request({ ':method': 'POST' });
451cb0ef41Sopenharmony_ci    req.on('aborted', common.mustCall());
461cb0ef41Sopenharmony_ci    req.on('response', common.mustNotCall());
471cb0ef41Sopenharmony_ci    req.resume();
481cb0ef41Sopenharmony_ci    req.on('end', common.mustNotCall());
491cb0ef41Sopenharmony_ci    req.on('close', common.mustCall(() => countdown.dec()));
501cb0ef41Sopenharmony_ci    req.on('error', common.expectsError({
511cb0ef41Sopenharmony_ci      code: 'ERR_HTTP2_STREAM_ERROR',
521cb0ef41Sopenharmony_ci      name: 'Error',
531cb0ef41Sopenharmony_ci      message: 'Stream closed with error code NGHTTP2_REFUSED_STREAM'
541cb0ef41Sopenharmony_ci    }));
551cb0ef41Sopenharmony_ci  }
561cb0ef41Sopenharmony_ci}));
57