aboutsummaryrefslogtreecommitdiff
path: root/test/parallel
diff options
context:
space:
mode:
authorJames M Snell <jasnell@gmail.com>2018-01-01 13:06:46 -0800
committerJames M Snell <jasnell@gmail.com>2018-01-03 12:57:18 -0800
commitefdadcc193dc1a2b2121fecf1a3ef24d5c35b564 (patch)
tree81063a8e586122e3a382cac4bf08e671ac1b44be /test/parallel
parent060babd66524b6a3e4757bb2fe5b87ad567cdb40 (diff)
downloadandroid-node-v8-efdadcc193dc1a2b2121fecf1a3ef24d5c35b564.tar.gz
android-node-v8-efdadcc193dc1a2b2121fecf1a3ef24d5c35b564.tar.bz2
android-node-v8-efdadcc193dc1a2b2121fecf1a3ef24d5c35b564.zip
http2: add aligned padding strategy
Add a padding strategy option that makes a best attempt to ensure that total frame length for DATA and HEADERS frames are aligned on multiples of 8-bytes. PR-URL: https://github.com/nodejs/node/pull/17938 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Diffstat (limited to 'test/parallel')
-rw-r--r--test/parallel/test-http2-padding-aligned.js68
1 files changed, 68 insertions, 0 deletions
diff --git a/test/parallel/test-http2-padding-aligned.js b/test/parallel/test-http2-padding-aligned.js
new file mode 100644
index 0000000000..183eaef738
--- /dev/null
+++ b/test/parallel/test-http2-padding-aligned.js
@@ -0,0 +1,68 @@
+'use strict';
+
+const common = require('../common');
+if (!common.hasCrypto)
+ common.skip('missing crypto');
+const assert = require('assert');
+const http2 = require('http2');
+const { PADDING_STRATEGY_ALIGNED } = http2.constants;
+const makeDuplexPair = require('../common/duplexpair');
+
+{
+ const testData = '<h1>Hello World.</h1>';
+ const server = http2.createServer({
+ paddingStrategy: PADDING_STRATEGY_ALIGNED
+ });
+ server.on('stream', common.mustCall((stream, headers) => {
+ stream.respond({
+ 'content-type': 'text/html',
+ ':status': 200
+ });
+ stream.end(testData);
+ }));
+
+ const { clientSide, serverSide } = makeDuplexPair();
+
+ // The lengths of the expected writes... note that this is highly
+ // sensitive to how the internals are implemented.
+ const serverLengths = [24, 9, 9, 32];
+ const clientLengths = [9, 9, 48, 9, 1, 21, 1, 16];
+
+ // Adjust for the 24-byte preamble and two 9-byte settings frames, and
+ // the result must be equally divisible by 8
+ assert.strictEqual(
+ (serverLengths.reduce((i, n) => i + n) - 24 - 9 - 9) % 8, 0);
+
+ // Adjust for two 9-byte settings frames, and the result must be equally
+ // divisible by 8
+ assert.strictEqual(
+ (clientLengths.reduce((i, n) => i + n) - 9 - 9) % 8, 0);
+
+ serverSide.on('data', common.mustCall((chunk) => {
+ assert.strictEqual(chunk.length, serverLengths.shift());
+ }, serverLengths.length));
+ clientSide.on('data', common.mustCall((chunk) => {
+ assert.strictEqual(chunk.length, clientLengths.shift());
+ }, clientLengths.length));
+
+ server.emit('connection', serverSide);
+
+ const client = http2.connect('http://localhost:80', {
+ paddingStrategy: PADDING_STRATEGY_ALIGNED,
+ createConnection: common.mustCall(() => clientSide)
+ });
+
+ const req = client.request({ ':path': '/a' });
+
+ req.on('response', common.mustCall());
+
+ req.setEncoding('utf8');
+ req.on('data', common.mustCall((data) => {
+ assert.strictEqual(data, testData);
+ }));
+ req.on('close', common.mustCall(() => {
+ clientSide.destroy();
+ clientSide.end();
+ }));
+ req.end();
+}