From 4f54f7b76ac2843d9db151e2284f668e9477f226 Mon Sep 17 00:00:00 2001 From: Moshe Kolodny Date: Fri, 2 Mar 2018 15:37:13 -0500 Subject: [PATCH] Fixed broken lolex integration. --- build/files.js | 8 +++---- lib/_stream_duplex.js | 6 ++--- lib/_stream_readable.js | 14 ++++++------ lib/_stream_writable.js | 16 +++++++------- lib/internal/streams/destroy.js | 6 ++--- package.json | 1 + test/ours/lolex-fake-timers.js | 39 +++++++++++++++++++++++++++++++++ 7 files changed, 65 insertions(+), 25 deletions(-) create mode 100644 test/ours/lolex-fake-timers.js diff --git a/build/files.js b/build/files.js index f386ddda5c..47be3645f4 100644 --- a/build/files.js +++ b/build/files.js @@ -125,14 +125,14 @@ const headRegexp = /(^module.exports = \w+;?)/m , `$1 /**/ - var processNextTick = require(\'process-nextick-args\').nextTick; + var pna = require(\'process-nextick-args\'); /**/ ` ] , processNextTickReplacement = [ /process.nextTick\(/g - , 'processNextTick(' + , 'pna.nextTick(' ] , internalUtilReplacement = [ @@ -145,12 +145,12 @@ const headRegexp = /(^module.exports = \w+;?)/m , `$1 /**/ - var asyncWrite = !process.browser && ['v0.10' , 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick; + var asyncWrite = !process.browser && ['v0.10' , 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; /**/ ` ] , fixSyncWrite = [ - /if \(sync\) {\n\s+processNextTick\(afterWrite, stream, state, finished, cb\);\n\s+}/ + /if \(sync\) {\n\s+pna.nextTick\(afterWrite, stream, state, finished, cb\);\n\s+}/ , `if (sync) { /**/ asyncWrite(afterWrite, stream, state, finished, cb); diff --git a/lib/_stream_duplex.js b/lib/_stream_duplex.js index 4f2556acad..1045089182 100644 --- a/lib/_stream_duplex.js +++ b/lib/_stream_duplex.js @@ -28,7 +28,7 @@ /**/ -var processNextTick = require('process-nextick-args').nextTick; +var pna = require('process-nextick-args'); /**/ /**/ @@ -82,7 +82,7 @@ function onend() { // no more data can be written. // But allow more writes to happen in this tick. - processNextTick(onEndNT, this); + pna.nextTick(onEndNT, this); } function onEndNT(self) { @@ -114,7 +114,7 @@ Duplex.prototype._destroy = function (err, cb) { this.push(null); this.end(); - processNextTick(cb, err); + pna.nextTick(cb, err); }; function forEach(xs, f) { diff --git a/lib/_stream_readable.js b/lib/_stream_readable.js index 1002199adf..af150f434c 100644 --- a/lib/_stream_readable.js +++ b/lib/_stream_readable.js @@ -23,7 +23,7 @@ /**/ -var processNextTick = require('process-nextick-args').nextTick; +var pna = require('process-nextick-args'); /**/ module.exports = Readable; @@ -495,7 +495,7 @@ function emitReadable(stream) { if (!state.emittedReadable) { debug('emitReadable', state.flowing); state.emittedReadable = true; - if (state.sync) processNextTick(emitReadable_, stream);else emitReadable_(stream); + if (state.sync) pna.nextTick(emitReadable_, stream);else emitReadable_(stream); } } @@ -514,7 +514,7 @@ function emitReadable_(stream) { function maybeReadMore(stream, state) { if (!state.readingMore) { state.readingMore = true; - processNextTick(maybeReadMore_, stream, state); + pna.nextTick(maybeReadMore_, stream, state); } } @@ -559,7 +559,7 @@ Readable.prototype.pipe = function (dest, pipeOpts) { var doEnd = (!pipeOpts || pipeOpts.end !== false) && dest !== process.stdout && dest !== process.stderr; var endFn = doEnd ? onend : unpipe; - if (state.endEmitted) processNextTick(endFn);else src.once('end', endFn); + if (state.endEmitted) pna.nextTick(endFn);else src.once('end', endFn); dest.on('unpipe', onunpipe); function onunpipe(readable, unpipeInfo) { @@ -749,7 +749,7 @@ Readable.prototype.on = function (ev, fn) { state.readableListening = state.needReadable = true; state.emittedReadable = false; if (!state.reading) { - processNextTick(nReadingNextTick, this); + pna.nextTick(nReadingNextTick, this); } else if (state.length) { emitReadable(this); } @@ -780,7 +780,7 @@ Readable.prototype.resume = function () { function resume(stream, state) { if (!state.resumeScheduled) { state.resumeScheduled = true; - processNextTick(resume_, stream, state); + pna.nextTick(resume_, stream, state); } } @@ -988,7 +988,7 @@ function endReadable(stream) { if (!state.endEmitted) { state.ended = true; - processNextTick(endReadableNT, state, stream); + pna.nextTick(endReadableNT, state, stream); } } diff --git a/lib/_stream_writable.js b/lib/_stream_writable.js index 95125f927f..0e1c28df51 100644 --- a/lib/_stream_writable.js +++ b/lib/_stream_writable.js @@ -27,7 +27,7 @@ /**/ -var processNextTick = require('process-nextick-args').nextTick; +var pna = require('process-nextick-args'); /**/ module.exports = Writable; @@ -54,7 +54,7 @@ function CorkedRequest(state) { /* */ /**/ -var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : processNextTick; +var asyncWrite = !process.browser && ['v0.10', 'v0.9.'].indexOf(process.version.slice(0, 5)) > -1 ? setImmediate : pna.nextTick; /**/ /**/ @@ -288,7 +288,7 @@ function writeAfterEnd(stream, cb) { var er = new Error('write after end'); // TODO: defer error events consistently everywhere, not just the cb stream.emit('error', er); - processNextTick(cb, er); + pna.nextTick(cb, er); } // Checks that a user-supplied chunk is valid, especially for the particular @@ -305,7 +305,7 @@ function validChunk(stream, state, chunk, cb) { } if (er) { stream.emit('error', er); - processNextTick(cb, er); + pna.nextTick(cb, er); valid = false; } return valid; @@ -425,10 +425,10 @@ function onwriteError(stream, state, sync, er, cb) { if (sync) { // defer the callback if we are being called synchronously // to avoid piling up things on the stack - processNextTick(cb, er); + pna.nextTick(cb, er); // this can emit finish, and it will always happen // after error - processNextTick(finishMaybe, stream, state); + pna.nextTick(finishMaybe, stream, state); stream._writableState.errorEmitted = true; stream.emit('error', er); } else { @@ -603,7 +603,7 @@ function prefinish(stream, state) { if (typeof stream._final === 'function') { state.pendingcb++; state.finalCalled = true; - processNextTick(callFinal, stream, state); + pna.nextTick(callFinal, stream, state); } else { state.prefinished = true; stream.emit('prefinish'); @@ -627,7 +627,7 @@ function endWritable(stream, state, cb) { state.ending = true; finishMaybe(stream, state); if (cb) { - if (state.finished) processNextTick(cb);else stream.once('finish', cb); + if (state.finished) pna.nextTick(cb);else stream.once('finish', cb); } state.ended = true; stream.writable = false; diff --git a/lib/internal/streams/destroy.js b/lib/internal/streams/destroy.js index 134cabf893..5a0a0d88ce 100644 --- a/lib/internal/streams/destroy.js +++ b/lib/internal/streams/destroy.js @@ -2,7 +2,7 @@ /**/ -var processNextTick = require('process-nextick-args').nextTick; +var pna = require('process-nextick-args'); /**/ // undocumented cb() API, needed for core, not for public API @@ -16,7 +16,7 @@ function destroy(err, cb) { if (cb) { cb(err); } else if (err && (!this._writableState || !this._writableState.errorEmitted)) { - processNextTick(emitErrorNT, this, err); + pna.nextTick(emitErrorNT, this, err); } return this; } @@ -35,7 +35,7 @@ function destroy(err, cb) { this._destroy(err || null, function (err) { if (!cb && err) { - processNextTick(emitErrorNT, _this, err); + pna.nextTick(emitErrorNT, _this, err); if (_this._writableState) { _this._writableState.errorEmitted = true; } diff --git a/package.json b/package.json index 9e315e1f6d..659680b897 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "assert": "^1.4.0", "babel-polyfill": "^6.9.1", "buffer": "^4.9.0", + "lolex": "^2.3.2", "nyc": "^6.4.0", "tap": "^0.7.0", "tape": "^4.8.0", diff --git a/test/ours/lolex-fake-timers.js b/test/ours/lolex-fake-timers.js new file mode 100644 index 0000000000..7b7a73e7dc --- /dev/null +++ b/test/ours/lolex-fake-timers.js @@ -0,0 +1,39 @@ +require('../common'); +var util = require('util'); +var assert = require('assert'); +var lolex = require('lolex'); +var stream = require('../../'); +var Transform = stream.Transform; + +function MyTransform() { + Transform.call(this); +} + +util.inherits(MyTransform, Transform); + +const clock = lolex.install({toFake: [ 'setImmediate', 'nextTick' ]}); +let stream2DataCalled = false; + +var stream = new MyTransform(); +stream.on('data', function() { + stream.on('end', function() { + + var stream2 = new MyTransform(); + stream2.on('data', function() { + stream2.on('end', function() { + stream2DataCalled = true + }); + setImmediate(function() { + stream2.end() + }); + }); + stream2.emit('data') + + }); + stream.end(); +}); +stream.emit('data'); + +clock.runAll() +clock.uninstall(); +assert(stream2DataCalled);