| 'use strict'; |
| |
| const common = require('../common'); |
| const fs = require('fs'); |
| const assert = require('assert'); |
| const fixtures = require('../common/fixtures'); |
| |
| const tmpdir = require('../common/tmpdir'); |
| tmpdir.refresh(); |
| |
| { |
| // Compat with old node. |
| |
| function ReadStream(...args) { |
| fs.ReadStream.call(this, ...args); |
| } |
| Object.setPrototypeOf(ReadStream.prototype, fs.ReadStream.prototype); |
| Object.setPrototypeOf(ReadStream, fs.ReadStream); |
| |
| ReadStream.prototype.open = common.mustCall(function() { |
| fs.open(this.path, this.flags, this.mode, (er, fd) => { |
| if (er) { |
| if (this.autoClose) { |
| this.destroy(); |
| } |
| this.emit('error', er); |
| return; |
| } |
| |
| this.fd = fd; |
| this.emit('open', fd); |
| this.emit('ready'); |
| }); |
| }); |
| |
| let readyCalled = false; |
| let ticked = false; |
| const r = new ReadStream(fixtures.path('x.txt')) |
| .on('ready', common.mustCall(() => { |
| readyCalled = true; |
| // Make sure 'ready' is emitted in same tick as 'open'. |
| assert.strictEqual(ticked, false); |
| })) |
| .on('error', common.mustNotCall()) |
| .on('open', common.mustCall((fd) => { |
| process.nextTick(() => { |
| ticked = true; |
| r.destroy(); |
| }); |
| assert.strictEqual(readyCalled, false); |
| assert.strictEqual(fd, r.fd); |
| })); |
| } |
| |
| { |
| // Compat with old node. |
| |
| function WriteStream(...args) { |
| fs.WriteStream.call(this, ...args); |
| } |
| Object.setPrototypeOf(WriteStream.prototype, fs.WriteStream.prototype); |
| Object.setPrototypeOf(WriteStream, fs.WriteStream); |
| |
| WriteStream.prototype.open = common.mustCall(function() { |
| fs.open(this.path, this.flags, this.mode, (er, fd) => { |
| if (er) { |
| if (this.autoClose) { |
| this.destroy(); |
| } |
| this.emit('error', er); |
| return; |
| } |
| |
| this.fd = fd; |
| this.emit('open', fd); |
| this.emit('ready'); |
| }); |
| }); |
| |
| let readyCalled = false; |
| let ticked = false; |
| const w = new WriteStream(`${tmpdir.path}/dummy`) |
| .on('ready', common.mustCall(() => { |
| readyCalled = true; |
| // Make sure 'ready' is emitted in same tick as 'open'. |
| assert.strictEqual(ticked, false); |
| })) |
| .on('error', common.mustNotCall()) |
| .on('open', common.mustCall((fd) => { |
| process.nextTick(() => { |
| ticked = true; |
| w.destroy(); |
| }); |
| assert.strictEqual(readyCalled, false); |
| assert.strictEqual(fd, w.fd); |
| })); |
| } |