deno.land / std@0.166.0 / node / _tools / test / parallel / test-stream-readable-destroy.js
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413// deno-fmt-ignore-file// deno-lint-ignore-file
// Copyright Joyent and Node contributors. All rights reserved. MIT license.// Taken from Node 18.12.0// This file is automatically generated by "node/_tools/setup.ts". Do not modify this file manually
'use strict';
const common = require('../common');const { Readable, addAbortSignal } = require('stream');const assert = require('assert');
{ const read = new Readable({ read() {} }); read.resume();
read.on('close', common.mustCall());
read.destroy(); assert.strictEqual(read.errored, null); assert.strictEqual(read.destroyed, true);}
{ const read = new Readable({ read() {} }); read.resume();
const expected = new Error('kaboom');
read.on('end', common.mustNotCall('no end event')); read.on('close', common.mustCall()); read.on('error', common.mustCall((err) => { assert.strictEqual(err, expected); }));
read.destroy(expected); assert.strictEqual(read.errored, expected); assert.strictEqual(read.destroyed, true);}
{ const read = new Readable({ read() {} });
read._destroy = common.mustCall(function(err, cb) { assert.strictEqual(err, expected); cb(err); });
const expected = new Error('kaboom');
read.on('end', common.mustNotCall('no end event')); read.on('close', common.mustCall()); read.on('error', common.mustCall((err) => { assert.strictEqual(err, expected); }));
read.destroy(expected); assert.strictEqual(read.destroyed, true);}
{ const read = new Readable({ read() {}, destroy: common.mustCall(function(err, cb) { assert.strictEqual(err, expected); cb(); }) });
const expected = new Error('kaboom');
read.on('end', common.mustNotCall('no end event'));
// Error is swallowed by the custom _destroy read.on('error', common.mustNotCall('no error event')); read.on('close', common.mustCall());
read.destroy(expected); assert.strictEqual(read.destroyed, true);}
{ const read = new Readable({ read() {} });
read._destroy = common.mustCall(function(err, cb) { assert.strictEqual(err, null); cb(); });
read.destroy(); assert.strictEqual(read.destroyed, true);}
{ const read = new Readable({ read() {} }); read.resume();
read._destroy = common.mustCall(function(err, cb) { assert.strictEqual(err, null); process.nextTick(() => { this.push(null); cb(); }); });
const fail = common.mustNotCall('no end event');
read.on('end', fail); read.on('close', common.mustCall());
read.destroy();
read.removeListener('end', fail); read.on('end', common.mustNotCall()); assert.strictEqual(read.destroyed, true);}
{ const read = new Readable({ read() {} });
const expected = new Error('kaboom');
read._destroy = common.mustCall(function(err, cb) { assert.strictEqual(err, null); 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, expected); assert.strictEqual(err, expected); }));
read.destroy(); assert.strictEqual(read._readableState.errorEmitted, false); assert.strictEqual(read._readableState.errored, expected); assert.strictEqual(read.destroyed, true); ticked = true;}
{ const read = new Readable({ read() {} }); read.resume();
read.destroyed = true; assert.strictEqual(read.destroyed, true);
// The internal destroy() mechanism should not be triggered read.on('end', common.mustNotCall()); read.destroy();}
{ function MyReadable() { assert.strictEqual(this.destroyed, false); this.destroyed = false; Readable.call(this); }
Object.setPrototypeOf(MyReadable.prototype, Readable.prototype); Object.setPrototypeOf(MyReadable, Readable);
new MyReadable();}
{ // Destroy and destroy callback const read = new Readable({ read() {} }); read.resume();
const expected = new Error('kaboom');
let ticked = false; read.on('close', common.mustCall(() => { assert.strictEqual(read._readableState.errorEmitted, true); assert.strictEqual(ticked, true); })); read.on('error', common.mustCall((err) => { assert.strictEqual(err, expected); }));
assert.strictEqual(read._readableState.errored, null); assert.strictEqual(read._readableState.errorEmitted, false);
read.destroy(expected, common.mustCall(function(err) { assert.strictEqual(read._readableState.errored, expected); assert.strictEqual(err, expected); })); assert.strictEqual(read._readableState.errorEmitted, false); assert.strictEqual(read._readableState.errored, expected); 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 1'); assert.strictEqual(readable._readableState.errorEmitted, true); }));
readable.destroy(); assert.strictEqual(readable.destroyed, true); assert.strictEqual(readable._readableState.errored, null); 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, null);
ticked = true;}
{ const read = new Readable({ read() {} });
read.destroy(); read.push('hi'); read.on('data', common.mustNotCall());}
{ const read = new Readable({ read: common.mustNotCall(function() {}) }); read.destroy(); assert.strictEqual(read.destroyed, true); read.read();}
{ const read = new Readable({ autoDestroy: false, read() { this.push(null); this.push('asd'); } });
read.on('error', common.mustCall(() => { assert(read._readableState.errored); })); read.resume();}
{ const controller = new AbortController(); const read = addAbortSignal(controller.signal, new Readable({ read() { this.push('asd'); }, }));
read.on('error', common.mustCall((e) => { assert.strictEqual(e.name, 'AbortError'); })); controller.abort(); read.on('data', common.mustNotCall());}
{ const controller = new AbortController(); const read = new Readable({ signal: controller.signal, read() { this.push('asd'); }, });
read.on('error', common.mustCall((e) => { assert.strictEqual(e.name, 'AbortError'); })); controller.abort(); read.on('data', common.mustNotCall());}
{ const controller = new AbortController(); const read = addAbortSignal(controller.signal, new Readable({ objectMode: true, read() { return false; } })); read.push('asd');
read.on('error', common.mustCall((e) => { assert.strictEqual(e.name, 'AbortError'); })); assert.rejects((async () => { // eslint-disable-next-line no-unused-vars, no-empty for await (const chunk of read) { } })(), /AbortError/); setTimeout(() => controller.abort(), 0);}
{ const read = new Readable({ read() { }, });
read.on('data', common.mustNotCall()); read.on('error', common.mustCall((e) => { read.push('asd'); read.read(); })); read.on('close', common.mustCall((e) => { read.push('asd'); read.read(); })); read.destroy(new Error('asd'));}
{ const read = new Readable({ read() { }, });
read.on('data', common.mustNotCall()); read.on('close', common.mustCall((e) => { read.push('asd'); read.read(); })); read.destroy();}
{ const read = new Readable({ read() { }, });
read.on('data', common.mustNotCall()); read.on('close', common.mustCall((e) => { read.push('asd'); read.unshift('asd'); })); read.destroy();}
{ const read = new Readable({ read() { }, });
read.on('data', common.mustNotCall()); read.destroy(); read.unshift('asd');}
{ const read = new Readable({ read() { }, });
read.resume(); read.on('data', common.mustNotCall()); read.on('close', common.mustCall((e) => { read.push('asd'); })); read.destroy();}
{ const read = new Readable({ read() { }, });
read.on('data', common.mustNotCall()); read.destroy(); read.push('asd');}
Version Info