PageRenderTime 61ms CodeModel.GetById 25ms RepoModel.GetById 1ms app.codeStats 0ms

/lib/zip/test/zipfilesystemtest.rb

https://bitbucket.org/technopunk2099/metasploit-framework
Ruby | 845 lines | 683 code | 147 blank | 15 comment | 6 complexity | 1ec694bd8161121e3c27908341f114e5 MD5 | raw file
Possible License(s): BSD-3-Clause, Apache-2.0, LGPL-2.1, GPL-2.0, MIT
  1. #!/usr/bin/env ruby
  2. $VERBOSE = true
  3. $: << "../lib"
  4. require 'zip/zipfilesystem'
  5. require 'test/unit'
  6. require 'fileutils'
  7. module ExtraAssertions
  8. def assert_forwarded(anObject, method, retVal, *expectedArgs)
  9. callArgs = nil
  10. setCallArgsProc = proc { |args| callArgs = args }
  11. anObject.instance_eval <<-"end_eval"
  12. alias #{method}_org #{method}
  13. def #{method}(*args)
  14. ObjectSpace._id2ref(#{setCallArgsProc.object_id}).call(args)
  15. ObjectSpace._id2ref(#{retVal.object_id})
  16. end
  17. end_eval
  18. assert_equal(retVal, yield) # Invoke test
  19. assert_equal(expectedArgs, callArgs)
  20. ensure
  21. anObject.instance_eval "undef #{method}; alias #{method} #{method}_org"
  22. end
  23. end
  24. include Zip
  25. class ZipFsFileNonmutatingTest < Test::Unit::TestCase
  26. def setup
  27. @zipFile = ZipFile.new("data/zipWithDirs.zip")
  28. end
  29. def teardown
  30. @zipFile.close if @zipFile
  31. end
  32. def test_umask
  33. assert_equal(File.umask, @zipFile.file.umask)
  34. @zipFile.file.umask(0006)
  35. end
  36. def test_exists?
  37. assert(! @zipFile.file.exists?("notAFile"))
  38. assert(@zipFile.file.exists?("file1"))
  39. assert(@zipFile.file.exists?("dir1"))
  40. assert(@zipFile.file.exists?("dir1/"))
  41. assert(@zipFile.file.exists?("dir1/file12"))
  42. assert(@zipFile.file.exist?("dir1/file12")) # notice, tests exist? alias of exists? !
  43. @zipFile.dir.chdir "dir1/"
  44. assert(!@zipFile.file.exists?("file1"))
  45. assert(@zipFile.file.exists?("file12"))
  46. end
  47. def test_open_read
  48. blockCalled = false
  49. @zipFile.file.open("file1", "r") {
  50. |f|
  51. blockCalled = true
  52. assert_equal("this is the entry 'file1' in my test archive!",
  53. f.readline.chomp)
  54. }
  55. assert(blockCalled)
  56. blockCalled = false
  57. @zipFile.file.open("file1", "rb") { # test binary flag is ignored
  58. |f|
  59. blockCalled = true
  60. assert_equal("this is the entry 'file1' in my test archive!",
  61. f.readline.chomp)
  62. }
  63. assert(blockCalled)
  64. blockCalled = false
  65. @zipFile.dir.chdir "dir2"
  66. @zipFile.file.open("file21", "r") {
  67. |f|
  68. blockCalled = true
  69. assert_equal("this is the entry 'dir2/file21' in my test archive!",
  70. f.readline.chomp)
  71. }
  72. assert(blockCalled)
  73. @zipFile.dir.chdir "/"
  74. assert_raise(Errno::ENOENT) {
  75. @zipFile.file.open("noSuchEntry")
  76. }
  77. begin
  78. is = @zipFile.file.open("file1")
  79. assert_equal("this is the entry 'file1' in my test archive!",
  80. is.readline.chomp)
  81. ensure
  82. is.close if is
  83. end
  84. end
  85. def test_new
  86. begin
  87. is = @zipFile.file.new("file1")
  88. assert_equal("this is the entry 'file1' in my test archive!",
  89. is.readline.chomp)
  90. ensure
  91. is.close if is
  92. end
  93. begin
  94. is = @zipFile.file.new("file1") {
  95. fail "should not call block"
  96. }
  97. ensure
  98. is.close if is
  99. end
  100. end
  101. def test_symlink
  102. assert_raise(NotImplementedError) {
  103. @zipFile.file.symlink("file1", "aSymlink")
  104. }
  105. end
  106. def test_size
  107. assert_raise(Errno::ENOENT) { @zipFile.file.size("notAFile") }
  108. assert_equal(72, @zipFile.file.size("file1"))
  109. assert_equal(0, @zipFile.file.size("dir2/dir21"))
  110. assert_equal(72, @zipFile.file.stat("file1").size)
  111. assert_equal(0, @zipFile.file.stat("dir2/dir21").size)
  112. end
  113. def test_size?
  114. assert_equal(nil, @zipFile.file.size?("notAFile"))
  115. assert_equal(72, @zipFile.file.size?("file1"))
  116. assert_equal(nil, @zipFile.file.size?("dir2/dir21"))
  117. assert_equal(72, @zipFile.file.stat("file1").size?)
  118. assert_equal(nil, @zipFile.file.stat("dir2/dir21").size?)
  119. end
  120. def test_file?
  121. assert(@zipFile.file.file?("file1"))
  122. assert(@zipFile.file.file?("dir2/file21"))
  123. assert(! @zipFile.file.file?("dir1"))
  124. assert(! @zipFile.file.file?("dir1/dir11"))
  125. assert(@zipFile.file.stat("file1").file?)
  126. assert(@zipFile.file.stat("dir2/file21").file?)
  127. assert(! @zipFile.file.stat("dir1").file?)
  128. assert(! @zipFile.file.stat("dir1/dir11").file?)
  129. end
  130. include ExtraAssertions
  131. def test_dirname
  132. assert_forwarded(File, :dirname, "retVal", "a/b/c/d") {
  133. @zipFile.file.dirname("a/b/c/d")
  134. }
  135. end
  136. def test_basename
  137. assert_forwarded(File, :basename, "retVal", "a/b/c/d") {
  138. @zipFile.file.basename("a/b/c/d")
  139. }
  140. end
  141. def test_split
  142. assert_forwarded(File, :split, "retVal", "a/b/c/d") {
  143. @zipFile.file.split("a/b/c/d")
  144. }
  145. end
  146. def test_join
  147. assert_equal("a/b/c", @zipFile.file.join("a/b", "c"))
  148. assert_equal("a/b/c/d", @zipFile.file.join("a/b", "c/d"))
  149. assert_equal("/c/d", @zipFile.file.join("", "c/d"))
  150. assert_equal("a/b/c/d", @zipFile.file.join("a", "b", "c", "d"))
  151. end
  152. def test_utime
  153. t_now = Time.now
  154. t_bak = @zipFile.file.mtime("file1")
  155. @zipFile.file.utime(t_now, "file1")
  156. assert_equal(t_now, @zipFile.file.mtime("file1"))
  157. @zipFile.file.utime(t_bak, "file1")
  158. assert_equal(t_bak, @zipFile.file.mtime("file1"))
  159. end
  160. def assert_always_false(operation)
  161. assert(! @zipFile.file.send(operation, "noSuchFile"))
  162. assert(! @zipFile.file.send(operation, "file1"))
  163. assert(! @zipFile.file.send(operation, "dir1"))
  164. assert(! @zipFile.file.stat("file1").send(operation))
  165. assert(! @zipFile.file.stat("dir1").send(operation))
  166. end
  167. def assert_true_if_entry_exists(operation)
  168. assert(! @zipFile.file.send(operation, "noSuchFile"))
  169. assert(@zipFile.file.send(operation, "file1"))
  170. assert(@zipFile.file.send(operation, "dir1"))
  171. assert(@zipFile.file.stat("file1").send(operation))
  172. assert(@zipFile.file.stat("dir1").send(operation))
  173. end
  174. def test_pipe?
  175. assert_always_false(:pipe?)
  176. end
  177. def test_blockdev?
  178. assert_always_false(:blockdev?)
  179. end
  180. def test_symlink?
  181. assert_always_false(:symlink?)
  182. end
  183. def test_socket?
  184. assert_always_false(:socket?)
  185. end
  186. def test_chardev?
  187. assert_always_false(:chardev?)
  188. end
  189. def test_truncate
  190. assert_raise(StandardError, "truncate not supported") {
  191. @zipFile.file.truncate("file1", 100)
  192. }
  193. end
  194. def assert_e_n_o_e_n_t(operation, args = ["NoSuchFile"])
  195. assert_raise(Errno::ENOENT) {
  196. @zipFile.file.send(operation, *args)
  197. }
  198. end
  199. def test_ftype
  200. assert_e_n_o_e_n_t(:ftype)
  201. assert_equal("file", @zipFile.file.ftype("file1"))
  202. assert_equal("directory", @zipFile.file.ftype("dir1/dir11"))
  203. assert_equal("directory", @zipFile.file.ftype("dir1/dir11/"))
  204. end
  205. def test_link
  206. assert_raise(NotImplementedError) {
  207. @zipFile.file.link("file1", "someOtherString")
  208. }
  209. end
  210. def test_directory?
  211. assert(! @zipFile.file.directory?("notAFile"))
  212. assert(! @zipFile.file.directory?("file1"))
  213. assert(! @zipFile.file.directory?("dir1/file11"))
  214. assert(@zipFile.file.directory?("dir1"))
  215. assert(@zipFile.file.directory?("dir1/"))
  216. assert(@zipFile.file.directory?("dir2/dir21"))
  217. assert(! @zipFile.file.stat("file1").directory?)
  218. assert(! @zipFile.file.stat("dir1/file11").directory?)
  219. assert(@zipFile.file.stat("dir1").directory?)
  220. assert(@zipFile.file.stat("dir1/").directory?)
  221. assert(@zipFile.file.stat("dir2/dir21").directory?)
  222. end
  223. def test_chown
  224. assert_equal(2, @zipFile.file.chown(1,2, "dir1", "file1"))
  225. assert_equal(1, @zipFile.file.stat("dir1").uid)
  226. assert_equal(2, @zipFile.file.stat("dir1").gid)
  227. assert_equal(2, @zipFile.file.chown(nil, nil, "dir1", "file1"))
  228. end
  229. def test_zero?
  230. assert(! @zipFile.file.zero?("notAFile"))
  231. assert(! @zipFile.file.zero?("file1"))
  232. assert(@zipFile.file.zero?("dir1"))
  233. blockCalled = false
  234. ZipFile.open("data/generated/5entry.zip") {
  235. |zf|
  236. blockCalled = true
  237. assert(zf.file.zero?("data/generated/empty.txt"))
  238. }
  239. assert(blockCalled)
  240. assert(! @zipFile.file.stat("file1").zero?)
  241. assert(@zipFile.file.stat("dir1").zero?)
  242. blockCalled = false
  243. ZipFile.open("data/generated/5entry.zip") {
  244. |zf|
  245. blockCalled = true
  246. assert(zf.file.stat("data/generated/empty.txt").zero?)
  247. }
  248. assert(blockCalled)
  249. end
  250. def test_expand_path
  251. ZipFile.open("data/zipWithDirs.zip") {
  252. |zf|
  253. assert_equal("/", zf.file.expand_path("."))
  254. zf.dir.chdir "dir1"
  255. assert_equal("/dir1", zf.file.expand_path("."))
  256. assert_equal("/dir1/file12", zf.file.expand_path("file12"))
  257. assert_equal("/", zf.file.expand_path(".."))
  258. assert_equal("/dir2/dir21", zf.file.expand_path("../dir2/dir21"))
  259. }
  260. end
  261. def test_mtime
  262. assert_equal(Time.at(1027694306),
  263. @zipFile.file.mtime("dir2/file21"))
  264. assert_equal(Time.at(1027690863),
  265. @zipFile.file.mtime("dir2/dir21"))
  266. assert_raise(Errno::ENOENT) {
  267. @zipFile.file.mtime("noSuchEntry")
  268. }
  269. assert_equal(Time.at(1027694306),
  270. @zipFile.file.stat("dir2/file21").mtime)
  271. assert_equal(Time.at(1027690863),
  272. @zipFile.file.stat("dir2/dir21").mtime)
  273. end
  274. def test_ctime
  275. assert_nil(@zipFile.file.ctime("file1"))
  276. assert_nil(@zipFile.file.stat("file1").ctime)
  277. end
  278. def test_atime
  279. assert_nil(@zipFile.file.atime("file1"))
  280. assert_nil(@zipFile.file.stat("file1").atime)
  281. end
  282. def test_readable?
  283. assert(! @zipFile.file.readable?("noSuchFile"))
  284. assert(@zipFile.file.readable?("file1"))
  285. assert(@zipFile.file.readable?("dir1"))
  286. assert(@zipFile.file.stat("file1").readable?)
  287. assert(@zipFile.file.stat("dir1").readable?)
  288. end
  289. def test_readable_real?
  290. assert(! @zipFile.file.readable_real?("noSuchFile"))
  291. assert(@zipFile.file.readable_real?("file1"))
  292. assert(@zipFile.file.readable_real?("dir1"))
  293. assert(@zipFile.file.stat("file1").readable_real?)
  294. assert(@zipFile.file.stat("dir1").readable_real?)
  295. end
  296. def test_writable?
  297. assert(! @zipFile.file.writable?("noSuchFile"))
  298. assert(@zipFile.file.writable?("file1"))
  299. assert(@zipFile.file.writable?("dir1"))
  300. assert(@zipFile.file.stat("file1").writable?)
  301. assert(@zipFile.file.stat("dir1").writable?)
  302. end
  303. def test_writable_real?
  304. assert(! @zipFile.file.writable_real?("noSuchFile"))
  305. assert(@zipFile.file.writable_real?("file1"))
  306. assert(@zipFile.file.writable_real?("dir1"))
  307. assert(@zipFile.file.stat("file1").writable_real?)
  308. assert(@zipFile.file.stat("dir1").writable_real?)
  309. end
  310. def test_executable?
  311. assert(! @zipFile.file.executable?("noSuchFile"))
  312. assert(! @zipFile.file.executable?("file1"))
  313. assert(@zipFile.file.executable?("dir1"))
  314. assert(! @zipFile.file.stat("file1").executable?)
  315. assert(@zipFile.file.stat("dir1").executable?)
  316. end
  317. def test_executable_real?
  318. assert(! @zipFile.file.executable_real?("noSuchFile"))
  319. assert(! @zipFile.file.executable_real?("file1"))
  320. assert(@zipFile.file.executable_real?("dir1"))
  321. assert(! @zipFile.file.stat("file1").executable_real?)
  322. assert(@zipFile.file.stat("dir1").executable_real?)
  323. end
  324. def test_owned?
  325. assert_true_if_entry_exists(:owned?)
  326. end
  327. def test_grpowned?
  328. assert_true_if_entry_exists(:grpowned?)
  329. end
  330. def test_setgid?
  331. assert_always_false(:setgid?)
  332. end
  333. def test_setuid?
  334. assert_always_false(:setgid?)
  335. end
  336. def test_sticky?
  337. assert_always_false(:sticky?)
  338. end
  339. def test_readlink
  340. assert_raise(NotImplementedError) {
  341. @zipFile.file.readlink("someString")
  342. }
  343. end
  344. def test_stat
  345. s = @zipFile.file.stat("file1")
  346. assert(s.kind_of?(File::Stat)) # It pretends
  347. assert_raise(Errno::ENOENT, "No such file or directory - noSuchFile") {
  348. @zipFile.file.stat("noSuchFile")
  349. }
  350. end
  351. def test_lstat
  352. assert(@zipFile.file.lstat("file1").file?)
  353. end
  354. def test_chmod
  355. assert_raise(Errno::ENOENT, "No such file or directory - noSuchFile") {
  356. @zipFile.file.chmod(0644, "file1", "NoSuchFile")
  357. }
  358. assert_equal(2, @zipFile.file.chmod(0644, "file1", "dir1"))
  359. end
  360. def test_pipe
  361. assert_raise(NotImplementedError) {
  362. @zipFile.file.pipe
  363. }
  364. end
  365. def test_foreach
  366. ZipFile.open("data/generated/zipWithDir.zip") {
  367. |zf|
  368. ref = []
  369. File.foreach("data/file1.txt") { |e| ref << e }
  370. index = 0
  371. zf.file.foreach("data/file1.txt") {
  372. |l|
  373. assert_equal(ref[index], l)
  374. index = index.next
  375. }
  376. assert_equal(ref.size, index)
  377. }
  378. ZipFile.open("data/generated/zipWithDir.zip") {
  379. |zf|
  380. ref = []
  381. File.foreach("data/file1.txt", " ") { |e| ref << e }
  382. index = 0
  383. zf.file.foreach("data/file1.txt", " ") {
  384. |l|
  385. assert_equal(ref[index], l)
  386. index = index.next
  387. }
  388. assert_equal(ref.size, index)
  389. }
  390. end
  391. def test_popen
  392. if RUBY_PLATFORM =~ /mswin|mingw/i
  393. cmd = 'dir'
  394. else
  395. cmd = 'ls'
  396. end
  397. assert_equal(File.popen(cmd) { |f| f.read },
  398. @zipFile.file.popen(cmd) { |f| f.read })
  399. end
  400. # Can be added later
  401. # def test_select
  402. # fail "implement test"
  403. # end
  404. def test_readlines
  405. ZipFile.open("data/generated/zipWithDir.zip") {
  406. |zf|
  407. assert_equal(File.readlines("data/file1.txt"),
  408. zf.file.readlines("data/file1.txt"))
  409. }
  410. end
  411. def test_read
  412. ZipFile.open("data/generated/zipWithDir.zip") {
  413. |zf|
  414. assert_equal(File.read("data/file1.txt"),
  415. zf.file.read("data/file1.txt"))
  416. }
  417. end
  418. end
  419. class ZipFsFileStatTest < Test::Unit::TestCase
  420. def setup
  421. @zipFile = ZipFile.new("data/zipWithDirs.zip")
  422. end
  423. def teardown
  424. @zipFile.close if @zipFile
  425. end
  426. def test_blocks
  427. assert_equal(nil, @zipFile.file.stat("file1").blocks)
  428. end
  429. def test_ino
  430. assert_equal(0, @zipFile.file.stat("file1").ino)
  431. end
  432. def test_uid
  433. assert_equal(0, @zipFile.file.stat("file1").uid)
  434. end
  435. def test_gid
  436. assert_equal(0, @zipFile.file.stat("file1").gid)
  437. end
  438. def test_ftype
  439. assert_equal("file", @zipFile.file.stat("file1").ftype)
  440. assert_equal("directory", @zipFile.file.stat("dir1").ftype)
  441. end
  442. def test_mode
  443. assert_equal(0600, @zipFile.file.stat("file1").mode & 0777)
  444. assert_equal(0600, @zipFile.file.stat("file1").mode & 0777)
  445. assert_equal(0755, @zipFile.file.stat("dir1").mode & 0777)
  446. assert_equal(0755, @zipFile.file.stat("dir1").mode & 0777)
  447. end
  448. def test_dev
  449. assert_equal(0, @zipFile.file.stat("file1").dev)
  450. end
  451. def test_rdev
  452. assert_equal(0, @zipFile.file.stat("file1").rdev)
  453. end
  454. def test_rdev_major
  455. assert_equal(0, @zipFile.file.stat("file1").rdev_major)
  456. end
  457. def test_rdev_minor
  458. assert_equal(0, @zipFile.file.stat("file1").rdev_minor)
  459. end
  460. def test_nlink
  461. assert_equal(1, @zipFile.file.stat("file1").nlink)
  462. end
  463. def test_blksize
  464. assert_nil(@zipFile.file.stat("file1").blksize)
  465. end
  466. end
  467. class ZipFsFileMutatingTest < Test::Unit::TestCase
  468. TEST_ZIP = "zipWithDirs_copy.zip"
  469. def setup
  470. FileUtils.cp("data/zipWithDirs.zip", TEST_ZIP)
  471. end
  472. def teardown
  473. end
  474. def test_delete
  475. do_test_delete_or_unlink(:delete)
  476. end
  477. def test_unlink
  478. do_test_delete_or_unlink(:unlink)
  479. end
  480. def test_open_write
  481. ZipFile.open(TEST_ZIP) {
  482. |zf|
  483. zf.file.open("test_open_write_entry", "w") {
  484. |f|
  485. blockCalled = true
  486. f.write "This is what I'm writing"
  487. }
  488. assert_equal("This is what I'm writing",
  489. zf.file.read("test_open_write_entry"))
  490. # Test with existing entry
  491. zf.file.open("file1", "wb") { #also check that 'b' option is ignored
  492. |f|
  493. blockCalled = true
  494. f.write "This is what I'm writing too"
  495. }
  496. assert_equal("This is what I'm writing too",
  497. zf.file.read("file1"))
  498. }
  499. end
  500. def test_rename
  501. ZipFile.open(TEST_ZIP) {
  502. |zf|
  503. assert_raise(Errno::ENOENT, "") {
  504. zf.file.rename("NoSuchFile", "bimse")
  505. }
  506. zf.file.rename("file1", "newNameForFile1")
  507. }
  508. ZipFile.open(TEST_ZIP) {
  509. |zf|
  510. assert(! zf.file.exists?("file1"))
  511. assert(zf.file.exists?("newNameForFile1"))
  512. }
  513. end
  514. def do_test_delete_or_unlink(symbol)
  515. ZipFile.open(TEST_ZIP) {
  516. |zf|
  517. assert(zf.file.exists?("dir2/dir21/dir221/file2221"))
  518. zf.file.send(symbol, "dir2/dir21/dir221/file2221")
  519. assert(! zf.file.exists?("dir2/dir21/dir221/file2221"))
  520. assert(zf.file.exists?("dir1/file11"))
  521. assert(zf.file.exists?("dir1/file12"))
  522. zf.file.send(symbol, "dir1/file11", "dir1/file12")
  523. assert(! zf.file.exists?("dir1/file11"))
  524. assert(! zf.file.exists?("dir1/file12"))
  525. assert_raise(Errno::ENOENT) { zf.file.send(symbol, "noSuchFile") }
  526. assert_raise(Errno::EISDIR) { zf.file.send(symbol, "dir1/dir11") }
  527. assert_raise(Errno::EISDIR) { zf.file.send(symbol, "dir1/dir11/") }
  528. }
  529. ZipFile.open(TEST_ZIP) {
  530. |zf|
  531. assert(! zf.file.exists?("dir2/dir21/dir221/file2221"))
  532. assert(! zf.file.exists?("dir1/file11"))
  533. assert(! zf.file.exists?("dir1/file12"))
  534. assert(zf.file.exists?("dir1/dir11"))
  535. assert(zf.file.exists?("dir1/dir11/"))
  536. }
  537. end
  538. end
  539. class ZipFsDirectoryTest < Test::Unit::TestCase
  540. TEST_ZIP = "zipWithDirs_copy.zip"
  541. def setup
  542. FileUtils.cp("data/zipWithDirs.zip", TEST_ZIP)
  543. end
  544. def test_delete
  545. ZipFile.open(TEST_ZIP) {
  546. |zf|
  547. assert_raise(Errno::ENOENT, "No such file or directory - NoSuchFile.txt") {
  548. zf.dir.delete("NoSuchFile.txt")
  549. }
  550. assert_raise(Errno::EINVAL, "Invalid argument - file1") {
  551. zf.dir.delete("file1")
  552. }
  553. assert(zf.file.exists?("dir1"))
  554. zf.dir.delete("dir1")
  555. assert(! zf.file.exists?("dir1"))
  556. }
  557. end
  558. def test_mkdir
  559. ZipFile.open(TEST_ZIP) {
  560. |zf|
  561. assert_raise(Errno::EEXIST, "File exists - dir1") {
  562. zf.dir.mkdir("file1")
  563. }
  564. assert_raise(Errno::EEXIST, "File exists - dir1") {
  565. zf.dir.mkdir("dir1")
  566. }
  567. assert(!zf.file.exists?("newDir"))
  568. zf.dir.mkdir("newDir")
  569. assert(zf.file.directory?("newDir"))
  570. assert(!zf.file.exists?("newDir2"))
  571. zf.dir.mkdir("newDir2", 3485)
  572. assert(zf.file.directory?("newDir2"))
  573. }
  574. end
  575. def test_pwd_chdir_entries
  576. ZipFile.open(TEST_ZIP) {
  577. |zf|
  578. assert_equal("/", zf.dir.pwd)
  579. assert_raise(Errno::ENOENT, "No such file or directory - no such dir") {
  580. zf.dir.chdir "no such dir"
  581. }
  582. assert_raise(Errno::EINVAL, "Invalid argument - file1") {
  583. zf.dir.chdir "file1"
  584. }
  585. assert_equal(["dir1", "dir2", "file1"].sort, zf.dir.entries(".").sort)
  586. zf.dir.chdir "dir1"
  587. assert_equal("/dir1", zf.dir.pwd)
  588. assert_equal(["dir11", "file11", "file12"], zf.dir.entries(".").sort)
  589. zf.dir.chdir "../dir2/dir21"
  590. assert_equal("/dir2/dir21", zf.dir.pwd)
  591. assert_equal(["dir221"].sort, zf.dir.entries(".").sort)
  592. }
  593. end
  594. def test_foreach
  595. ZipFile.open(TEST_ZIP) {
  596. |zf|
  597. blockCalled = false
  598. assert_raise(Errno::ENOENT, "No such file or directory - noSuchDir") {
  599. zf.dir.foreach("noSuchDir") { |e| blockCalled = true }
  600. }
  601. assert(! blockCalled)
  602. assert_raise(Errno::ENOTDIR, "Not a directory - file1") {
  603. zf.dir.foreach("file1") { |e| blockCalled = true }
  604. }
  605. assert(! blockCalled)
  606. entries = []
  607. zf.dir.foreach(".") { |e| entries << e }
  608. assert_equal(["dir1", "dir2", "file1"].sort, entries.sort)
  609. entries = []
  610. zf.dir.foreach("dir1") { |e| entries << e }
  611. assert_equal(["dir11", "file11", "file12"], entries.sort)
  612. }
  613. end
  614. def test_chroot
  615. ZipFile.open(TEST_ZIP) {
  616. |zf|
  617. assert_raise(NotImplementedError) {
  618. zf.dir.chroot
  619. }
  620. }
  621. end
  622. # Globbing not supported yet
  623. #def test_glob
  624. # # test alias []-operator too
  625. # fail "implement test"
  626. #end
  627. def test_open_new
  628. ZipFile.open(TEST_ZIP) {
  629. |zf|
  630. assert_raise(Errno::ENOTDIR, "Not a directory - file1") {
  631. zf.dir.new("file1")
  632. }
  633. assert_raise(Errno::ENOENT, "No such file or directory - noSuchFile") {
  634. zf.dir.new("noSuchFile")
  635. }
  636. d = zf.dir.new(".")
  637. assert_equal(["file1", "dir1", "dir2"].sort, d.entries.sort)
  638. d.close
  639. zf.dir.open("dir1") {
  640. |dir|
  641. assert_equal(["dir11", "file11", "file12"].sort, dir.entries.sort)
  642. }
  643. }
  644. end
  645. end
  646. class ZipFsDirIteratorTest < Test::Unit::TestCase
  647. FILENAME_ARRAY = [ "f1", "f2", "f3", "f4", "f5", "f6" ]
  648. def setup
  649. @dirIt = ZipFileSystem::ZipFsDirIterator.new(FILENAME_ARRAY)
  650. end
  651. def test_close
  652. @dirIt.close
  653. assert_raise(IOError, "closed directory") {
  654. @dirIt.each { |e| p e }
  655. }
  656. assert_raise(IOError, "closed directory") {
  657. @dirIt.read
  658. }
  659. assert_raise(IOError, "closed directory") {
  660. @dirIt.rewind
  661. }
  662. assert_raise(IOError, "closed directory") {
  663. @dirIt.seek(0)
  664. }
  665. assert_raise(IOError, "closed directory") {
  666. @dirIt.tell
  667. }
  668. end
  669. def test_each
  670. # Tested through Enumerable.entries
  671. assert_equal(FILENAME_ARRAY, @dirIt.entries)
  672. end
  673. def test_read
  674. FILENAME_ARRAY.size.times {
  675. |i|
  676. assert_equal(FILENAME_ARRAY[i], @dirIt.read)
  677. }
  678. end
  679. def test_rewind
  680. @dirIt.read
  681. @dirIt.read
  682. assert_equal(FILENAME_ARRAY[2], @dirIt.read)
  683. @dirIt.rewind
  684. assert_equal(FILENAME_ARRAY[0], @dirIt.read)
  685. end
  686. def test_tell_seek
  687. @dirIt.read
  688. @dirIt.read
  689. pos = @dirIt.tell
  690. valAtPos = @dirIt.read
  691. @dirIt.read
  692. @dirIt.seek(pos)
  693. assert_equal(valAtPos, @dirIt.read)
  694. end
  695. end
  696. # Copyright (C) 2002, 2003 Thomas Sondergaard
  697. # rubyzip is free software; you can redistribute it and/or
  698. # modify it under the terms of the ruby license.