node/test/parallel/test-stream-readable-reading-readingMore.js
Tobias Nießen 4d8674b50f
test: fix multiple incorrect mustNotCall() uses
This does not fix occurrences in test/parallel/test-dns-* because those
tests contain unrelated pre-existing bugs that would cause the tests to
fail with this fix. This unrelated bug in those tests should be fixed
separately before the use of mustNotCall() can be fixed in those files.

PR-URL: https://github.com/nodejs/node/pull/44022
Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: Juan José Arboleda <soyjuanarbol@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
2022-08-30 20:31:11 +00:00

172 lines
4.4 KiB
JavaScript

'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 with a 'readable' listener
// we should not be reading more
if (readable.readableFlowing)
assert.strictEqual(state.readingMore, true);
// 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);
}
const expectedReadingMore = [true, true, false];
readable.on('readable', common.mustCall(() => {
// There is only one readingMore scheduled from on('data'),
// after which everything is governed by the .read() call
assert.strictEqual(state.readingMore, expectedReadingMore.shift());
// If the stream has ended, we shouldn't be reading
assert.strictEqual(state.ended, !state.reading);
// Consume all the data
while (readable.read() !== null);
if (expectedReadingMore.length === 0) // Reached end of stream
process.nextTick(common.mustCall(onStreamEnd, 1));
}, 3));
readable.on('end', common.mustCall(onStreamEnd));
readable.push('pushed');
readable.read(6);
// reading
assert.strictEqual(state.reading, true);
assert.strictEqual(state.readingMore, true);
// add chunk to front
readable.unshift('unshifted');
// end
readable.push(null);
}
{
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 without a 'readable' listener
// we should be reading more
if (readable.readableFlowing)
assert.strictEqual(state.readingMore, true);
// 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);
}
readable.on('end', common.mustCall(onStreamEnd));
readable.push('pushed');
// Stop emitting 'data' events
assert.strictEqual(state.flowing, true);
readable.pause();
// paused
assert.strictEqual(state.reading, false);
assert.strictEqual(state.flowing, false);
readable.resume();
assert.strictEqual(state.reading, false);
assert.strictEqual(state.flowing, true);
// add chunk to front
readable.unshift('unshifted');
// end
readable.push(null);
}
{
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);
const onReadable = common.mustNotCall();
readable.on('readable', onReadable);
readable.on('data', common.mustCall((data) => {
// Reading as long as we've not ended
assert.strictEqual(state.reading, !state.ended);
}, 2));
readable.removeListener('readable', onReadable);
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('end', common.mustCall(onStreamEnd));
readable.push('pushed');
// We are still not flowing, we will be resuming in the next tick
assert.strictEqual(state.flowing, false);
// Wait for nextTick, so the readableListener flag resets
process.nextTick(function() {
readable.resume();
// Stop emitting 'data' events
assert.strictEqual(state.flowing, true);
readable.pause();
// paused
assert.strictEqual(state.flowing, false);
readable.resume();
assert.strictEqual(state.flowing, true);
// add chunk to front
readable.unshift('unshifted');
// end
readable.push(null);
});
}