forked from zhurui/management
70 lines
1.5 KiB
JavaScript
70 lines
1.5 KiB
JavaScript
|
var test = require('tap').test
|
||
|
var fs = require('../')
|
||
|
|
||
|
test('open lots of stuff', function (t) {
|
||
|
// Get around EBADF from libuv by making sure that stderr is opened
|
||
|
// Otherwise Darwin will refuse to give us a FD for stderr!
|
||
|
process.stderr.write('')
|
||
|
|
||
|
// How many parallel open()'s to do
|
||
|
var n = 1024
|
||
|
var opens = 0
|
||
|
var fds = []
|
||
|
var going = true
|
||
|
var closing = false
|
||
|
var doneCalled = 0
|
||
|
|
||
|
for (var i = 0; i < n; i++) {
|
||
|
go()
|
||
|
}
|
||
|
|
||
|
function go() {
|
||
|
opens++
|
||
|
fs.open(__filename, 'r', function (er, fd) {
|
||
|
if (er) throw er
|
||
|
fds.push(fd)
|
||
|
if (going) go()
|
||
|
})
|
||
|
}
|
||
|
|
||
|
// should hit ulimit pretty fast
|
||
|
setTimeout(function () {
|
||
|
going = false
|
||
|
t.equal(opens - fds.length, n)
|
||
|
done()
|
||
|
}, 100)
|
||
|
|
||
|
|
||
|
function done () {
|
||
|
if (closing) return
|
||
|
doneCalled++
|
||
|
|
||
|
if (fds.length === 0) {
|
||
|
console.error('done called %d times', doneCalled)
|
||
|
// First because of the timeout
|
||
|
// Then to close the fd's opened afterwards
|
||
|
// Then this time, to complete.
|
||
|
// Might take multiple passes, depending on CPU speed
|
||
|
// and ulimit, but at least 3 in every case.
|
||
|
t.ok(doneCalled >= 2)
|
||
|
return t.end()
|
||
|
}
|
||
|
|
||
|
closing = true
|
||
|
setTimeout(function () {
|
||
|
// console.error('do closing again')
|
||
|
closing = false
|
||
|
done()
|
||
|
}, 100)
|
||
|
|
||
|
// console.error('closing time')
|
||
|
var closes = fds.slice(0)
|
||
|
fds.length = 0
|
||
|
closes.forEach(function (fd) {
|
||
|
fs.close(fd, function (er) {
|
||
|
if (er) throw er
|
||
|
})
|
||
|
})
|
||
|
}
|
||
|
})
|