summaryrefslogtreecommitdiff
path: root/test/parallel/test-stream-writable-write-cb-error.js
diff options
context:
space:
mode:
Diffstat (limited to 'test/parallel/test-stream-writable-write-cb-error.js')
-rw-r--r--test/parallel/test-stream-writable-write-cb-error.js58
1 files changed, 58 insertions, 0 deletions
diff --git a/test/parallel/test-stream-writable-write-cb-error.js b/test/parallel/test-stream-writable-write-cb-error.js
new file mode 100644
index 0000000000..72db1b7e3f
--- /dev/null
+++ b/test/parallel/test-stream-writable-write-cb-error.js
@@ -0,0 +1,58 @@
+'use strict';
+const common = require('../common');
+const { Writable } = require('stream');
+const assert = require('assert');
+
+// Ensure callback is always invoked before
+// error is emitted. Regardless if error was
+// sync or async.
+
+{
+ let callbackCalled = false;
+ // Sync Error
+ const writable = new Writable({
+ write: common.mustCall((buf, enc, cb) => {
+ cb(new Error());
+ })
+ });
+ writable.on('error', common.mustCall(() => {
+ assert.strictEqual(callbackCalled, true);
+ }));
+ writable.write('hi', common.mustCall(() => {
+ callbackCalled = true;
+ }));
+}
+
+{
+ let callbackCalled = false;
+ // Async Error
+ const writable = new Writable({
+ write: common.mustCall((buf, enc, cb) => {
+ process.nextTick(cb, new Error());
+ })
+ });
+ writable.on('error', common.mustCall(() => {
+ assert.strictEqual(callbackCalled, true);
+ }));
+ writable.write('hi', common.mustCall(() => {
+ callbackCalled = true;
+ }));
+}
+
+{
+ // Sync Error
+ const writable = new Writable({
+ write: common.mustCall((buf, enc, cb) => {
+ cb(new Error());
+ })
+ });
+
+ writable.on('error', common.mustCall());
+
+ let cnt = 0;
+ // Ensure we don't live lock on sync error
+ while (writable.write('a'))
+ cnt++;
+
+ assert.strictEqual(cnt, 0);
+}