From b0be2ac3ea1b36c2472817b5e573fc5501d1d28d Mon Sep 17 00:00:00 2001 From: Safia Abdalla Date: Thu, 1 Dec 2016 10:26:38 -0600 Subject: [PATCH] test: add tests for clearBuffer state machine This checks to see that clearBuffer appropriately decrements the correct values in _writableState when clearBuffer is invoked in end. Fixes: https://github.com/nodejs/node/issues/8687 PR-URL: https://github.com/nodejs/node/pull/9922 Reviewed-By: Matteo Collina --- ...ableState-uncorked-bufferedRequestCount.js | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 test/parallel/test-stream-writableState-uncorked-bufferedRequestCount.js diff --git a/test/parallel/test-stream-writableState-uncorked-bufferedRequestCount.js b/test/parallel/test-stream-writableState-uncorked-bufferedRequestCount.js new file mode 100644 index 00000000000000..3751cd9de6461d --- /dev/null +++ b/test/parallel/test-stream-writableState-uncorked-bufferedRequestCount.js @@ -0,0 +1,57 @@ +'use strict'; + +const common = require('../common'); +const assert = require('assert'); +const stream = require('stream'); + +const writable = new stream.Writable(); + +writable._writev = common.mustCall((chunks, cb) => { + assert.equal(chunks.length, 2, 'two chunks to write'); + cb(); +}, 1); + +writable._write = common.mustCall((chunk, encoding, cb) => { + cb(); +}, 1); + +// first cork +writable.cork(); +assert.strictEqual(writable._writableState.corked, 1); +assert.strictEqual(writable._writableState.bufferedRequestCount, 0); + +// cork again +writable.cork(); +assert.strictEqual(writable._writableState.corked, 2); + +// the first chunk is buffered +writable.write('first chunk'); +assert.strictEqual(writable._writableState.bufferedRequestCount, 1); + +// first uncork does nothing +writable.uncork(); +assert.strictEqual(writable._writableState.corked, 1); +assert.strictEqual(writable._writableState.bufferedRequestCount, 1); + +process.nextTick(uncork); + +// the second chunk is buffered, because we uncork at the end of tick +writable.write('second chunk'); +assert.strictEqual(writable._writableState.corked, 1); +assert.strictEqual(writable._writableState.bufferedRequestCount, 2); + +function uncork() { + // second uncork flushes the buffer + writable.uncork(); + assert.strictEqual(writable._writableState.corked, 0); + assert.strictEqual(writable._writableState.bufferedRequestCount, 0); + + // verify that end() uncorks correctly + writable.cork(); + writable.write('third chunk'); + writable.end(); + + // end causes an uncork() as well + assert.strictEqual(writable._writableState.corked, 0); + assert.strictEqual(writable._writableState.bufferedRequestCount, 0); +}