From 19432adafc6181abf8ea7c87457f7fea16e16dee Mon Sep 17 00:00:00 2001 From: Gregory Date: Thu, 1 Dec 2016 01:52:23 -0500 Subject: [PATCH 1/7] Streams: add test for _readableState.readingMore | #8685 --- .../test-stream-readable-readingMore.js | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 test/parallel/test-stream-readable-readingMore.js diff --git a/test/parallel/test-stream-readable-readingMore.js b/test/parallel/test-stream-readable-readingMore.js new file mode 100644 index 00000000000000..420d76e66aa1bb --- /dev/null +++ b/test/parallel/test-stream-readable-readingMore.js @@ -0,0 +1,36 @@ +'use strict'; +const Readable = require('stream').Readable, + common = require('../common'), + assert = require('assert'); + +const readable = new Readable({ + highWaterMark: 4, + read(size) {} +}); + +// false initially +assert.strictEqual(readable._readableState.readingMore, false); + +readable.on('data', data => { + const state = readable._readableState; + + // still in a flowing state, try to read more + assert.strictEqual(state.readingMore, true); + + const lenSurpassesWMark = state.length + data.length > state.highWaterMark, + emptyData = !data; + + process.nextTick(() => { + assert.strictEqual(state.readingMore, !(lenSurpassesWMark || emptyData)); + }); +}); + +readable.on('end', () => { + // end of stream + // reading is false, and so should be readingMore + assert.strictEqual(readable._readableState.readingMore, false); +}); + +readable.push("abc"); +readable.push("abcdef"); +readable.push(null); From 370674a1baddddcf11eb937f05872b42fe4bed96 Mon Sep 17 00:00:00 2001 From: Gregory Date: Thu, 1 Dec 2016 02:36:59 -0500 Subject: [PATCH 2/7] readingMore is always false on nextTick(); simplify --- .../test-stream-readable-readingMore.js | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/test/parallel/test-stream-readable-readingMore.js b/test/parallel/test-stream-readable-readingMore.js index 420d76e66aa1bb..9e768a7bb306e9 100644 --- a/test/parallel/test-stream-readable-readingMore.js +++ b/test/parallel/test-stream-readable-readingMore.js @@ -1,10 +1,8 @@ 'use strict'; const Readable = require('stream').Readable, - common = require('../common'), assert = require('assert'); const readable = new Readable({ - highWaterMark: 4, read(size) {} }); @@ -12,17 +10,8 @@ const readable = new Readable({ assert.strictEqual(readable._readableState.readingMore, false); readable.on('data', data => { - const state = readable._readableState; - // still in a flowing state, try to read more - assert.strictEqual(state.readingMore, true); - - const lenSurpassesWMark = state.length + data.length > state.highWaterMark, - emptyData = !data; - - process.nextTick(() => { - assert.strictEqual(state.readingMore, !(lenSurpassesWMark || emptyData)); - }); + assert.strictEqual(readable._readableState.readingMore, true); }); readable.on('end', () => { @@ -31,6 +20,12 @@ readable.on('end', () => { assert.strictEqual(readable._readableState.readingMore, false); }); + readable.push("abc"); -readable.push("abcdef"); readable.push(null); + +process.nextTick(() => { + // finished reading + // reading is false, and so should be readingMore + assert.strictEqual(readable._readableState.readingMore, false); +}); From 9747c043691c4d42a217fe7d0ab7b81e3c65765b Mon Sep 17 00:00:00 2001 From: Gregory Date: Thu, 1 Dec 2016 14:46:38 -0500 Subject: [PATCH 3/7] common.mustCall's, follow punctuation and syntax rules --- .../test-stream-readable-readingMore.js | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/test/parallel/test-stream-readable-readingMore.js b/test/parallel/test-stream-readable-readingMore.js index 9e768a7bb306e9..b181cf23da2b60 100644 --- a/test/parallel/test-stream-readable-readingMore.js +++ b/test/parallel/test-stream-readable-readingMore.js @@ -1,31 +1,31 @@ 'use strict'; -const Readable = require('stream').Readable, - assert = require('assert'); +const common = require('../common'); +const assert = require('assert'); +const Readable = require('stream').Readable; const readable = new Readable({ read(size) {} }); -// false initially +// Starting off with false initially. assert.strictEqual(readable._readableState.readingMore, false); -readable.on('data', data => { - // still in a flowing state, try to read more +readable.on('data', common.mustCall((data) => { + // Still in a flowing state, should try to read more. assert.strictEqual(readable._readableState.readingMore, true); -}); +})); -readable.on('end', () => { - // end of stream - // reading is false, and so should be readingMore +readable.on('end', common.mustCall(() => { + // End of stream; _readableState.reading is false + // And so should be readingMore. assert.strictEqual(readable._readableState.readingMore, false); -}); - +})); -readable.push("abc"); -readable.push(null); +readable.push('abc'); +readable.push(null); // end process.nextTick(() => { - // finished reading - // reading is false, and so should be readingMore + // Finished reading. _readableState.reading is false. + // readingMore then should be false as well. assert.strictEqual(readable._readableState.readingMore, false); }); From 71ebbbc5e3968c9734739903e9d143892b02d50b Mon Sep 17 00:00:00 2001 From: Gregory Date: Wed, 7 Dec 2016 00:13:59 -0500 Subject: [PATCH 4/7] Incorporate tests for state.reading --- ...est-stream-readable-reading-readingMore.js | 54 +++++++++++++++++++ .../test-stream-readable-readingMore.js | 31 ----------- 2 files changed, 54 insertions(+), 31 deletions(-) create mode 100644 test/parallel/test-stream-readable-reading-readingMore.js delete mode 100644 test/parallel/test-stream-readable-readingMore.js diff --git a/test/parallel/test-stream-readable-reading-readingMore.js b/test/parallel/test-stream-readable-reading-readingMore.js new file mode 100644 index 00000000000000..f78b127f202e03 --- /dev/null +++ b/test/parallel/test-stream-readable-reading-readingMore.js @@ -0,0 +1,54 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const Readable = require('stream').Readable; + +const readable = new Readable({ + read(size) {} +}); + +const state = readable._readableState; + +// Starting off with false initially. +assert.strictEqual(state.reading, false); +assert.strictEqual(state.readingMore, false); + +readable.on('data', common.mustCall((data) => { + // while in a flowing state, should try to read more. + if (state.flowing) + assert.strictEqual(state.readingMore, true); + + // reading as long as we've not ended + assert.strictEqual(state.reading, !state.ended); +}, 2)); + +readable.on('end', common.mustCall(() => { + // End of stream; _readableState.reading is false + // And so should be readingMore. + assert.strictEqual(state.readingMore, false); + assert.strictEqual(state.reading, false); +})); + +readable.push('pushed'); + +// stop emitting 'data' events +readable.pause(); + +// read() should only be called while operating in paused mode +readable.read(6); + +// reading +assert.strictEqual(state.reading, true); + +// resume emitting 'data' events +readable.resume(); + +// add chunk to front +readable.unshift('unshifted'); +readable.push(null); // end + +process.nextTick(() => { + // Finished reading. _readableState.reading is false. + // readingMore then should be false as well. + assert.strictEqual(state.readingMore, false); +}); diff --git a/test/parallel/test-stream-readable-readingMore.js b/test/parallel/test-stream-readable-readingMore.js deleted file mode 100644 index b181cf23da2b60..00000000000000 --- a/test/parallel/test-stream-readable-readingMore.js +++ /dev/null @@ -1,31 +0,0 @@ -'use strict'; -const common = require('../common'); -const assert = require('assert'); -const Readable = require('stream').Readable; - -const readable = new Readable({ - read(size) {} -}); - -// Starting off with false initially. -assert.strictEqual(readable._readableState.readingMore, false); - -readable.on('data', common.mustCall((data) => { - // Still in a flowing state, should try to read more. - assert.strictEqual(readable._readableState.readingMore, true); -})); - -readable.on('end', common.mustCall(() => { - // End of stream; _readableState.reading is false - // And so should be readingMore. - assert.strictEqual(readable._readableState.readingMore, false); -})); - -readable.push('abc'); -readable.push(null); // end - -process.nextTick(() => { - // Finished reading. _readableState.reading is false. - // readingMore then should be false as well. - assert.strictEqual(readable._readableState.readingMore, false); -}); From 1e6428ef77cec61c7c94c37dfe78452c1331750d Mon Sep 17 00:00:00 2001 From: Gregory Date: Wed, 7 Dec 2016 00:14:45 -0500 Subject: [PATCH 5/7] Add missing reading check on nextTick() --- test/parallel/test-stream-readable-reading-readingMore.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/parallel/test-stream-readable-reading-readingMore.js b/test/parallel/test-stream-readable-reading-readingMore.js index f78b127f202e03..3f27d46e154dc1 100644 --- a/test/parallel/test-stream-readable-reading-readingMore.js +++ b/test/parallel/test-stream-readable-reading-readingMore.js @@ -51,4 +51,5 @@ process.nextTick(() => { // Finished reading. _readableState.reading is false. // readingMore then should be false as well. assert.strictEqual(state.readingMore, false); + assert.strictEqual(state.reading, false); }); From 466c083a718d2297c27d337feba624416b71e7af Mon Sep 17 00:00:00 2001 From: Gregory Date: Fri, 9 Dec 2016 01:47:44 -0500 Subject: [PATCH 6/7] Add reading and readingMore tests for 'readable' event --- ...est-stream-readable-reading-readingMore.js | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/test/parallel/test-stream-readable-reading-readingMore.js b/test/parallel/test-stream-readable-reading-readingMore.js index 3f27d46e154dc1..2f88c1490ccc13 100644 --- a/test/parallel/test-stream-readable-reading-readingMore.js +++ b/test/parallel/test-stream-readable-reading-readingMore.js @@ -22,12 +22,26 @@ readable.on('data', common.mustCall((data) => { assert.strictEqual(state.reading, !state.ended); }, 2)); -readable.on('end', common.mustCall(() => { - // End of stream; _readableState.reading is false +function onStreamEnd() { + // End of stream; state.reading is false // And so should be readingMore. assert.strictEqual(state.readingMore, false); assert.strictEqual(state.reading, false); -})); +} + +readable.on('readable', common.mustCall(() => { + // 'readable' always gets called before 'end' + // since 'end' hasn't been emitted, more data could be incoming + assert.strictEqual(state.readingMore, true); + + // if the stream has ended, we shouldn't be reading + assert.strictEqual(state.ended, !state.reading); + + if (readable.read() === null) // reached end of stream + process.nextTick(common.mustCall(onStreamEnd, 1)); +}, 2)); + +readable.on('end', common.mustCall(onStreamEnd)); readable.push('pushed'); @@ -39,17 +53,13 @@ readable.read(6); // reading assert.strictEqual(state.reading, true); +assert.strictEqual(state.readingMore, true); // resume emitting 'data' events readable.resume(); // add chunk to front readable.unshift('unshifted'); -readable.push(null); // end -process.nextTick(() => { - // Finished reading. _readableState.reading is false. - // readingMore then should be false as well. - assert.strictEqual(state.readingMore, false); - assert.strictEqual(state.reading, false); -}); +// end +readable.push(null); From 29739498328174b45c58c6c86cb01bb07663b51d Mon Sep 17 00:00:00 2001 From: Gregory Date: Fri, 9 Dec 2016 01:53:24 -0500 Subject: [PATCH 7/7] indent with two spaces --- ...est-stream-readable-reading-readingMore.js | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/test/parallel/test-stream-readable-reading-readingMore.js b/test/parallel/test-stream-readable-reading-readingMore.js index 2f88c1490ccc13..bee3a1c82a8678 100644 --- a/test/parallel/test-stream-readable-reading-readingMore.js +++ b/test/parallel/test-stream-readable-reading-readingMore.js @@ -4,7 +4,7 @@ const assert = require('assert'); const Readable = require('stream').Readable; const readable = new Readable({ - read(size) {} + read(size) {} }); const state = readable._readableState; @@ -14,31 +14,31 @@ assert.strictEqual(state.reading, false); assert.strictEqual(state.readingMore, false); readable.on('data', common.mustCall((data) => { - // while in a flowing state, should try to read more. - if (state.flowing) - assert.strictEqual(state.readingMore, true); + // while in a flowing state, should try to read more. + if (state.flowing) + assert.strictEqual(state.readingMore, true); - // reading as long as we've not ended - assert.strictEqual(state.reading, !state.ended); + // reading as long as we've not ended + assert.strictEqual(state.reading, !state.ended); }, 2)); function onStreamEnd() { - // End of stream; state.reading is false - // And so should be readingMore. - assert.strictEqual(state.readingMore, false); - assert.strictEqual(state.reading, false); + // End of stream; state.reading is false + // And so should be readingMore. + assert.strictEqual(state.readingMore, false); + assert.strictEqual(state.reading, false); } readable.on('readable', common.mustCall(() => { - // 'readable' always gets called before 'end' - // since 'end' hasn't been emitted, more data could be incoming - assert.strictEqual(state.readingMore, true); + // 'readable' always gets called before 'end' + // since 'end' hasn't been emitted, more data could be incoming + assert.strictEqual(state.readingMore, true); - // if the stream has ended, we shouldn't be reading - assert.strictEqual(state.ended, !state.reading); + // if the stream has ended, we shouldn't be reading + assert.strictEqual(state.ended, !state.reading); - if (readable.read() === null) // reached end of stream - process.nextTick(common.mustCall(onStreamEnd, 1)); + if (readable.read() === null) // reached end of stream + process.nextTick(common.mustCall(onStreamEnd, 1)); }, 2)); readable.on('end', common.mustCall(onStreamEnd));