node/test/parallel/test-stream-transform-destroy.js
Matteo Collina 330c8d743e stream: add destroy and _destroy methods.
Adds destroy() and _destroy() methods to Readable, Writable, Duplex
and Transform. It also standardizes the behavior and the implementation
of destroy(), which has been inconsistent in userland and core.
This PR also updates all the subsystems of core to use the new
destroy().

PR-URL: https://github.com/nodejs/node/pull/12925
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Calvin Metcalf <calvin.metcalf@gmail.com>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
2017-05-22 08:34:14 +02:00

144 lines
3.2 KiB
JavaScript

'use strict';
const common = require('../common');
const { Transform } = require('stream');
const assert = require('assert');
{
const transform = new Transform({
transform(chunk, enc, cb) {}
});
transform.resume();
transform.on('end', common.mustCall());
transform.on('close', common.mustCall());
transform.on('finish', common.mustCall());
transform.destroy();
}
{
const transform = new Transform({
transform(chunk, enc, cb) {}
});
transform.resume();
const expected = new Error('kaboom');
transform.on('end', common.mustCall());
transform.on('finish', common.mustCall());
transform.on('close', common.mustCall());
transform.on('error', common.mustCall((err) => {
assert.strictEqual(err, expected);
}));
transform.destroy(expected);
}
{
const transform = new Transform({
transform(chunk, enc, cb) {}
});
transform._destroy = common.mustCall(function(err, cb) {
assert.strictEqual(err, expected);
cb(err);
}, 1);
const expected = new Error('kaboom');
transform.on('finish', common.mustNotCall('no finish event'));
transform.on('close', common.mustNotCall('no close event'));
transform.on('error', common.mustCall((err) => {
assert.strictEqual(err, expected);
}));
transform.destroy(expected);
}
{
const expected = new Error('kaboom');
const transform = new Transform({
transform(chunk, enc, cb) {},
destroy: common.mustCall(function(err, cb) {
assert.strictEqual(err, expected);
cb();
}, 1)
});
transform.resume();
transform.on('end', common.mustNotCall('no end event'));
transform.on('close', common.mustNotCall('no close event'));
transform.on('finish', common.mustNotCall('no finish event'));
// error is swallowed by the custom _destroy
transform.on('error', common.mustNotCall('no error event'));
transform.destroy(expected);
}
{
const transform = new Transform({
transform(chunk, enc, cb) {}
});
transform._destroy = common.mustCall(function(err, cb) {
assert.strictEqual(err, null);
cb();
}, 1);
transform.destroy();
}
{
const transform = new Transform({
transform(chunk, enc, cb) {}
});
transform.resume();
transform._destroy = common.mustCall(function(err, cb) {
assert.strictEqual(err, null);
process.nextTick(() => {
this.push(null);
this.end();
cb();
});
}, 1);
const fail = common.mustNotCall('no event');
transform.on('finish', fail);
transform.on('end', fail);
transform.on('close', fail);
transform.destroy();
transform.removeListener('end', fail);
transform.removeListener('finish', fail);
transform.on('end', common.mustCall());
transform.on('finish', common.mustCall());
}
{
const transform = new Transform({
transform(chunk, enc, cb) {}
});
const expected = new Error('kaboom');
transform._destroy = common.mustCall(function(err, cb) {
assert.strictEqual(err, null);
cb(expected);
}, 1);
transform.on('close', common.mustNotCall('no close event'));
transform.on('finish', common.mustNotCall('no finish event'));
transform.on('end', common.mustNotCall('no end event'));
transform.on('error', common.mustCall((err) => {
assert.strictEqual(err, expected);
}));
transform.destroy();
}