PageRenderTime 42ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/projects/jruby-1.7.3/test/rubicon/test_file.rb

https://gitlab.com/essere.lab.public/qualitas.class-corpus
Ruby | 736 lines | 677 code | 50 blank | 9 comment | 12 complexity | d7834afc77f56c6e093746b101f6a692 MD5 | raw file
  1. require 'test/unit'
  2. require 'stat'
  3. require 'socket'
  4. # Fixme: needs platform-specific stuff dealt with
  5. class TestFile < Test::Unit::TestCase
  6. #
  7. # Setup some files in a test directory.
  8. #
  9. def setupTestDir
  10. @start = Dir.getwd
  11. teardownTestDir
  12. begin
  13. Dir.mkdir("_test")
  14. rescue
  15. $stderr.puts "Cannot run a file or directory test: " +
  16. "will destroy existing directory _test"
  17. exit(99)
  18. end
  19. File.open(File.join("_test", "_file1"), "w", 0644) {}
  20. File.open(File.join("_test", "_file2"), "w", 0644) {}
  21. @files = %w(. .. _file1 _file2)
  22. end
  23. def deldir(name)
  24. File.chmod(0755, name)
  25. Dir.foreach(name) do |f|
  26. next if f == '.' || f == '..'
  27. f = File.join(name, f)
  28. if File.lstat(f).directory?
  29. deldir(f)
  30. else
  31. File.chmod(0644, f) rescue true
  32. File.delete(f)
  33. end
  34. end
  35. Dir.rmdir(name)
  36. end
  37. def teardownTestDir
  38. Dir.chdir(@start)
  39. deldir("_test") if (File.exists?("_test"))
  40. end
  41. def setup
  42. setupTestDir
  43. @file = File.join("_test", "_touched")
  44. touch("-a -t 122512341999 #@file")
  45. @aTime = Time.local(1999, 12, 25, 12, 34, 00)
  46. touch("-m -t 010112341997 #@file")
  47. @mTime = Time.local(1997, 1, 1, 12, 34, 00)
  48. end
  49. def teardown
  50. File.delete @file if File.exist?(@file)
  51. teardownTestDir
  52. end
  53. Windows.dont do # FAT file systems only store mtime
  54. def test_s_atime
  55. assert_equal(@aTime, File.atime(@file))
  56. end
  57. end
  58. def test_s_basename
  59. assert_equal("_touched", File.basename(@file))
  60. assert_equal("tmp", File.basename(File.join("/tmp")))
  61. assert_equal("b", File.basename(File.join(*%w( g f d s a b))))
  62. assert_equal("tmp", File.basename("/tmp", ".*"))
  63. assert_equal("tmp", File.basename("/tmp", ".c"))
  64. assert_equal("tmp", File.basename("/tmp.c", ".c"))
  65. assert_equal("tmp", File.basename("/tmp.c", ".*"))
  66. assert_equal("tmp.o", File.basename("/tmp.o", ".c"))
  67. Version.greater_or_equal("1.8.0") do
  68. assert_equal("tmp", File.basename(File.join("/tmp/")))
  69. assert_equal("/", File.basename("/"))
  70. assert_equal("/", File.basename("//"))
  71. assert_equal("base", File.basename("dir///base", ".*"))
  72. assert_equal("base", File.basename("dir///base", ".c"))
  73. assert_equal("base", File.basename("dir///base.c", ".c"))
  74. assert_equal("base", File.basename("dir///base.c", ".*"))
  75. assert_equal("base.o", File.basename("dir///base.o", ".c"))
  76. assert_equal("base", File.basename("dir///base///"))
  77. assert_equal("base", File.basename("dir//base/", ".*"))
  78. assert_equal("base", File.basename("dir//base/", ".c"))
  79. assert_equal("base", File.basename("dir//base.c/", ".c"))
  80. assert_equal("base", File.basename("dir//base.c/", ".*"))
  81. assert_equal("base.o", File.basename("dir//base.o/", ".c"))
  82. end
  83. Version.less_than("1.8.0") do
  84. assert_equal("", File.basename(File.join("/tmp/")))
  85. assert_equal("", File.basename("/"))
  86. end
  87. Version.greater_or_equal("1.7.2") do
  88. unless File::ALT_SEPARATOR.nil?
  89. assert_equal("base", File.basename("dir" + File::ALT_SEPARATOR + "base"))
  90. end
  91. end
  92. end
  93. def test_s_chmod
  94. assert_raise(Errno::ENOENT) { File.chmod(0, "_gumby") }
  95. assert_equal(0, File.chmod(0))
  96. Dir.chdir("_test")
  97. begin
  98. assert_equal(1, File.chmod(0, "_file1"))
  99. assert_equal(2, File.chmod(0, "_file1", "_file2"))
  100. assert_equal(_stat_map(0), File.stat("_file1").mode & 0777)
  101. assert_equal(1, File.chmod(0400, "_file1"))
  102. assert_equal(_stat_map(0400), File.stat("_file1").mode & 0777)
  103. assert_equal(1, File.chmod(0644, "_file1"))
  104. assert_equal(_stat_map(0644), File.stat("_file1").mode & 0777)
  105. ensure
  106. Dir.chdir("..")
  107. end
  108. end
  109. def test_s_chown
  110. super_user
  111. end
  112. def test_s_ctime
  113. sys("touch #@file")
  114. ctime = RubiconStat::ctime(@file)
  115. @cTime = Time.at(ctime)
  116. assert_equal(@cTime, File.ctime(@file))
  117. end
  118. def test_s_delete
  119. Dir.chdir("_test")
  120. assert_equal(0, File.delete)
  121. assert_raise(Errno::ENOENT) { File.delete("gumby") }
  122. assert_equal(2, File.delete("_file1", "_file2"))
  123. end
  124. def test_s_dirname
  125. assert_equal("/", File.dirname(File.join("/tmp")))
  126. assert_equal("g/f/d/s/a", File.dirname(File.join(*%w( g f d s a b))))
  127. assert_equal("/", File.dirname("/"))
  128. Version.greater_or_equal("1.8.0") do
  129. assert_equal("/", File.dirname(File.join("/tmp/")))
  130. end
  131. Version.less_than("1.8.0") do
  132. assert_equal("/tmp", File.dirname(File.join("/tmp/")))
  133. end
  134. Version.greater_or_equal("1.7.2") do
  135. unless File::ALT_SEPARATOR.nil?
  136. assert_equal("dir", File.dirname("dir" + File::ALT_SEPARATOR + "base"))
  137. end
  138. end
  139. end
  140. def test_s_expand_path
  141. if $os == MsWin32
  142. base = `cd`.chomp.tr '\\', '/'
  143. tmpdir = "c:/tmp"
  144. rootdir = "c:/"
  145. else
  146. base = `pwd`.chomp
  147. tmpdir = "/tmp"
  148. rootdir = "/"
  149. end
  150. assert_equal(base, File.expand_path(''))
  151. assert_equal(File.join(base, 'a'), File.expand_path('a'))
  152. assert_equal(File.join(base, 'a'), File.expand_path('a', nil)) # V0.1.1
  153. # Because of Ruby-Talk:18512
  154. assert_equal(File.join(base, 'a.'), File.expand_path('a.'))
  155. assert_equal(File.join(base, '.a'), File.expand_path('.a'))
  156. assert_equal(File.join(base, 'a..'), File.expand_path('a..'))
  157. assert_equal(File.join(base, '..a'), File.expand_path('..a'))
  158. assert_equal(File.join(base, 'a../b'), File.expand_path('a../b'))
  159. b1 = File.join(base.split(File::SEPARATOR)[0..-2])
  160. assert_equal(b1, File.expand_path('..'))
  161. assert_equal("#{tmpdir}", File.expand_path("", "#{tmpdir}"))
  162. assert_equal("#{tmpdir}/a", File.expand_path("a", "#{tmpdir}"))
  163. assert_equal("#{tmpdir}/a", File.expand_path("../a", "#{tmpdir}/xxx"))
  164. assert_equal("#{rootdir}", File.expand_path(".", "#{rootdir}"))
  165. home = ENV['HOME']
  166. if (home)
  167. assert_equal(home, File.expand_path('~'))
  168. assert_equal(home, File.expand_path('~', '/tmp/gumby/ddd'))
  169. assert_equal(File.join(home, 'a'),
  170. File.expand_path('~/a', '/tmp/gumby/ddd'))
  171. else
  172. skipping("$HOME not set")
  173. end
  174. begin
  175. File.open("/etc/passwd") do |pw|
  176. users = pw.readlines
  177. line = ''
  178. line = users.pop while users.nitems > 0 and (line.length == 0 || /^\+:/ =~ line)
  179. if line.length > 0
  180. line = line.split(':')
  181. name, home = line[0], line[-2]
  182. assert_equal(home, File.expand_path("~#{name}"))
  183. assert_equal(home, File.expand_path("~#{name}", "/tmp/gumby"))
  184. assert_equal(File.join(home, 'a'),
  185. File.expand_path("~#{name}/a", "/tmp/gumby"))
  186. end
  187. end
  188. rescue Errno::ENOENT
  189. skipping("~user")
  190. end
  191. end
  192. def test_extname
  193. assert_equal(".c", File.extname("alpha.c"))
  194. assert_equal("", File.extname("beta"))
  195. assert_equal("", File.extname(".gamma"))
  196. assert_equal(".", File.extname("delta."))
  197. assert_equal(".c", File.extname("some/dir/alpha.c"))
  198. assert_equal("", File.extname("some/dir/beta"))
  199. assert_equal("", File.extname("some/dir/.gamma"))
  200. assert_equal(".", File.extname("some/dir/delta."))
  201. assert_equal(".e", File.extname("a.b.c.d.e"))
  202. end
  203. def generic_test_s_fnmatch(method)
  204. assert_equal(true, File.send(method, 'cat', 'cat'))
  205. assert_equal(false, File.send(method, 'cat', 'category'))
  206. assert_equal(false, File.send(method, 'c{at,ub}s', 'cats'))
  207. assert_equal(false, File.send(method, 'c{at,ub}s', 'cubs'))
  208. assert_equal(false, File.send(method, 'c{at,ub}s', 'cat'))
  209. assert_equal(true, File.send(method, 'c?t', 'cat'))
  210. assert_equal(false, File.send(method, 'c\?t', 'cat'))
  211. assert_equal(false, File.send(method, 'c??t', 'cat'))
  212. assert_equal(true, File.send(method, 'c*', 'cats'))
  213. assert_equal(true, File.send(method, '*s', 'cats'))
  214. assert_equal(false, File.send(method, '*x*', 'cats'))
  215. assert_equal(false, File.send(method, 'c/**/x', 'c/a/b/c/t'))
  216. assert_equal(true, File.send(method, 'c/**/t', 'c/a/b/c/t'))
  217. assert_equal(true, File.send(method, 'c/*/t', 'c/a/b/c/t'))
  218. assert_equal(false, File.send(method, 'c/*/t', 'c/a/b/c/t',
  219. File::FNM_PATHNAME))
  220. assert_equal(true, File.send(method, 'c*t', 'cat'))
  221. assert_equal(true, File.send(method, 'c\at', 'cat'))
  222. assert_equal(false, File.send(method, 'c\at', 'cat', File::FNM_NOESCAPE))
  223. assert_equal(true, File.send(method, 'a?b', 'a/b'))
  224. assert_equal(false, File.send(method, 'a?b', 'a/b', File::FNM_PATHNAME))
  225. assert_equal(false, File.send(method, '*', '.profile'))
  226. assert_equal(true, File.send(method, '*', '.profile', File::FNM_DOTMATCH))
  227. assert_equal(true, File.send(method, '*', 'dave/.profile'))
  228. assert_equal(true, File.send(method, '*', 'dave/.profile',
  229. File::FNM_DOTMATCH))
  230. assert_equal(false, File.send(method, '*', 'dave/.profile',
  231. File::FNM_PATHNAME))
  232. assert_equal(false, File.send(method, '*/*', 'dave/.profile',
  233. File::FNM_PATHNAME))
  234. strict = File::FNM_PATHNAME | File::FNM_DOTMATCH
  235. assert_equal(true, File.send(method, '*/*', 'dave/.profile', strict))
  236. assert_equal(false, File.send(method, 'cat', 'CAt'))
  237. assert_equal(true, File.send(method, 'cat', 'CAt', File::FNM_CASEFOLD))
  238. assert_equal(true, File.send(method, 'c[au]t', 'cat'))
  239. assert_equal(true, File.send(method, 'c[au]t', 'cut'))
  240. assert_equal(false, File.send(method, 'c[au]t', 'cot'))
  241. assert_equal(false, File.send(method, 'c[^au]t', 'cat'))
  242. assert_equal(false, File.send(method, 'c[^au]t', 'cut'))
  243. assert_equal(true, File.send(method, 'c[^au]t', 'cot'))
  244. for ch in "a".."z"
  245. inside = ch >= "h" && ch <= "p" || ch == "x"
  246. str = "c#{ch}t"
  247. comment = "matching #{str.inspect}"
  248. assert_equal(inside, File.send(method, 'c[h-px]t', str), comment)
  249. assert_equal(!inside, File.send(method, 'c[^h-px]t', str), comment)
  250. end
  251. end
  252. def test_s_fnmatch
  253. generic_test_s_fnmatch(:fnmatch)
  254. end
  255. def test_s_fnmatch?
  256. generic_test_s_fnmatch(:fnmatch?)
  257. end
  258. def test_s_ftype
  259. Dir.chdir("_test")
  260. sock = nil
  261. MsWin32.dont do
  262. sock = UNIXServer.open("_sock")
  263. File.symlink("_file1", "_file3") # may fail
  264. end
  265. begin
  266. tests = {
  267. "../_test" => "directory",
  268. "_file1" => "file",
  269. }
  270. Windows.dont do
  271. begin
  272. tests[File.expand_path(File.readlink("/dev/tty"), "/dev")] =
  273. "characterSpecial"
  274. rescue Errno::EINVAL
  275. tests["/dev/tty"] = "characterSpecial"
  276. end
  277. end
  278. MsWin32.dont do
  279. tests["_file3"] = "link"
  280. tests["_sock"] = "socket"
  281. end
  282. Linux.only do
  283. tests["/dev/"+`readlink /dev/fd0 || echo fd0`.chomp] = "blockSpecial"
  284. system("mkfifo _fifo") # may fail
  285. tests["_fifo"] = "fifo"
  286. end
  287. tests.each { |file, type|
  288. if File.exists?(file)
  289. assert_equal(type, File.ftype(file), file.dup)
  290. else
  291. skipping("#{type} not supported")
  292. end
  293. }
  294. ensure
  295. sock.close if sock
  296. end
  297. end
  298. def test_s_join
  299. [
  300. %w( a b c d ),
  301. %w( a ),
  302. %w( ),
  303. %w( a b .. c )
  304. ].each do |a|
  305. assert_equal(a.join(File::SEPARATOR), File.join(*a))
  306. end
  307. end
  308. def test_s_link
  309. Dir.chdir("_test")
  310. begin
  311. assert_equal(0, File.link("_file1", "_file3"))
  312. assert(File.exists?("_file3"))
  313. Windows.dont do
  314. assert_equal(2, File.stat("_file1").nlink)
  315. assert_equal(2, File.stat("_file3").nlink)
  316. assert(File.stat("_file1").ino == File.stat("_file3").ino)
  317. end
  318. ensure
  319. Dir.chdir("..")
  320. end
  321. end
  322. MsWin32.dont do
  323. def test_s_lstat
  324. Dir.chdir("_test")
  325. File.symlink("_file1", "_file3") # may fail
  326. assert_equal(0, File.stat("_file3").size)
  327. assert(0 < File.lstat("_file3").size)
  328. assert_equal(0, File.stat("_file1").size)
  329. assert_equal(0, File.lstat("_file1").size)
  330. end
  331. end
  332. def test_s_mtime
  333. assert_equal(@mTime, File.mtime(@file))
  334. end
  335. # REFACTOR: this test is duplicated in TestFile
  336. def test_s_open
  337. file1 = "_test/_file1"
  338. assert_raise(Errno::ENOENT) { File.open("_gumby") }
  339. # test block/non block forms
  340. f = File.open(file1)
  341. begin
  342. assert_equal(File, f.class)
  343. ensure
  344. f.close
  345. end
  346. assert_nil(File.open(file1) { |f| assert_equal(File, f.class)})
  347. # test modes
  348. modes = [
  349. %w( r w r+ w+ a a+ ),
  350. [ File::RDONLY,
  351. File::WRONLY | File::CREAT,
  352. File::RDWR,
  353. File::RDWR + File::TRUNC + File::CREAT,
  354. File::WRONLY + File::APPEND + File::CREAT,
  355. File::RDWR + File::APPEND + File::CREAT
  356. ]]
  357. for modeset in modes
  358. sys("rm -f #{file1}")
  359. sys("touch #{file1}")
  360. mode = modeset.shift # "r"
  361. # file: empty
  362. File.open(file1, mode) { |f|
  363. assert_nil(f.gets)
  364. assert_raise(IOError) { f.puts "wombat" }
  365. }
  366. mode = modeset.shift # "w"
  367. # file: empty
  368. File.open(file1, mode) { |f|
  369. assert_nil(f.puts("wombat"))
  370. assert_raise(IOError) { f.gets }
  371. }
  372. mode = modeset.shift # "r+"
  373. # file: wombat
  374. File.open(file1, mode) { |f|
  375. assert_equal("wombat\n", f.gets)
  376. assert_nil(f.puts("koala"))
  377. f.rewind
  378. assert_equal("wombat\n", f.gets)
  379. assert_equal("koala\n", f.gets)
  380. }
  381. mode = modeset.shift # "w+"
  382. # file: wombat/koala
  383. File.open(file1, mode) { |f|
  384. assert_nil(f.gets)
  385. assert_nil(f.puts("koala"))
  386. f.rewind
  387. assert_equal("koala\n", f.gets)
  388. }
  389. mode = modeset.shift # "a"
  390. # file: koala
  391. File.open(file1, mode) { |f|
  392. assert_nil(f.puts("wombat"))
  393. assert_raise(IOError) { f.gets }
  394. }
  395. mode = modeset.shift # "a+"
  396. # file: koala/wombat
  397. File.open(file1, mode) { |f|
  398. assert_nil(f.puts("wallaby"))
  399. f.rewind
  400. assert_equal("koala\n", f.gets)
  401. assert_equal("wombat\n", f.gets)
  402. assert_equal("wallaby\n", f.gets)
  403. }
  404. end
  405. # Now try creating files
  406. filen = "_test/_filen"
  407. File.open(filen, "w") {}
  408. begin
  409. assert(File.exists?(filen))
  410. ensure
  411. File.delete(filen)
  412. end
  413. File.open(filen, File::CREAT, 0444) {}
  414. begin
  415. assert(File.exists?(filen))
  416. Cygwin.known_problem do
  417. assert_equal(0444 & ~File.umask, File.stat(filen).mode & 0777)
  418. end
  419. ensure
  420. WindowsNative.or_variant do
  421. # to be able to delete the file on Windows
  422. File.chmod(0666, filen)
  423. end
  424. File.delete(filen)
  425. end
  426. end
  427. def test_s_readlink
  428. MsWin32.dont do
  429. Dir.chdir("_test")
  430. File.symlink("_file1", "_file3") # may fail
  431. assert_equal("_file1", File.readlink("_file3"))
  432. assert_raise(Errno::EINVAL) { File.readlink("_file1") }
  433. end
  434. end
  435. def test_s_rename
  436. Dir.chdir("_test")
  437. assert_raise(Errno::ENOENT) { File.rename("gumby", "pokey") }
  438. assert_equal(0, File.rename("_file1", "_renamed"))
  439. assert(!File.exists?("_file1"))
  440. assert(File.exists?("_renamed"))
  441. end
  442. def test_s_size
  443. file = "_test/_file1"
  444. assert_raise(Errno::ENOENT) { File.size("gumby") }
  445. assert_equal(0, File.size(file))
  446. File.open(file, "w") { |f| f.puts "123456789" }
  447. if $os == MsWin32
  448. assert_equal(11, File.size(file))
  449. else
  450. assert_equal(10, File.size(file))
  451. end
  452. end
  453. def test_s_split
  454. %w{ "/", "/tmp", "/tmp/a", "/tmp/a/b", "/tmp/a/b/", "/tmp//a",
  455. "/tmp//"
  456. }.each { |file|
  457. assert_equal( [ File.dirname(file), File.basename(file) ],
  458. File.split(file), file )
  459. }
  460. end
  461. # Stat is pretty much tested elsewhere, so we're minimal here
  462. def test_s_stat
  463. assert_instance_of(File::Stat, File.stat("."))
  464. end
  465. def test_s_symlink
  466. MsWin32.dont do
  467. Dir.chdir("_test")
  468. File.symlink("_file1", "_file3") # may fail
  469. assert(File.symlink?("_file3"))
  470. assert(!File.symlink?("_file1"))
  471. end
  472. end
  473. def test_s_truncate
  474. file = "_test/_file1"
  475. File.open(file, "w") { |f| f.puts "123456789" }
  476. if $os <= MsWin32
  477. assert_equal(11, File.size(file))
  478. else
  479. assert_equal(10, File.size(file))
  480. end
  481. File.truncate(file, 5)
  482. assert_equal(5, File.size(file))
  483. File.open(file, "r") { |f|
  484. assert_equal("12345", f.read(99))
  485. assert(f.eof?)
  486. }
  487. end
  488. MsWin32.dont do
  489. def myUmask
  490. Integer(`sh -c umask`.chomp)
  491. end
  492. def test_s_umask
  493. orig = myUmask
  494. assert_equal(myUmask, File.umask)
  495. assert_equal(myUmask, File.umask(0404))
  496. assert_equal(0404, File.umask(orig))
  497. end
  498. end
  499. def test_s_unlink
  500. Dir.chdir("_test")
  501. assert_equal(0, File.unlink)
  502. assert_raise(Errno::ENOENT) { File.unlink("gumby") }
  503. assert_equal(2, File.unlink("_file1", "_file2"))
  504. end
  505. def test_s_utime
  506. Dir.chdir("_test")
  507. begin
  508. [
  509. [ Time.at(18000), Time.at(53423) ],
  510. [ Time.at(Time.now.to_i), Time.at(54321) ],
  511. [ Time.at(121314), Time.now.to_i ] # observe the last instance is an integer!
  512. ].each { |aTime, mTime|
  513. File.utime(aTime, mTime, "_file1", "_file2")
  514. for file in [ "_file1", "_file2" ]
  515. assert_equal(aTime.to_i, File.stat(file).atime.to_i)
  516. assert_equal(mTime.to_i, File.stat(file).mtime.to_i)
  517. end
  518. }
  519. ensure
  520. Dir.chdir("..")
  521. end
  522. end
  523. # Instance methods
  524. Windows.dont do # FAT filesystems don't store this properly
  525. def test_atime
  526. File.open(@file) { |f| assert_equal(@aTime, f.atime) }
  527. end
  528. end
  529. def test_chmod
  530. Dir.chdir("_test")
  531. File.open("_file1") { |f|
  532. assert_equal(0, f.chmod(0))
  533. assert_equal(_fstat_map(0), f.stat.mode & 0777)
  534. assert_equal(0, f.chmod(0400))
  535. assert_equal(_fstat_map(0400), f.stat.mode & 0777)
  536. assert_equal(0, f.chmod(0644))
  537. assert_equal(_fstat_map(0644), f.stat.mode & 0777)
  538. }
  539. end
  540. def test_chown
  541. super_user
  542. end
  543. def test_ctime
  544. sys("touch #@file")
  545. ctime = RubiconStat::ctime(@file)
  546. @cTime = Time.at(ctime)
  547. File.open(@file) { |f| assert_equal(@cTime, f.ctime) }
  548. end
  549. def test_flock
  550. MsWin32.dont do
  551. Dir.chdir("_test")
  552. # parent forks, then waits for a SIGUSR1 from child. Child locks file
  553. # and signals parent, then sleeps
  554. # When parent gets signal, confirms file si locked, kills child,
  555. # and confirms its unlocked
  556. pid = fork
  557. if pid
  558. File.open("_file1", "w") { |f|
  559. trap("USR1") {
  560. assert_equal(false, f.flock(File::LOCK_EX | File::LOCK_NB))
  561. Process.kill "KILL", pid
  562. Process.waitpid(pid, 0)
  563. assert_equal(0, f.flock(File::LOCK_EX | File::LOCK_NB))
  564. return
  565. }
  566. sleep 10
  567. fail("Never got signalled")
  568. }
  569. else
  570. File.open("_file1", "w") { |f|
  571. assert_equal(0, f.flock(File::LOCK_EX))
  572. sleep 1
  573. Process.kill "USR1", Process.ppid
  574. sleep 10
  575. fail "Parent never killed us"
  576. }
  577. end
  578. end
  579. end
  580. def test_lstat
  581. MsWin32.dont do
  582. Dir.chdir("_test")
  583. begin
  584. File.symlink("_file1", "_file3") # may fail
  585. f1 = File.open("_file1")
  586. begin
  587. f3 = File.open("_file3")
  588. assert_equal(0, f3.stat.size)
  589. assert(0 < f3.lstat.size)
  590. assert_equal(0, f1.stat.size)
  591. assert_equal(0, f1.lstat.size)
  592. f3.close
  593. ensure
  594. f1.close
  595. end
  596. ensure
  597. Dir.chdir("..")
  598. end
  599. end
  600. end
  601. def test_mtime
  602. File.open(@file) { |f| assert_equal(@mTime, f.mtime) }
  603. end
  604. def test_path
  605. File.open(@file) { |f| assert_equal(@file, f.path) }
  606. end
  607. def test_truncate
  608. file = "_test/_file1"
  609. File.open(file, "w") { |f|
  610. f.syswrite "123456789"
  611. f.truncate(5)
  612. }
  613. assert_equal(5, File.size(file))
  614. File.open(file, "r") { |f|
  615. assert_equal("12345", f.read(99))
  616. assert(f.eof?)
  617. }
  618. end
  619. end