'use strict'; var fs = require('graceful-fs'); var path = require('path'); var test = require('tap').test; var rimraf = require('rimraf'); var writeStream = require('../index.js'); var target = path.resolve(__dirname, 'test-chown'); test('slow close', function(t) { t.plan(2); // The goal here is to simulate the "file close" step happening so slowly // that the whole close/rename process could finish before the file is // actually closed (and thus buffers truely flushed to the OS). In // previous versions of this module, this would result in the module // emitting finish & close before the file was fully written and in // turn, could break other layers that tried to read the new file. var realEmit = fs.WriteStream.prototype.emit; var reallyClosed = false; fs.WriteStream.prototype.emit = function(event) { if (event !== 'close') return realEmit.apply(this, arguments); setTimeout( function() { reallyClosed = true; realEmit.call(this, 'close'); }.bind(this), 200, ); }; var stream = writeStream(target); stream.on('finish', function() { t.is(reallyClosed, true, "didn't finish before target was closed"); }); stream.on('close', function() { t.is(reallyClosed, true, "didn't close before target was closed"); }); stream.end(); }); test('cleanup', function(t) { rimraf.sync(target); t.end(); });