Initial commit
[yaffs-website] / node_modules / graceful-fs / test / max-open.js
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 >= 2)
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 })