| 'use strict'; |
| |
| require('../common'); |
| const assert = require('assert'); |
| const fs = require('fs'); |
| const fixtures = require('../common/fixtures'); |
| |
| let openCount = 0; |
| const _fsopen = fs.open; |
| const _fsclose = fs.close; |
| |
| const loopCount = 50; |
| const totalCheck = 50; |
| const emptyTxt = fixtures.path('empty.txt'); |
| |
| fs.open = function() { |
| openCount++; |
| return _fsopen.apply(null, arguments); |
| }; |
| |
| fs.close = function() { |
| openCount--; |
| return _fsclose.apply(null, arguments); |
| }; |
| |
| function testLeak(endFn, callback) { |
| console.log(`testing for leaks from fs.createReadStream().${endFn}()...`); |
| |
| let i = 0; |
| let check = 0; |
| |
| function checkFunction() { |
| if (openCount !== 0 && check < totalCheck) { |
| check++; |
| setTimeout(checkFunction, 100); |
| return; |
| } |
| |
| assert.strictEqual( |
| openCount, |
| 0, |
| `no leaked file descriptors using ${endFn}() (got ${openCount})` |
| ); |
| |
| openCount = 0; |
| callback && setTimeout(callback, 100); |
| } |
| |
| setInterval(function() { |
| const s = fs.createReadStream(emptyTxt); |
| s[endFn](); |
| |
| if (++i === loopCount) { |
| clearTimeout(this); |
| setTimeout(checkFunction, 100); |
| } |
| }, 2); |
| } |
| |
| testLeak('close', function() { |
| testLeak('destroy'); |
| }); |