123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- var test = require('tap').test
- // simulated ulimit
- // this is like graceful-fs, but in reverse
- var fs_ = require('fs')
- var fs = require('../graceful-fs.js')
- var files = fs.readdirSync(__dirname)
- // Ok, no more actual file reading!
- var fds = 0
- var nextFd = 60
- var limit = 8
- fs_.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()
- }
- } }
- })
|