Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorRobert Nagy <ronagy@icloud.com>2019-12-08 11:12:14 +0300
committerRuben Bridgewater <ruben@bridgewater.de>2019-12-15 17:18:21 +0300
commit67ed526ab03c3e9b2f41290b7cd6e9c2e7d9b4dd (patch)
treea3a7f1a609a846ba3f272775d34bedbda13a84ce /test
parent2d138965971109ddf6a583f78e5cdc3026c5f7f4 (diff)
stream: error state cleanup
Clean up end simplify errored state. - errorEmitted should be set in the same tick as 'error' is emitted. - errored should be set as soon as an error occurs. - errored should exist on Readable as well. - refactor destroy logic and make it easier to follow. PR-URL: https://github.com/nodejs/node/pull/30851 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Anna Henningsen <anna@addaleax.net>
Diffstat (limited to 'test')
-rw-r--r--test/parallel/test-stream-readable-destroy.js57
-rw-r--r--test/parallel/test-stream-writable-destroy.js34
2 files changed, 82 insertions, 9 deletions
diff --git a/test/parallel/test-stream-readable-destroy.js b/test/parallel/test-stream-readable-destroy.js
index 7687ea90cc8..d446dd36117 100644
--- a/test/parallel/test-stream-readable-destroy.js
+++ b/test/parallel/test-stream-readable-destroy.js
@@ -129,13 +129,20 @@ const assert = require('assert');
cb(expected);
});
+ let ticked = false;
read.on('end', common.mustNotCall('no end event'));
read.on('error', common.mustCall((err) => {
+ assert.strictEqual(ticked, true);
+ assert.strictEqual(read._readableState.errorEmitted, true);
+ assert.strictEqual(read._readableState.errored, true);
assert.strictEqual(err, expected);
}));
read.destroy();
+ assert.strictEqual(read._readableState.errorEmitted, false);
+ assert.strictEqual(read._readableState.errored, true);
assert.strictEqual(read.destroyed, true);
+ ticked = true;
}
{
@@ -174,10 +181,58 @@ const assert = require('assert');
const expected = new Error('kaboom');
- read.on('close', common.mustCall());
+ let ticked = false;
+ read.on('close', common.mustCall(() => {
+ assert.strictEqual(read._readableState.errorEmitted, false);
+ assert.strictEqual(ticked, true);
+ }));
+ // 'error' should not be emitted since a callback is passed to
+ // destroy(err, callback);
+ read.on('error', common.mustNotCall());
+
+ assert.strictEqual(read._readableState.errored, false);
+ assert.strictEqual(read._readableState.errorEmitted, false);
+
read.destroy(expected, common.mustCall(function(err) {
+ assert.strictEqual(read._readableState.errored, true);
assert.strictEqual(err, expected);
}));
+ assert.strictEqual(read._readableState.errorEmitted, false);
+ assert.strictEqual(read._readableState.errored, true);
+ ticked = true;
+}
+
+{
+ const readable = new Readable({
+ destroy: common.mustCall(function(err, cb) {
+ process.nextTick(cb, new Error('kaboom 1'));
+ }),
+ read() {}
+ });
+
+ let ticked = false;
+ readable.on('close', common.mustCall(() => {
+ assert.strictEqual(ticked, true);
+ assert.strictEqual(readable._readableState.errorEmitted, true);
+ }));
+ readable.on('error', common.mustCall((err) => {
+ assert.strictEqual(ticked, true);
+ assert.strictEqual(err.message, 'kaboom 2');
+ assert.strictEqual(readable._readableState.errorEmitted, true);
+ }));
+
+ readable.destroy();
+ assert.strictEqual(readable.destroyed, true);
+ assert.strictEqual(readable._readableState.errored, false);
+ assert.strictEqual(readable._readableState.errorEmitted, false);
+
+ // Test case where `readable.destroy()` is called again with an error before
+ // the `_destroy()` callback is called.
+ readable.destroy(new Error('kaboom 2'));
+ assert.strictEqual(readable._readableState.errorEmitted, false);
+ assert.strictEqual(readable._readableState.errored, true);
+
+ ticked = true;
}
{
diff --git a/test/parallel/test-stream-writable-destroy.js b/test/parallel/test-stream-writable-destroy.js
index 1186c618634..d321d808199 100644
--- a/test/parallel/test-stream-writable-destroy.js
+++ b/test/parallel/test-stream-writable-destroy.js
@@ -157,13 +157,22 @@ const assert = require('assert');
write(chunk, enc, cb) { cb(); }
});
- write.on('close', common.mustCall());
- write.on('error', common.mustCall());
+ let ticked = false;
+ write.on('close', common.mustCall(() => {
+ assert.strictEqual(ticked, true);
+ }));
+ write.on('error', common.mustCall((err) => {
+ assert.strictEqual(ticked, true);
+ assert.strictEqual(err.message, 'kaboom 1');
+ assert.strictEqual(write._writableState.errorEmitted, true);
+ }));
write.destroy(new Error('kaboom 1'));
write.destroy(new Error('kaboom 2'));
- assert.strictEqual(write._writableState.errorEmitted, true);
+ assert.strictEqual(write._writableState.errored, true);
+ assert.strictEqual(write._writableState.errorEmitted, false);
assert.strictEqual(write.destroyed, true);
+ ticked = true;
}
{
@@ -176,20 +185,29 @@ const assert = require('assert');
}
});
- writable.on('close', common.mustCall());
- writable.on('error', common.expectsError({
- type: Error,
- message: 'kaboom 2'
+ let ticked = false;
+ writable.on('close', common.mustCall(() => {
+ assert.strictEqual(ticked, true);
+ assert.strictEqual(writable._writableState.errorEmitted, true);
+ }));
+ writable.on('error', common.mustCall((err) => {
+ assert.strictEqual(ticked, true);
+ assert.strictEqual(err.message, 'kaboom 2');
+ assert.strictEqual(writable._writableState.errorEmitted, true);
}));
writable.destroy();
assert.strictEqual(writable.destroyed, true);
+ assert.strictEqual(writable._writableState.errored, false);
assert.strictEqual(writable._writableState.errorEmitted, false);
// Test case where `writable.destroy()` is called again with an error before
// the `_destroy()` callback is called.
writable.destroy(new Error('kaboom 2'));
- assert.strictEqual(writable._writableState.errorEmitted, true);
+ assert.strictEqual(writable._writableState.errorEmitted, false);
+ assert.strictEqual(writable._writableState.errored, true);
+
+ ticked = true;
}
{