Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
81169 views
1
var test = require('tap').test
2
var fs = require('../')
3
4
test('open lots of stuff', function (t) {
5
// Get around EBADF from libuv by making sure that stderr is opened
6
// Otherwise Darwin will refuse to give us a FD for stderr!
7
process.stderr.write('')
8
9
// How many parallel open()'s to do
10
var n = 1024
11
var opens = 0
12
var fds = []
13
var going = true
14
var closing = false
15
var doneCalled = 0
16
17
for (var i = 0; i < n; i++) {
18
go()
19
}
20
21
function go() {
22
opens++
23
fs.open(__filename, 'r', function (er, fd) {
24
if (er) throw er
25
fds.push(fd)
26
if (going) go()
27
})
28
}
29
30
// should hit ulimit pretty fast
31
setTimeout(function () {
32
going = false
33
t.equal(opens - fds.length, n)
34
done()
35
}, 100)
36
37
38
function done () {
39
if (closing) return
40
doneCalled++
41
42
if (fds.length === 0) {
43
//console.error('done called %d times', doneCalled)
44
// First because of the timeout
45
// Then to close the fd's opened afterwards
46
// Then this time, to complete.
47
// Might take multiple passes, depending on CPU speed
48
// and ulimit, but at least 3 in every case.
49
t.ok(doneCalled >= 3)
50
return t.end()
51
}
52
53
closing = true
54
setTimeout(function () {
55
// console.error('do closing again')
56
closing = false
57
done()
58
}, 100)
59
60
// console.error('closing time')
61
var closes = fds.slice(0)
62
fds.length = 0
63
closes.forEach(function (fd) {
64
fs.close(fd, function (er) {
65
if (er) throw er
66
})
67
})
68
}
69
})
70
71