1'use strict';
2
3const common = require('../common');
4if (!common.hasCrypto)
5  common.skip('missing crypto');
6const assert = require('assert');
7const h2 = require('http2');
8
9const server = h2.createServer();
10
11// We use the lower-level API here
12server.on('stream', common.mustCall((stream, headers, flags) => {
13  stream.respond();
14  stream.end('ok');
15}));
16server.on('session', common.mustCall((session) => {
17  session.on('remoteSettings', common.mustCall(2));
18}));
19
20server.listen(0, common.mustCall(() => {
21  const client = h2.connect(`http://localhost:${server.address().port}`);
22
23  [
24    ['headerTableSize', -1, RangeError],
25    ['headerTableSize', 2 ** 32, RangeError],
26    ['initialWindowSize', -1, RangeError],
27    ['initialWindowSize', 2 ** 32, RangeError],
28    ['maxFrameSize', 1, RangeError],
29    ['maxFrameSize', 2 ** 24, RangeError],
30    ['maxConcurrentStreams', -1, RangeError],
31    ['maxConcurrentStreams', 2 ** 32, RangeError],
32    ['maxHeaderListSize', -1, RangeError],
33    ['maxHeaderListSize', 2 ** 32, RangeError],
34    ['maxHeaderSize', -1, RangeError],
35    ['maxHeaderSize', 2 ** 32, RangeError],
36    ['enablePush', 'a', TypeError],
37    ['enablePush', 1, TypeError],
38    ['enablePush', 0, TypeError],
39    ['enablePush', null, TypeError],
40    ['enablePush', {}, TypeError],
41  ].forEach(([name, value, errorType]) =>
42    assert.throws(
43      () => client.settings({ [name]: value }),
44      {
45        code: 'ERR_HTTP2_INVALID_SETTING_VALUE',
46        name: errorType.name
47      }
48    )
49  );
50
51  [1, true, {}, []].forEach((invalidCallback) =>
52    assert.throws(
53      () => client.settings({}, invalidCallback),
54      {
55        name: 'TypeError',
56        code: 'ERR_INVALID_ARG_TYPE',
57      }
58    )
59  );
60
61  client.settings({ maxFrameSize: 1234567 });
62
63  const req = client.request();
64  req.on('response', common.mustCall());
65  req.resume();
66  req.on('close', common.mustCall(() => {
67    server.close();
68    client.close();
69  }));
70}));
71