max-open.js 1.5 KB

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