PageRenderTime 27ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/test/ruby/test_dir.rb

http://github.com/ruby/ruby
Ruby | 558 lines | 500 code | 57 blank | 1 comment | 15 complexity | 61ad51d028b96e786a8d4c5e41f9f617 MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause, AGPL-3.0
  1. # frozen_string_literal: false
  2. require 'test/unit'
  3. require 'tmpdir'
  4. require 'fileutils'
  5. class TestDir < Test::Unit::TestCase
  6. def setup
  7. @verbose = $VERBOSE
  8. $VERBOSE = nil
  9. @root = File.realpath(Dir.mktmpdir('__test_dir__'))
  10. @nodir = File.join(@root, "dummy")
  11. @dirs = []
  12. for i in "a".."z"
  13. if i.ord % 2 == 0
  14. FileUtils.touch(File.join(@root, i))
  15. else
  16. FileUtils.mkdir(File.join(@root, i))
  17. @dirs << File.join(i, "")
  18. end
  19. end
  20. end
  21. def teardown
  22. $VERBOSE = @verbose
  23. FileUtils.remove_entry_secure @root if File.directory?(@root)
  24. end
  25. def test_seek
  26. dir = Dir.open(@root)
  27. begin
  28. cache = []
  29. loop do
  30. pos = dir.tell
  31. break unless name = dir.read
  32. cache << [pos, name]
  33. end
  34. for x,y in cache.sort_by {|z| z[0] % 3 } # shuffle
  35. dir.seek(x)
  36. assert_equal(y, dir.read)
  37. end
  38. ensure
  39. dir.close
  40. end
  41. end
  42. def test_nodir
  43. assert_raise(Errno::ENOENT) { Dir.open(@nodir) }
  44. end
  45. def test_inspect
  46. d = Dir.open(@root)
  47. assert_match(/^#<Dir:#{ Regexp.quote(@root) }>$/, d.inspect)
  48. assert_match(/^#<Dir:.*>$/, Dir.allocate.inspect)
  49. ensure
  50. d.close
  51. end
  52. def test_path
  53. d = Dir.open(@root)
  54. assert_equal(@root, d.path)
  55. assert_nil(Dir.allocate.path)
  56. ensure
  57. d.close
  58. end
  59. def test_set_pos
  60. d = Dir.open(@root)
  61. loop do
  62. i = d.pos
  63. break unless x = d.read
  64. d.pos = i
  65. assert_equal(x, d.read)
  66. end
  67. ensure
  68. d.close
  69. end
  70. def test_rewind
  71. d = Dir.open(@root)
  72. a = (0..5).map { d.read }
  73. d.rewind
  74. b = (0..5).map { d.read }
  75. assert_equal(a, b)
  76. ensure
  77. d.close
  78. end
  79. def test_chdir
  80. @pwd = Dir.pwd
  81. @env_home = ENV["HOME"]
  82. @env_logdir = ENV["LOGDIR"]
  83. ENV.delete("HOME")
  84. ENV.delete("LOGDIR")
  85. assert_raise(Errno::ENOENT) { Dir.chdir(@nodir) }
  86. assert_raise(ArgumentError) { Dir.chdir }
  87. ENV["HOME"] = @pwd
  88. Dir.chdir do
  89. assert_equal(@pwd, Dir.pwd)
  90. Dir.chdir(@root)
  91. assert_equal(@root, Dir.pwd)
  92. end
  93. ensure
  94. begin
  95. Dir.chdir(@pwd)
  96. rescue
  97. abort("cannot return the original directory: #{ @pwd }")
  98. end
  99. if @env_home
  100. ENV["HOME"] = @env_home
  101. else
  102. ENV.delete("HOME")
  103. end
  104. if @env_logdir
  105. ENV["LOGDIR"] = @env_logdir
  106. else
  107. ENV.delete("LOGDIR")
  108. end
  109. end
  110. def test_chroot_nodir
  111. skip if RUBY_PLATFORM =~ /android/
  112. assert_raise(NotImplementedError, Errno::ENOENT, Errno::EPERM
  113. ) { Dir.chroot(File.join(@nodir, "")) }
  114. end
  115. def test_close
  116. d = Dir.open(@root)
  117. d.close
  118. assert_nothing_raised(IOError) { d.close }
  119. assert_raise(IOError) { d.read }
  120. end
  121. def test_glob
  122. assert_equal((%w(. ..) + ("a".."z").to_a).map{|f| File.join(@root, f) },
  123. Dir.glob(File.join(@root, "*"), File::FNM_DOTMATCH))
  124. assert_equal([@root] + ("a".."z").map {|f| File.join(@root, f) },
  125. Dir.glob([@root, File.join(@root, "*")]))
  126. assert_equal([@root] + ("a".."z").map {|f| File.join(@root, f) },
  127. Dir.glob([@root, File.join(@root, "*")], sort: false).sort)
  128. assert_raise_with_message(ArgumentError, /nul-separated/) do
  129. Dir.glob(@root + "\0\0\0" + File.join(@root, "*"))
  130. end
  131. assert_equal(("a".."z").step(2).map {|f| File.join(File.join(@root, f), "") },
  132. Dir.glob(File.join(@root, "*/")))
  133. assert_equal([File.join(@root, '//a')], Dir.glob(@root + '//a'))
  134. FileUtils.touch(File.join(@root, "{}"))
  135. assert_equal(%w({} a).map{|f| File.join(@root, f) },
  136. Dir.glob(File.join(@root, '{\{\},a}')))
  137. assert_equal([], Dir.glob(File.join(@root, '[')))
  138. assert_equal([], Dir.glob(File.join(@root, '[a-\\')))
  139. assert_equal([File.join(@root, "a")], Dir.glob(File.join(@root, 'a\\')))
  140. assert_equal(("a".."f").map {|f| File.join(@root, f) }, Dir.glob(File.join(@root, '[abc/def]')))
  141. open(File.join(@root, "}}{}"), "wb") {}
  142. open(File.join(@root, "}}a"), "wb") {}
  143. assert_equal(%w(}}{} }}a).map {|f| File.join(@root, f)}, Dir.glob(File.join(@root, '}}{\{\},a}')))
  144. assert_equal(%w(}}{} }}a b c).map {|f| File.join(@root, f)}, Dir.glob(File.join(@root, '{\}\}{\{\},a},b,c}')))
  145. assert_raise(ArgumentError) {
  146. Dir.glob([[@root, File.join(@root, "*")].join("\0")])
  147. }
  148. end
  149. def test_glob_recursive
  150. bug6977 = '[ruby-core:47418]'
  151. bug8006 = '[ruby-core:53108] [Bug #8006]'
  152. Dir.chdir(@root) do
  153. assert_include(Dir.glob("a/**/*", File::FNM_DOTMATCH), "a/.", bug8006)
  154. FileUtils.mkdir_p("a/b/c/d/e/f")
  155. assert_equal(["a/b/c/d/e/f"], Dir.glob("a/**/e/f"), bug6977)
  156. assert_equal(["a/b/c/d/e/f"], Dir.glob("a/**/d/e/f"), bug6977)
  157. assert_equal(["a/b/c/d/e/f"], Dir.glob("a/**/c/d/e/f"), bug6977)
  158. assert_equal(["a/b/c/d/e/f"], Dir.glob("a/**/b/c/d/e/f"), bug6977)
  159. assert_equal(["a/b/c/d/e/f"], Dir.glob("a/**/c/?/e/f"), bug6977)
  160. assert_equal(["a/b/c/d/e/f"], Dir.glob("a/**/c/**/d/e/f"), bug6977)
  161. assert_equal(["a/b/c/d/e/f"], Dir.glob("a/**/c/**/d/e/f"), bug6977)
  162. bug8283 = '[ruby-core:54387] [Bug #8283]'
  163. dirs = ["a/.x", "a/b/.y"]
  164. FileUtils.mkdir_p(dirs)
  165. dirs.map {|dir| open("#{dir}/z", "w") {}}
  166. assert_equal([], Dir.glob("a/**/z"), bug8283)
  167. assert_equal(["a/.x/z"], Dir.glob("a/**/.x/z"), bug8283)
  168. assert_equal(["a/.x/z"], Dir.glob("a/.x/**/z"), bug8283)
  169. assert_equal(["a/b/.y/z"], Dir.glob("a/**/.y/z"), bug8283)
  170. end
  171. end
  172. def test_glob_recursive_directory
  173. Dir.chdir(@root) do
  174. ['d', 'e'].each do |path|
  175. FileUtils.mkdir_p("c/#{path}/a/b/c")
  176. FileUtils.touch("c/#{path}/a/a.file")
  177. FileUtils.touch("c/#{path}/a/b/b.file")
  178. FileUtils.touch("c/#{path}/a/b/c/c.file")
  179. end
  180. bug15540 = '[ruby-core:91110] [Bug #15540]'
  181. assert_equal(["c/d/a/", "c/d/a/b/", "c/d/a/b/c/", "c/e/a/", "c/e/a/b/", "c/e/a/b/c/"],
  182. Dir.glob('c/{d,e}/a/**/'), bug15540)
  183. assert_equal(["c/e/a/", "c/e/a/b/", "c/e/a/b/c/", "c/d/a/", "c/d/a/b/", "c/d/a/b/c/"],
  184. Dir.glob('c/{e,d}/a/**/'))
  185. end
  186. end
  187. def test_glob_starts_with_brace
  188. Dir.chdir(@root) do
  189. bug15649 = '[ruby-core:91728] [Bug #15649]'
  190. assert_equal(["#{@root}/a", "#{@root}/b"],
  191. Dir.glob("{#{@root}/a,#{@root}/b}"), bug15649)
  192. end
  193. end
  194. def test_glob_order
  195. Dir.chdir(@root) do
  196. assert_equal(["#{@root}/a", "#{@root}/b"], Dir.glob("#{@root}/[ba]"))
  197. assert_equal(["#{@root}/b", "#{@root}/a"], Dir.glob(%W"#{@root}/b #{@root}/a"))
  198. assert_equal(["#{@root}/b", "#{@root}/a"], Dir.glob("#{@root}/{b,a}"))
  199. end
  200. assert_equal(["a", "b"], Dir.glob("[ba]", base: @root))
  201. assert_equal(["b", "a"], Dir.glob(%W"b a", base: @root))
  202. assert_equal(["b", "a"], Dir.glob("{b,a}", base: @root))
  203. end
  204. if Process.const_defined?(:RLIMIT_NOFILE)
  205. def test_glob_too_may_open_files
  206. assert_separately([], "#{<<-"begin;"}\n#{<<-'end;'}", chdir: @root)
  207. begin;
  208. n = 16
  209. Process.setrlimit(Process::RLIMIT_NOFILE, n)
  210. files = []
  211. begin
  212. n.times {files << File.open('b')}
  213. rescue Errno::EMFILE, Errno::ENFILE => e
  214. end
  215. assert_raise(e.class) {
  216. Dir.glob('*')
  217. }
  218. end;
  219. end
  220. end
  221. def test_glob_base
  222. files = %w[a/foo.c c/bar.c]
  223. files.each {|n| File.write(File.join(@root, n), "")}
  224. Dir.mkdir(File.join(@root, "a/dir"))
  225. dirs = @dirs + %w[a/dir/]
  226. dirs.sort!
  227. assert_equal(files, Dir.glob("*/*.c", base: @root))
  228. assert_equal(files, Dir.chdir(@root) {Dir.glob("*/*.c", base: ".")})
  229. assert_equal(%w[foo.c], Dir.chdir(@root) {Dir.glob("*.c", base: "a")})
  230. assert_equal(files, Dir.chdir(@root) {Dir.glob("*/*.c", base: "")})
  231. assert_equal(files, Dir.chdir(@root) {Dir.glob("*/*.c", base: nil)})
  232. assert_equal(@dirs, Dir.glob("*/", base: @root))
  233. assert_equal(@dirs, Dir.chdir(@root) {Dir.glob("*/", base: ".")})
  234. assert_equal(%w[dir/], Dir.chdir(@root) {Dir.glob("*/", base: "a")})
  235. assert_equal(@dirs, Dir.chdir(@root) {Dir.glob("*/", base: "")})
  236. assert_equal(@dirs, Dir.chdir(@root) {Dir.glob("*/", base: nil)})
  237. assert_equal(dirs, Dir.glob("**/*/", base: @root))
  238. assert_equal(dirs, Dir.chdir(@root) {Dir.glob("**/*/", base: ".")})
  239. assert_equal(%w[dir/], Dir.chdir(@root) {Dir.glob("**/*/", base: "a")})
  240. assert_equal(dirs, Dir.chdir(@root) {Dir.glob("**/*/", base: "")})
  241. assert_equal(dirs, Dir.chdir(@root) {Dir.glob("**/*/", base: nil)})
  242. assert_equal(files, Dir.glob("*/*.c", base: @root, sort: false).sort)
  243. assert_equal(files, Dir.chdir(@root) {Dir.glob("*/*.c", base: ".", sort: false).sort})
  244. assert_equal(%w[foo.c], Dir.chdir(@root) {Dir.glob("*.c", base: "a", sort: false).sort})
  245. assert_equal(files, Dir.chdir(@root) {Dir.glob("*/*.c", base: "", sort: false).sort})
  246. assert_equal(files, Dir.chdir(@root) {Dir.glob("*/*.c", base: nil, sort: false).sort})
  247. assert_equal(@dirs, Dir.glob("*/", base: @root))
  248. assert_equal(@dirs, Dir.chdir(@root) {Dir.glob("*/", base: ".", sort: false).sort})
  249. assert_equal(%w[dir/], Dir.chdir(@root) {Dir.glob("*/", base: "a", sort: false).sort})
  250. assert_equal(@dirs, Dir.chdir(@root) {Dir.glob("*/", base: "", sort: false).sort})
  251. assert_equal(@dirs, Dir.chdir(@root) {Dir.glob("*/", base: nil, sort: false).sort})
  252. assert_equal(dirs, Dir.glob("**/*/", base: @root))
  253. assert_equal(dirs, Dir.chdir(@root) {Dir.glob("**/*/", base: ".", sort: false).sort})
  254. assert_equal(%w[dir/], Dir.chdir(@root) {Dir.glob("**/*/", base: "a", sort: false).sort})
  255. assert_equal(dirs, Dir.chdir(@root) {Dir.glob("**/*/", base: "", sort: false).sort})
  256. assert_equal(dirs, Dir.chdir(@root) {Dir.glob("**/*/", base: nil, sort: false).sort})
  257. end
  258. def test_glob_base_dir
  259. files = %w[a/foo.c c/bar.c]
  260. files.each {|n| File.write(File.join(@root, n), "")}
  261. Dir.mkdir(File.join(@root, "a/dir"))
  262. dirs = @dirs + %w[a/dir/]
  263. dirs.sort!
  264. assert_equal(files, Dir.open(@root) {|d| Dir.glob("*/*.c", base: d)})
  265. assert_equal(%w[foo.c], Dir.chdir(@root) {Dir.open("a") {|d| Dir.glob("*.c", base: d)}})
  266. assert_equal(@dirs, Dir.open(@root) {|d| Dir.glob("*/", base: d)})
  267. assert_equal(%w[dir/], Dir.chdir(@root) {Dir.open("a") {|d| Dir.glob("*/", base: d)}})
  268. assert_equal(dirs, Dir.open(@root) {|d| Dir.glob("**/*/", base: d)})
  269. assert_equal(%w[dir/], Dir.chdir(@root) {Dir.open("a") {|d| Dir.glob("**/*/", base: d)}})
  270. assert_equal(files, Dir.open(@root) {|d| Dir.glob("*/*.c", base: d, sort: false).sort})
  271. assert_equal(%w[foo.c], Dir.chdir(@root) {Dir.open("a") {|d| Dir.glob("*.c", base: d, sort: false).sort}})
  272. assert_equal(@dirs, Dir.open(@root) {|d| Dir.glob("*/", base: d, sort: false).sort})
  273. assert_equal(%w[dir/], Dir.chdir(@root) {Dir.open("a") {|d| Dir.glob("*/", base: d, sort: false).sort}})
  274. assert_equal(dirs, Dir.open(@root) {|d| Dir.glob("**/*/", base: d, sort: false).sort})
  275. assert_equal(%w[dir/], Dir.chdir(@root) {Dir.open("a") {|d| Dir.glob("**/*/", base: d, sort: false).sort}})
  276. end
  277. def assert_entries(entries, children_only = false)
  278. entries.sort!
  279. expected = ("a".."z").to_a
  280. expected = %w(. ..) + expected unless children_only
  281. assert_equal(expected, entries)
  282. end
  283. def test_entries
  284. assert_entries(Dir.open(@root) {|dir| dir.entries})
  285. assert_entries(Dir.entries(@root))
  286. assert_raise(ArgumentError) {Dir.entries(@root+"\0")}
  287. [Encoding::UTF_8, Encoding::ASCII_8BIT].each do |enc|
  288. assert_equal(enc, Dir.entries(@root, encoding: enc).first.encoding)
  289. end
  290. end
  291. def test_foreach
  292. assert_entries(Dir.open(@root) {|dir| dir.each.to_a})
  293. assert_entries(Dir.foreach(@root).to_a)
  294. assert_raise(ArgumentError) {Dir.foreach(@root+"\0").to_a}
  295. newdir = @root+"/new"
  296. e = Dir.foreach(newdir)
  297. assert_raise(Errno::ENOENT) {e.to_a}
  298. Dir.mkdir(newdir)
  299. File.write(newdir+"/a", "")
  300. assert_equal(%w[. .. a], e.to_a.sort)
  301. [Encoding::UTF_8, Encoding::ASCII_8BIT].each do |enc|
  302. e = Dir.foreach(newdir, encoding: enc)
  303. assert_equal(enc, e.to_a.first.encoding)
  304. end
  305. end
  306. def test_children
  307. assert_entries(Dir.open(@root) {|dir| dir.children}, true)
  308. assert_entries(Dir.children(@root), true)
  309. assert_raise(ArgumentError) {Dir.children(@root+"\0")}
  310. [Encoding::UTF_8, Encoding::ASCII_8BIT].each do |enc|
  311. assert_equal(enc, Dir.children(@root, encoding: enc).first.encoding)
  312. end
  313. end
  314. def test_each_child
  315. assert_entries(Dir.open(@root) {|dir| dir.each_child.to_a}, true)
  316. assert_entries(Dir.each_child(@root).to_a, true)
  317. assert_raise(ArgumentError) {Dir.each_child(@root+"\0").to_a}
  318. newdir = @root+"/new"
  319. e = Dir.each_child(newdir)
  320. assert_raise(Errno::ENOENT) {e.to_a}
  321. Dir.mkdir(newdir)
  322. File.write(newdir+"/a", "")
  323. assert_equal(%w[a], e.to_a)
  324. [Encoding::UTF_8, Encoding::ASCII_8BIT].each do |enc|
  325. e = Dir.each_child(newdir, encoding: enc)
  326. assert_equal(enc, e.to_a.first.encoding)
  327. end
  328. end
  329. def test_dir_enc
  330. dir = Dir.open(@root, encoding: "UTF-8")
  331. begin
  332. while name = dir.read
  333. assert_equal(Encoding.find("UTF-8"), name.encoding)
  334. end
  335. ensure
  336. dir.close
  337. end
  338. dir = Dir.open(@root, encoding: "ASCII-8BIT")
  339. begin
  340. while name = dir.read
  341. assert_equal(Encoding.find("ASCII-8BIT"), name.encoding)
  342. end
  343. ensure
  344. dir.close
  345. end
  346. end
  347. def test_unknown_keywords
  348. bug8060 = '[ruby-dev:47152] [Bug #8060]'
  349. assert_raise_with_message(ArgumentError, /unknown keyword/, bug8060) do
  350. Dir.open(@root, xawqij: "a") {}
  351. end
  352. end
  353. def test_symlink
  354. begin
  355. ["dummy", *"a".."z"].each do |f|
  356. File.symlink(File.join(@root, f),
  357. File.join(@root, "symlink-#{ f }"))
  358. end
  359. rescue NotImplementedError, Errno::EACCES
  360. return
  361. end
  362. assert_equal([*"a".."z", *"symlink-a".."symlink-z"].each_slice(2).map {|f, _| File.join(@root, f + "/") }.sort,
  363. Dir.glob(File.join(@root, "*/")))
  364. assert_equal([@root + "/", *[*"a".."z"].each_slice(2).map {|f, _| File.join(@root, f + "/") }],
  365. Dir.glob(File.join(@root, "**/")))
  366. end
  367. def test_glob_metachar
  368. bug8597 = '[ruby-core:55764] [Bug #8597]'
  369. assert_empty(Dir.glob(File.join(@root, "<")), bug8597)
  370. end
  371. def test_glob_cases
  372. feature5994 = "[ruby-core:42469] [Feature #5994]"
  373. feature5994 << "\nDir.glob should return the filename with actual cases on the filesystem"
  374. Dir.chdir(File.join(@root, "a")) do
  375. open("FileWithCases", "w") {}
  376. return unless File.exist?("filewithcases")
  377. assert_equal(%w"FileWithCases", Dir.glob("filewithcases"), feature5994)
  378. end
  379. Dir.chdir(@root) do
  380. assert_equal(%w"a/FileWithCases", Dir.glob("A/filewithcases"), feature5994)
  381. end
  382. end
  383. def test_glob_super_root
  384. bug9648 = '[ruby-core:61552] [Bug #9648]'
  385. roots = Dir.glob("/*")
  386. assert_equal(roots.map {|n| "/..#{n}"}, Dir.glob("/../*"), bug9648)
  387. end
  388. if /mswin|mingw/ =~ RUBY_PLATFORM
  389. def test_glob_legacy_short_name
  390. bug10819 = '[ruby-core:67954] [Bug #10819]'
  391. bug11206 = '[ruby-core:69435] [Bug #11206]'
  392. skip unless /\A\w:/ =~ ENV["ProgramFiles"]
  393. short = "#$&/PROGRA~1"
  394. skip unless File.directory?(short)
  395. entries = Dir.glob("#{short}/Common*")
  396. assert_not_empty(entries, bug10819)
  397. long = File.expand_path(short)
  398. assert_equal(Dir.glob("#{long}/Common*"), entries, bug10819)
  399. wild = short.sub(/1\z/, '*')
  400. assert_not_include(Dir.glob(wild), long, bug11206)
  401. assert_include(Dir.glob(wild, File::FNM_SHORTNAME), long, bug10819)
  402. assert_empty(entries - Dir.glob("#{wild}/Common*", File::FNM_SHORTNAME), bug10819)
  403. end
  404. end
  405. def test_home
  406. env_home = ENV["HOME"]
  407. env_logdir = ENV["LOGDIR"]
  408. ENV.delete("HOME")
  409. ENV.delete("LOGDIR")
  410. ENV["HOME"] = @nodir
  411. assert_nothing_raised(ArgumentError) do
  412. assert_equal(@nodir, Dir.home)
  413. end
  414. assert_nothing_raised(ArgumentError) do
  415. assert_equal(@nodir, Dir.home(""))
  416. end
  417. if user = ENV["USER"]
  418. tilde = windows? ? "~" : "~#{user}"
  419. assert_nothing_raised(ArgumentError) do
  420. assert_equal(File.expand_path(tilde), Dir.home(user))
  421. end
  422. end
  423. %W[no:such:user \u{7559 5b88}:\u{756a}].each do |user|
  424. assert_raise_with_message(ArgumentError, /#{user}/) {Dir.home(user)}
  425. end
  426. ensure
  427. ENV["HOME"] = env_home
  428. ENV["LOGDIR"] = env_logdir
  429. end
  430. def test_symlinks_not_resolved
  431. Dir.mktmpdir do |dirname|
  432. Dir.chdir(dirname) do
  433. begin
  434. File.symlink('some-dir', 'dir-symlink')
  435. rescue NotImplementedError, Errno::EACCES
  436. return
  437. end
  438. Dir.mkdir('some-dir')
  439. File.write('some-dir/foo', 'some content')
  440. assert_equal [ 'dir-symlink', 'some-dir' ], Dir['*']
  441. assert_equal [ 'dir-symlink', 'some-dir', 'some-dir/foo' ], Dir['**/*']
  442. end
  443. end
  444. end
  445. def test_fileno
  446. Dir.open(".") {|d|
  447. if d.respond_to? :fileno
  448. assert_kind_of(Integer, d.fileno)
  449. else
  450. assert_raise(NotImplementedError) { d.fileno }
  451. end
  452. }
  453. end
  454. def test_empty?
  455. assert_not_send([Dir, :empty?, @root])
  456. a = File.join(@root, "a")
  457. assert_send([Dir, :empty?, a])
  458. %w[A .dot].each do |tmp|
  459. tmp = File.join(a, tmp)
  460. open(tmp, "w") {}
  461. assert_not_send([Dir, :empty?, a])
  462. File.delete(tmp)
  463. assert_send([Dir, :empty?, a])
  464. Dir.mkdir(tmp)
  465. assert_not_send([Dir, :empty?, a])
  466. Dir.rmdir(tmp)
  467. assert_send([Dir, :empty?, a])
  468. end
  469. assert_raise(Errno::ENOENT) {Dir.empty?(@nodir)}
  470. assert_not_send([Dir, :empty?, File.join(@root, "b")])
  471. assert_raise(ArgumentError) {Dir.empty?(@root+"\0")}
  472. end
  473. def test_glob_gc_for_fd
  474. assert_separately(["-C", @root], "#{<<-"begin;"}\n#{<<-"end;"}", timeout: 3)
  475. begin;
  476. Process.setrlimit(Process::RLIMIT_NOFILE, 50)
  477. begin
  478. fs = []
  479. tap {tap {tap {(0..100).each {fs << open(IO::NULL)}}}}
  480. rescue Errno::EMFILE
  481. ensure
  482. fs.clear
  483. end
  484. list = Dir.glob("*")
  485. assert_not_empty(list)
  486. assert_equal([*"a".."z"], list)
  487. end;
  488. end if defined?(Process::RLIMIT_NOFILE)
  489. def test_glob_array_with_destructive_element
  490. args = Array.new(100, "")
  491. pat = Struct.new(:ary).new(args)
  492. args.push(pat, *Array.new(100) {"."*40})
  493. def pat.to_path
  494. ary.clear
  495. GC.start
  496. ""
  497. end
  498. assert_empty(Dir.glob(args))
  499. end
  500. end