mirror of https://github.com/lukechilds/node.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
158 lines
3.6 KiB
158 lines
3.6 KiB
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()
|
|
}
|
|
} }
|
|
})
|
|
|