| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 | var test = require('tap').test// simulated ulimit// this is like graceful-fs, but in reversevar fs_ = require('fs')var fs = require('../graceful-fs.js')var files = fs.readdirSync(__dirname)// Ok, no more actual file reading!var fds = 0var nextFd = 60var limit = 8fs_.open = function (path, flags, mode, cb) {  process.nextTick(function() {    ++fds    if (fds >= limit) {      --fds      var er = new Error('EMFILE Curses!')      er.code = 'EMFILE'      er.path = path      return cb(er)    } else {      cb(null, nextFd++)    }  })}fs_.openSync = function (path, flags, mode) {  if (fds >= limit) {    var er = new Error('EMFILE Curses!')    er.code = 'EMFILE'    er.path = path    throw er  } else {    ++fds    return nextFd++  }}fs_.close = function (fd, cb) {  process.nextTick(function () {    --fds    cb()  })}fs_.closeSync = function (fd) {  --fds}fs_.readdir = function (path, cb) {  process.nextTick(function() {    if (fds >= limit) {      var er = new Error('EMFILE Curses!')      er.code = 'EMFILE'      er.path = path      return cb(er)    } else {      ++fds      process.nextTick(function () {        --fds        cb(null, [__filename, "some-other-file.js"])      })    }  })}fs_.readdirSync = function (path) {  if (fds >= limit) {    var er = new Error('EMFILE Curses!')    er.code = 'EMFILE'    er.path = path    throw er  } else {    return [__filename, "some-other-file.js"]  }}test('open emfile autoreduce', function (t) {  fs.MIN_MAX_OPEN = 4  t.equal(fs.MAX_OPEN, 1024)  var max = 12  for (var i = 0; i < max; i++) {    fs.open(__filename, 'r', next(i))  }  var phase = 0  var expect =      [ [ 0, 60, null, 1024, 4, 12, 1 ],        [ 1, 61, null, 1024, 4, 12, 2 ],        [ 2, 62, null, 1024, 4, 12, 3 ],        [ 3, 63, null, 1024, 4, 12, 4 ],        [ 4, 64, null, 1024, 4, 12, 5 ],        [ 5, 65, null, 1024, 4, 12, 6 ],        [ 6, 66, null, 1024, 4, 12, 7 ],        [ 7, 67, null, 6, 4, 5, 1 ],        [ 8, 68, null, 6, 4, 5, 2 ],        [ 9, 69, null, 6, 4, 5, 3 ],        [ 10, 70, null, 6, 4, 5, 4 ],        [ 11, 71, null, 6, 4, 5, 5 ] ]  var actual = []  function next (i) { return function (er, fd) {    if (er)      throw er    actual.push([i, fd, er, fs.MAX_OPEN, fs.MIN_MAX_OPEN, fs._curOpen, fds])    if (i === max - 1) {      t.same(actual, expect)      t.ok(fs.MAX_OPEN < limit)      t.end()    }    fs.close(fd)  } }})test('readdir emfile autoreduce', function (t) {  fs.MAX_OPEN = 1024  var max = 12  for (var i = 0; i < max; i ++) {    fs.readdir(__dirname, next(i))  }  var expect =      [ [0,[__filename,"some-other-file.js"],null,7,4,7,7],        [1,[__filename,"some-other-file.js"],null,7,4,7,6],        [2,[__filename,"some-other-file.js"],null,7,4,7,5],        [3,[__filename,"some-other-file.js"],null,7,4,7,4],        [4,[__filename,"some-other-file.js"],null,7,4,7,3],        [5,[__filename,"some-other-file.js"],null,7,4,6,2],        [6,[__filename,"some-other-file.js"],null,7,4,5,1],        [7,[__filename,"some-other-file.js"],null,7,4,4,0],        [8,[__filename,"some-other-file.js"],null,7,4,3,3],        [9,[__filename,"some-other-file.js"],null,7,4,2,2],        [10,[__filename,"some-other-file.js"],null,7,4,1,1],        [11,[__filename,"some-other-file.js"],null,7,4,0,0] ]  var actual = []  function next (i) { return function (er, files) {    if (er)      throw er    var line = [i, files, er, fs.MAX_OPEN, fs.MIN_MAX_OPEN, fs._curOpen, fds ]    actual.push(line)    if (i === max - 1) {      t.ok(fs.MAX_OPEN < limit)      t.same(actual, expect)      t.end()    }  } }})
 |