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_ci
91cb0ef41Sopenharmony_ciconst server = h2.createServer();
101cb0ef41Sopenharmony_ci
111cb0ef41Sopenharmony_ciserver.on('stream', common.mustCall(onStream));
121cb0ef41Sopenharmony_ci
131cb0ef41Sopenharmony_cifunction onStream(stream, headers, flags) {
141cb0ef41Sopenharmony_ci
151cb0ef41Sopenharmony_ci  // Test Stream State.
161cb0ef41Sopenharmony_ci  {
171cb0ef41Sopenharmony_ci    const state = stream.state;
181cb0ef41Sopenharmony_ci    assert.strictEqual(typeof state, 'object');
191cb0ef41Sopenharmony_ci    assert.strictEqual(typeof state.state, 'number');
201cb0ef41Sopenharmony_ci    assert.strictEqual(typeof state.weight, 'number');
211cb0ef41Sopenharmony_ci    assert.strictEqual(typeof state.sumDependencyWeight, 'number');
221cb0ef41Sopenharmony_ci    assert.strictEqual(typeof state.localClose, 'number');
231cb0ef41Sopenharmony_ci    assert.strictEqual(typeof state.remoteClose, 'number');
241cb0ef41Sopenharmony_ci    assert.strictEqual(typeof state.localWindowSize, 'number');
251cb0ef41Sopenharmony_ci  }
261cb0ef41Sopenharmony_ci
271cb0ef41Sopenharmony_ci  // Test Session State.
281cb0ef41Sopenharmony_ci  {
291cb0ef41Sopenharmony_ci    const state = stream.session.state;
301cb0ef41Sopenharmony_ci    assert.strictEqual(typeof state, 'object');
311cb0ef41Sopenharmony_ci    assert.strictEqual(typeof state.effectiveLocalWindowSize, 'number');
321cb0ef41Sopenharmony_ci    assert.strictEqual(typeof state.effectiveRecvDataLength, 'number');
331cb0ef41Sopenharmony_ci    assert.strictEqual(typeof state.nextStreamID, 'number');
341cb0ef41Sopenharmony_ci    assert.strictEqual(typeof state.localWindowSize, 'number');
351cb0ef41Sopenharmony_ci    assert.strictEqual(typeof state.lastProcStreamID, 'number');
361cb0ef41Sopenharmony_ci    assert.strictEqual(typeof state.remoteWindowSize, 'number');
371cb0ef41Sopenharmony_ci    assert.strictEqual(typeof state.outboundQueueSize, 'number');
381cb0ef41Sopenharmony_ci    assert.strictEqual(typeof state.deflateDynamicTableSize, 'number');
391cb0ef41Sopenharmony_ci    assert.strictEqual(typeof state.inflateDynamicTableSize, 'number');
401cb0ef41Sopenharmony_ci  }
411cb0ef41Sopenharmony_ci
421cb0ef41Sopenharmony_ci  stream.respond({
431cb0ef41Sopenharmony_ci    'content-type': 'text/html',
441cb0ef41Sopenharmony_ci    ':status': 200
451cb0ef41Sopenharmony_ci  });
461cb0ef41Sopenharmony_ci  stream.end('hello world');
471cb0ef41Sopenharmony_ci}
481cb0ef41Sopenharmony_ci
491cb0ef41Sopenharmony_ciserver.listen(0);
501cb0ef41Sopenharmony_ci
511cb0ef41Sopenharmony_ciserver.on('listening', common.mustCall(() => {
521cb0ef41Sopenharmony_ci
531cb0ef41Sopenharmony_ci  const client = h2.connect(`http://localhost:${server.address().port}`);
541cb0ef41Sopenharmony_ci
551cb0ef41Sopenharmony_ci  const headers = { ':path': '/' };
561cb0ef41Sopenharmony_ci
571cb0ef41Sopenharmony_ci  const req = client.request(headers);
581cb0ef41Sopenharmony_ci
591cb0ef41Sopenharmony_ci  // State will only be valid after connect event is emitted
601cb0ef41Sopenharmony_ci  req.on('ready', common.mustCall(() => {
611cb0ef41Sopenharmony_ci
621cb0ef41Sopenharmony_ci    // Test Stream State.
631cb0ef41Sopenharmony_ci    {
641cb0ef41Sopenharmony_ci      const state = req.state;
651cb0ef41Sopenharmony_ci      assert.strictEqual(typeof state, 'object');
661cb0ef41Sopenharmony_ci      assert.strictEqual(typeof state.state, 'number');
671cb0ef41Sopenharmony_ci      assert.strictEqual(typeof state.weight, 'number');
681cb0ef41Sopenharmony_ci      assert.strictEqual(typeof state.sumDependencyWeight, 'number');
691cb0ef41Sopenharmony_ci      assert.strictEqual(typeof state.localClose, 'number');
701cb0ef41Sopenharmony_ci      assert.strictEqual(typeof state.remoteClose, 'number');
711cb0ef41Sopenharmony_ci      assert.strictEqual(typeof state.localWindowSize, 'number');
721cb0ef41Sopenharmony_ci    }
731cb0ef41Sopenharmony_ci
741cb0ef41Sopenharmony_ci    // Test Session State
751cb0ef41Sopenharmony_ci    {
761cb0ef41Sopenharmony_ci      const state = req.session.state;
771cb0ef41Sopenharmony_ci      assert.strictEqual(typeof state, 'object');
781cb0ef41Sopenharmony_ci      assert.strictEqual(typeof state.effectiveLocalWindowSize, 'number');
791cb0ef41Sopenharmony_ci      assert.strictEqual(typeof state.effectiveRecvDataLength, 'number');
801cb0ef41Sopenharmony_ci      assert.strictEqual(typeof state.nextStreamID, 'number');
811cb0ef41Sopenharmony_ci      assert.strictEqual(typeof state.localWindowSize, 'number');
821cb0ef41Sopenharmony_ci      assert.strictEqual(typeof state.lastProcStreamID, 'number');
831cb0ef41Sopenharmony_ci      assert.strictEqual(typeof state.remoteWindowSize, 'number');
841cb0ef41Sopenharmony_ci      assert.strictEqual(typeof state.outboundQueueSize, 'number');
851cb0ef41Sopenharmony_ci      assert.strictEqual(typeof state.deflateDynamicTableSize, 'number');
861cb0ef41Sopenharmony_ci      assert.strictEqual(typeof state.inflateDynamicTableSize, 'number');
871cb0ef41Sopenharmony_ci    }
881cb0ef41Sopenharmony_ci  }));
891cb0ef41Sopenharmony_ci
901cb0ef41Sopenharmony_ci  req.on('response', common.mustCall());
911cb0ef41Sopenharmony_ci  req.resume();
921cb0ef41Sopenharmony_ci  req.on('end', common.mustCall(() => {
931cb0ef41Sopenharmony_ci    server.close();
941cb0ef41Sopenharmony_ci    client.close();
951cb0ef41Sopenharmony_ci  }));
961cb0ef41Sopenharmony_ci  req.end();
971cb0ef41Sopenharmony_ci
981cb0ef41Sopenharmony_ci}));
99