PageRenderTime 92ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/test/mri/test_find.rb

http://github.com/jruby/jruby
Ruby | 302 lines | 273 code | 28 blank | 1 comment | 9 complexity | 8ddf93af7e6f42db057aefcd25cadffd MD5 | raw file
Possible License(s): GPL-3.0, BSD-3-Clause, GPL-2.0, JSON, LGPL-2.1
  1. # frozen_string_literal: false
  2. require 'test/unit'
  3. require 'find'
  4. require 'tmpdir'
  5. class TestFind < Test::Unit::TestCase
  6. def test_empty
  7. Dir.mktmpdir {|d|
  8. a = []
  9. Find.find(d) {|f| a << f }
  10. assert_equal([d], a)
  11. }
  12. end
  13. def test_rec
  14. Dir.mktmpdir {|d|
  15. File.open("#{d}/a", "w"){}
  16. Dir.mkdir("#{d}/b")
  17. File.open("#{d}/b/a", "w"){}
  18. File.open("#{d}/b/b", "w"){}
  19. Dir.mkdir("#{d}/c")
  20. a = []
  21. Find.find(d) {|f| a << f }
  22. assert_equal([d, "#{d}/a", "#{d}/b", "#{d}/b/a", "#{d}/b/b", "#{d}/c"], a)
  23. }
  24. end
  25. def test_relative
  26. Dir.mktmpdir {|d|
  27. File.open("#{d}/a", "w"){}
  28. Dir.mkdir("#{d}/b")
  29. File.open("#{d}/b/a", "w"){}
  30. File.open("#{d}/b/b", "w"){}
  31. Dir.mkdir("#{d}/c")
  32. a = []
  33. Dir.chdir(d) {
  34. Find.find(".") {|f| a << f }
  35. }
  36. assert_equal([".", "./a", "./b", "./b/a", "./b/b", "./c"], a)
  37. }
  38. end
  39. def test_dont_follow_symlink
  40. Dir.mktmpdir {|d|
  41. File.open("#{d}/a", "w"){}
  42. Dir.mkdir("#{d}/b")
  43. File.open("#{d}/b/a", "w"){}
  44. File.open("#{d}/b/b", "w"){}
  45. begin
  46. File.symlink("#{d}/b", "#{d}/c")
  47. rescue NotImplementedError, Errno::EACCES
  48. skip "symlink is not supported."
  49. end
  50. a = []
  51. Find.find(d) {|f| a << f }
  52. assert_equal([d, "#{d}/a", "#{d}/b", "#{d}/b/a", "#{d}/b/b", "#{d}/c"], a)
  53. }
  54. end
  55. def test_prune
  56. Dir.mktmpdir {|d|
  57. File.open("#{d}/a", "w"){}
  58. Dir.mkdir("#{d}/b")
  59. File.open("#{d}/b/a", "w"){}
  60. File.open("#{d}/b/b", "w"){}
  61. Dir.mkdir("#{d}/c")
  62. a = []
  63. Find.find(d) {|f|
  64. a << f
  65. Find.prune if f == "#{d}/b"
  66. }
  67. assert_equal([d, "#{d}/a", "#{d}/b", "#{d}/c"], a)
  68. }
  69. end
  70. def test_countup3
  71. Dir.mktmpdir {|d|
  72. 1.upto(3) {|n| File.open("#{d}/#{n}", "w"){} }
  73. a = []
  74. Find.find(d) {|f| a << f }
  75. assert_equal([d, "#{d}/1", "#{d}/2", "#{d}/3"], a)
  76. }
  77. end
  78. def test_countdown3
  79. Dir.mktmpdir {|d|
  80. 3.downto(1) {|n| File.open("#{d}/#{n}", "w"){} }
  81. a = []
  82. Find.find(d) {|f| a << f }
  83. assert_equal([d, "#{d}/1", "#{d}/2", "#{d}/3"], a)
  84. }
  85. end
  86. def test_unreadable_dir
  87. skip "no meaning test on Windows" if /mswin|mingw/ =~ RUBY_PLATFORM
  88. Dir.mktmpdir {|d|
  89. Dir.mkdir(dir = "#{d}/dir")
  90. File.open("#{dir}/foo", "w"){}
  91. begin
  92. File.chmod(0300, dir)
  93. a = []
  94. Find.find(d) {|f| a << f }
  95. assert_equal([d, dir], a)
  96. a = []
  97. Find.find(d, ignore_error: true) {|f| a << f }
  98. assert_equal([d, dir], a)
  99. a = []
  100. Find.find(d, ignore_error: true).each {|f| a << f }
  101. assert_equal([d, dir], a)
  102. a = []
  103. assert_raise_with_message(Errno::EACCES, /#{Regexp.quote(dir)}/) do
  104. Find.find(d, ignore_error: false) {|f| a << f }
  105. end
  106. assert_equal([d, dir], a)
  107. a = []
  108. assert_raise_with_message(Errno::EACCES, /#{Regexp.quote(dir)}/) do
  109. Find.find(d, ignore_error: false).each {|f| a << f }
  110. end
  111. assert_equal([d, dir], a)
  112. ensure
  113. File.chmod(0700, dir)
  114. end
  115. }
  116. end
  117. def test_unsearchable_dir
  118. Dir.mktmpdir {|d|
  119. Dir.mkdir(dir = "#{d}/dir")
  120. File.open(file = "#{dir}/foo", "w"){}
  121. begin
  122. File.chmod(0600, dir)
  123. a = []
  124. Find.find(d) {|f| a << f }
  125. assert_equal([d, dir, file], a)
  126. a = []
  127. Find.find(d, ignore_error: true) {|f| a << f }
  128. assert_equal([d, dir, file], a)
  129. a = []
  130. Find.find(d, ignore_error: true).each {|f| a << f }
  131. assert_equal([d, dir, file], a)
  132. skip "no meaning test on Windows" if /mswin|mingw/ =~ RUBY_PLATFORM
  133. a = []
  134. assert_raise_with_message(Errno::EACCES, /#{Regexp.quote(file)}/) do
  135. Find.find(d, ignore_error: false) {|f| a << f }
  136. end
  137. assert_equal([d, dir, file], a)
  138. a = []
  139. assert_raise_with_message(Errno::EACCES, /#{Regexp.quote(file)}/) do
  140. Find.find(d, ignore_error: false).each {|f| a << f }
  141. end
  142. assert_equal([d, dir, file], a)
  143. assert_raise(Errno::EACCES) { File.lstat(file) }
  144. ensure
  145. File.chmod(0700, dir)
  146. end
  147. }
  148. end
  149. def test_dangling_symlink
  150. Dir.mktmpdir {|d|
  151. begin
  152. File.symlink("foo", "#{d}/bar")
  153. rescue NotImplementedError, Errno::EACCES
  154. skip "symlink is not supported."
  155. end
  156. a = []
  157. Find.find(d) {|f| a << f }
  158. assert_equal([d, "#{d}/bar"], a)
  159. assert_raise(Errno::ENOENT) { File.stat("#{d}/bar") }
  160. }
  161. end
  162. def test_dangling_symlink_stat_error
  163. Dir.mktmpdir {|d|
  164. begin
  165. File.symlink("foo", "#{d}/bar")
  166. rescue NotImplementedError, Errno::EACCES
  167. skip "symlink is not supported."
  168. end
  169. assert_raise(Errno::ENOENT) {
  170. Find.find(d) {|f| File.stat(f) }
  171. }
  172. }
  173. end
  174. def test_change_dir_to_file
  175. Dir.mktmpdir {|d|
  176. Dir.mkdir(dir_1 = "#{d}/d1")
  177. File.open(file_a = "#{dir_1}/a", "w"){}
  178. File.open(file_b = "#{dir_1}/b", "w"){}
  179. File.open(file_c = "#{dir_1}/c", "w"){}
  180. Dir.mkdir(dir_d = "#{dir_1}/d")
  181. File.open("#{dir_d}/e", "w"){}
  182. dir_2 = "#{d}/d2"
  183. a = []
  184. Find.find(d) {|f|
  185. a << f
  186. if f == file_b
  187. File.rename(dir_1, dir_2)
  188. File.open(dir_1, "w") {}
  189. end
  190. }
  191. assert_equal([d, dir_1, file_a, file_b, file_c, dir_d], a)
  192. }
  193. end
  194. def test_change_dir_to_symlink_loop
  195. Dir.mktmpdir {|d|
  196. Dir.mkdir(dir_1 = "#{d}/d1")
  197. File.open(file_a = "#{dir_1}/a", "w"){}
  198. File.open(file_b = "#{dir_1}/b", "w"){}
  199. File.open(file_c = "#{dir_1}/c", "w"){}
  200. Dir.mkdir(dir_d = "#{dir_1}/d")
  201. File.open("#{dir_d}/e", "w"){}
  202. dir_2 = "#{d}/d2"
  203. a = []
  204. Find.find(d) {|f|
  205. a << f
  206. if f == file_b
  207. File.rename(dir_1, dir_2)
  208. begin
  209. File.symlink("d1", dir_1)
  210. rescue NotImplementedError, Errno::EACCES
  211. skip "symlink is not supported."
  212. end
  213. end
  214. }
  215. assert_equal([d, dir_1, file_a, file_b, file_c, dir_d], a)
  216. }
  217. end
  218. def test_enumerator
  219. Dir.mktmpdir {|d|
  220. File.open("#{d}/a", "w"){}
  221. Dir.mkdir("#{d}/b")
  222. File.open("#{d}/b/a", "w"){}
  223. File.open("#{d}/b/b", "w"){}
  224. Dir.mkdir("#{d}/c")
  225. e = Find.find(d)
  226. a = []
  227. e.each {|f| a << f }
  228. assert_equal([d, "#{d}/a", "#{d}/b", "#{d}/b/a", "#{d}/b/b", "#{d}/c"], a)
  229. }
  230. end
  231. def test_encoding_ascii
  232. Dir.mktmpdir {|d|
  233. File.open("#{d}/a", "w"){}
  234. Dir.mkdir("#{d}/b")
  235. a = []
  236. Find.find(d.encode(Encoding::US_ASCII)) {|f| a << f }
  237. a.each do |i|
  238. assert(Encoding.compatible?(d.encode(Encoding.find('filesystem')), i))
  239. end
  240. }
  241. end
  242. def test_encoding_non_ascii
  243. Dir.mktmpdir {|d|
  244. File.open("#{d}/a", "w"){}
  245. Dir.mkdir("#{d}/b")
  246. euc_jp = Encoding::EUC_JP
  247. win_31j = Encoding::Windows_31J
  248. utf_8 = Encoding::UTF_8
  249. a = []
  250. Find.find(d.encode(euc_jp), d.encode(win_31j), d.encode(utf_8)) {|f| a << [f, f.encoding] }
  251. assert_equal([[d, euc_jp], ["#{d}/a", euc_jp], ["#{d}/b", euc_jp],
  252. [d, win_31j], ["#{d}/a", win_31j], ["#{d}/b", win_31j],
  253. [d, utf_8], ["#{d}/a", utf_8], ["#{d}/b", utf_8]],
  254. a)
  255. if /mswin|mingw/ =~ RUBY_PLATFORM
  256. a = []
  257. Dir.mkdir("#{d}/\u{2660}")
  258. Find.find("#{d}".encode(utf_8)) {|f| a << [f, f.encoding] }
  259. assert_equal([[d, utf_8], ["#{d}/a", utf_8], ["#{d}/b", utf_8], ["#{d}/\u{2660}", utf_8]], a)
  260. end
  261. }
  262. end
  263. class TestInclude < Test::Unit::TestCase
  264. include Find
  265. def test_functional_call
  266. Dir.mktmpdir {|d|
  267. File.open("#{d}/a", "w"){}
  268. a = []
  269. find(d) {|f| a << f }
  270. assert_equal([d, "#{d}/a"], a)
  271. }
  272. end
  273. end
  274. end