rubyzip 1.2.3 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +64 -23
  3. data/lib/zip.rb +5 -3
  4. data/lib/zip/constants.rb +52 -0
  5. data/lib/zip/crypto/decrypted_io.rb +39 -0
  6. data/lib/zip/decompressor.rb +19 -1
  7. data/lib/zip/dos_time.rb +5 -0
  8. data/lib/zip/entry.rb +34 -10
  9. data/lib/zip/errors.rb +2 -0
  10. data/lib/zip/extra_field/generic.rb +1 -1
  11. data/lib/zip/extra_field/universal_time.rb +39 -12
  12. data/lib/zip/file.rb +68 -34
  13. data/lib/zip/inflater.rb +22 -36
  14. data/lib/zip/input_stream.rb +28 -24
  15. data/lib/zip/ioextras/abstract_input_stream.rb +6 -0
  16. data/lib/zip/null_decompressor.rb +1 -9
  17. data/lib/zip/pass_thru_decompressor.rb +13 -22
  18. data/lib/zip/streamable_stream.rb +1 -6
  19. data/lib/zip/version.rb +1 -1
  20. metadata +12 -154
  21. data/test/basic_zip_file_test.rb +0 -60
  22. data/test/case_sensitivity_test.rb +0 -69
  23. data/test/central_directory_entry_test.rb +0 -69
  24. data/test/central_directory_test.rb +0 -100
  25. data/test/crypto/null_encryption_test.rb +0 -57
  26. data/test/crypto/traditional_encryption_test.rb +0 -80
  27. data/test/data/WarnInvalidDate.zip +0 -0
  28. data/test/data/file1.txt +0 -46
  29. data/test/data/file1.txt.deflatedData +0 -0
  30. data/test/data/file2.txt +0 -1504
  31. data/test/data/globTest.zip +0 -0
  32. data/test/data/globTest/foo.txt +0 -0
  33. data/test/data/globTest/foo/bar/baz/foo.txt +0 -0
  34. data/test/data/globTest/food.txt +0 -0
  35. data/test/data/gpbit3stored.zip +0 -0
  36. data/test/data/mimetype +0 -1
  37. data/test/data/notzippedruby.rb +0 -7
  38. data/test/data/ntfs.zip +0 -0
  39. data/test/data/oddExtraField.zip +0 -0
  40. data/test/data/path_traversal/Makefile +0 -10
  41. data/test/data/path_traversal/jwilk/README.md +0 -5
  42. data/test/data/path_traversal/jwilk/absolute1.zip +0 -0
  43. data/test/data/path_traversal/jwilk/absolute2.zip +0 -0
  44. data/test/data/path_traversal/jwilk/dirsymlink.zip +0 -0
  45. data/test/data/path_traversal/jwilk/dirsymlink2a.zip +0 -0
  46. data/test/data/path_traversal/jwilk/dirsymlink2b.zip +0 -0
  47. data/test/data/path_traversal/jwilk/relative0.zip +0 -0
  48. data/test/data/path_traversal/jwilk/relative2.zip +0 -0
  49. data/test/data/path_traversal/jwilk/symlink.zip +0 -0
  50. data/test/data/path_traversal/relative1.zip +0 -0
  51. data/test/data/path_traversal/tilde.zip +0 -0
  52. data/test/data/path_traversal/tuzovakaoff/README.md +0 -3
  53. data/test/data/path_traversal/tuzovakaoff/absolutepath.zip +0 -0
  54. data/test/data/path_traversal/tuzovakaoff/symlink.zip +0 -0
  55. data/test/data/rubycode.zip +0 -0
  56. data/test/data/rubycode2.zip +0 -0
  57. data/test/data/test.xls +0 -0
  58. data/test/data/testDirectory.bin +0 -0
  59. data/test/data/zip64-sample.zip +0 -0
  60. data/test/data/zipWithDirs.zip +0 -0
  61. data/test/data/zipWithEncryption.zip +0 -0
  62. data/test/deflater_test.rb +0 -65
  63. data/test/encryption_test.rb +0 -42
  64. data/test/entry_set_test.rb +0 -163
  65. data/test/entry_test.rb +0 -154
  66. data/test/errors_test.rb +0 -35
  67. data/test/extra_field_test.rb +0 -76
  68. data/test/file_extract_directory_test.rb +0 -54
  69. data/test/file_extract_test.rb +0 -83
  70. data/test/file_permissions_test.rb +0 -65
  71. data/test/file_split_test.rb +0 -57
  72. data/test/file_test.rb +0 -601
  73. data/test/filesystem/dir_iterator_test.rb +0 -58
  74. data/test/filesystem/directory_test.rb +0 -139
  75. data/test/filesystem/file_mutating_test.rb +0 -87
  76. data/test/filesystem/file_nonmutating_test.rb +0 -508
  77. data/test/filesystem/file_stat_test.rb +0 -64
  78. data/test/gentestfiles.rb +0 -126
  79. data/test/inflater_test.rb +0 -14
  80. data/test/input_stream_test.rb +0 -182
  81. data/test/ioextras/abstract_input_stream_test.rb +0 -102
  82. data/test/ioextras/abstract_output_stream_test.rb +0 -106
  83. data/test/ioextras/fake_io_test.rb +0 -18
  84. data/test/local_entry_test.rb +0 -154
  85. data/test/output_stream_test.rb +0 -128
  86. data/test/pass_thru_compressor_test.rb +0 -30
  87. data/test/pass_thru_decompressor_test.rb +0 -14
  88. data/test/path_traversal_test.rb +0 -141
  89. data/test/samples/example_recursive_test.rb +0 -37
  90. data/test/settings_test.rb +0 -95
  91. data/test/test_helper.rb +0 -234
  92. data/test/unicode_file_names_and_comments_test.rb +0 -62
  93. data/test/zip64_full_test.rb +0 -51
  94. data/test/zip64_support_test.rb +0 -14
@@ -1,35 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'test_helper'
4
-
5
- class ErrorsTest < MiniTest::Test
6
- def test_rescue_legacy_zip_error
7
- raise ::Zip::Error
8
- rescue ::Zip::ZipError
9
- end
10
-
11
- def test_rescue_legacy_zip_entry_exists_error
12
- raise ::Zip::EntryExistsError
13
- rescue ::Zip::ZipEntryExistsError
14
- end
15
-
16
- def test_rescue_legacy_zip_destination_file_exists_error
17
- raise ::Zip::DestinationFileExistsError
18
- rescue ::Zip::ZipDestinationFileExistsError
19
- end
20
-
21
- def test_rescue_legacy_zip_compression_method_error
22
- raise ::Zip::CompressionMethodError
23
- rescue ::Zip::ZipCompressionMethodError
24
- end
25
-
26
- def test_rescue_legacy_zip_entry_name_error
27
- raise ::Zip::EntryNameError
28
- rescue ::Zip::ZipEntryNameError
29
- end
30
-
31
- def test_rescue_legacy_zip_internal_error
32
- raise ::Zip::InternalError
33
- rescue ::Zip::ZipInternalError
34
- end
35
- end
@@ -1,76 +0,0 @@
1
- require 'test_helper'
2
-
3
- class ZipExtraFieldTest < MiniTest::Test
4
- def test_new
5
- extra_pure = ::Zip::ExtraField.new('')
6
- extra_withstr = ::Zip::ExtraField.new('foo')
7
- assert_instance_of(::Zip::ExtraField, extra_pure)
8
- assert_instance_of(::Zip::ExtraField, extra_withstr)
9
- end
10
-
11
- def test_unknownfield
12
- extra = ::Zip::ExtraField.new('foo')
13
- assert_equal(extra['Unknown'], 'foo')
14
- extra.merge('a')
15
- assert_equal(extra['Unknown'], 'fooa')
16
- extra.merge('barbaz')
17
- assert_equal(extra.to_s, 'fooabarbaz')
18
- end
19
-
20
- def test_ntfs
21
- str = "\x0A\x00 \x00\x00\x00\x00\x00\x01\x00\x18\x00\xC0\x81\x17\xE8B\xCE\xCF\x01\xC0\x81\x17\xE8B\xCE\xCF\x01\xC0\x81\x17\xE8B\xCE\xCF\x01"
22
- extra = ::Zip::ExtraField.new(str)
23
- assert(extra.member?('NTFS'))
24
- t = ::Zip::DOSTime.at(1_410_496_497.405178)
25
- assert_equal(t, extra['NTFS'].mtime)
26
- assert_equal(t, extra['NTFS'].atime)
27
- assert_equal(t, extra['NTFS'].ctime)
28
- end
29
-
30
- def test_merge
31
- str = "UT\x5\0\x3\250$\r@Ux\0\0"
32
- extra1 = ::Zip::ExtraField.new('')
33
- extra2 = ::Zip::ExtraField.new(str)
34
- assert(!extra1.member?('UniversalTime'))
35
- assert(extra2.member?('UniversalTime'))
36
- extra1.merge(str)
37
- assert_equal(extra1['UniversalTime'].mtime, extra2['UniversalTime'].mtime)
38
- end
39
-
40
- def test_length
41
- str = "UT\x5\0\x3\250$\r@Ux\0\0Te\0\0testit"
42
- extra = ::Zip::ExtraField.new(str)
43
- assert_equal(extra.local_size, extra.to_local_bin.size)
44
- assert_equal(extra.c_dir_size, extra.to_c_dir_bin.size)
45
- extra.merge('foo')
46
- assert_equal(extra.local_size, extra.to_local_bin.size)
47
- assert_equal(extra.c_dir_size, extra.to_c_dir_bin.size)
48
- end
49
-
50
- def test_to_s
51
- str = "UT\x5\0\x3\250$\r@Ux\0\0Te\0\0testit"
52
- extra = ::Zip::ExtraField.new(str)
53
- assert_instance_of(String, extra.to_s)
54
-
55
- s = extra.to_s
56
- extra.merge('foo')
57
- assert_equal(s.length + 3, extra.to_s.length)
58
- end
59
-
60
- def test_equality
61
- str = "UT\x5\0\x3\250$\r@"
62
- extra1 = ::Zip::ExtraField.new(str)
63
- extra2 = ::Zip::ExtraField.new(str)
64
- extra3 = ::Zip::ExtraField.new(str)
65
- assert_equal(extra1, extra2)
66
-
67
- extra2['UniversalTime'].mtime = ::Zip::DOSTime.now
68
- assert(extra1 != extra2)
69
-
70
- extra3.create('IUnix')
71
- assert(extra1 != extra3)
72
-
73
- extra1.create('IUnix')
74
- assert_equal(extra1, extra3)
75
- end
76
- end
@@ -1,54 +0,0 @@
1
- require 'test_helper'
2
-
3
- class ZipFileExtractDirectoryTest < MiniTest::Test
4
- include CommonZipFileFixture
5
-
6
- TEST_OUT_NAME = 'test/data/generated/emptyOutDir'
7
-
8
- def open_zip(&aProc)
9
- assert(!aProc.nil?)
10
- ::Zip::File.open(TestZipFile::TEST_ZIP4.zip_name, &aProc)
11
- end
12
-
13
- def extract_test_dir(&aProc)
14
- open_zip do |zf|
15
- zf.extract(TestFiles::EMPTY_TEST_DIR, TEST_OUT_NAME, &aProc)
16
- end
17
- end
18
-
19
- def setup
20
- super
21
-
22
- Dir.rmdir(TEST_OUT_NAME) if File.directory? TEST_OUT_NAME
23
- File.delete(TEST_OUT_NAME) if File.exist? TEST_OUT_NAME
24
- end
25
-
26
- def test_extract_directory
27
- extract_test_dir
28
- assert(File.directory?(TEST_OUT_NAME))
29
- end
30
-
31
- def test_extract_directory_exists_as_dir
32
- Dir.mkdir TEST_OUT_NAME
33
- extract_test_dir
34
- assert(File.directory?(TEST_OUT_NAME))
35
- end
36
-
37
- def test_extract_directory_exists_as_file
38
- File.open(TEST_OUT_NAME, 'w') { |f| f.puts 'something' }
39
- assert_raises(::Zip::DestinationFileExistsError) { extract_test_dir }
40
- end
41
-
42
- def test_extract_directory_exists_as_file_overwrite
43
- File.open(TEST_OUT_NAME, 'w') { |f| f.puts 'something' }
44
- gotCalled = false
45
- extract_test_dir do |entry, destPath|
46
- gotCalled = true
47
- assert_equal(TEST_OUT_NAME, destPath)
48
- assert(entry.directory?)
49
- true
50
- end
51
- assert(gotCalled)
52
- assert(File.directory?(TEST_OUT_NAME))
53
- end
54
- end
@@ -1,83 +0,0 @@
1
- require 'test_helper'
2
-
3
- class ZipFileExtractTest < MiniTest::Test
4
- include CommonZipFileFixture
5
- EXTRACTED_FILENAME = 'test/data/generated/extEntry'
6
- ENTRY_TO_EXTRACT, *REMAINING_ENTRIES = TEST_ZIP.entry_names.reverse
7
-
8
- def setup
9
- super
10
- ::File.delete(EXTRACTED_FILENAME) if ::File.exist?(EXTRACTED_FILENAME)
11
- end
12
-
13
- def test_extract
14
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
15
- zf.extract(ENTRY_TO_EXTRACT, EXTRACTED_FILENAME)
16
-
17
- assert(File.exist?(EXTRACTED_FILENAME))
18
- AssertEntry.assert_contents(EXTRACTED_FILENAME,
19
- zf.get_input_stream(ENTRY_TO_EXTRACT) { |is| is.read })
20
-
21
- ::File.unlink(EXTRACTED_FILENAME)
22
-
23
- entry = zf.get_entry(ENTRY_TO_EXTRACT)
24
- entry.extract(EXTRACTED_FILENAME)
25
-
26
- assert(File.exist?(EXTRACTED_FILENAME))
27
- AssertEntry.assert_contents(EXTRACTED_FILENAME,
28
- entry.get_input_stream { |is| is.read })
29
- end
30
- end
31
-
32
- def test_extract_exists
33
- writtenText = 'written text'
34
- ::File.open(EXTRACTED_FILENAME, 'w') { |f| f.write(writtenText) }
35
-
36
- assert_raises(::Zip::DestinationFileExistsError) do
37
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
38
- zf.extract(zf.entries.first, EXTRACTED_FILENAME)
39
- end
40
- end
41
- File.open(EXTRACTED_FILENAME, 'r') do |f|
42
- assert_equal(writtenText, f.read)
43
- end
44
- end
45
-
46
- def test_extract_exists_overwrite
47
- writtenText = 'written text'
48
- ::File.open(EXTRACTED_FILENAME, 'w') { |f| f.write(writtenText) }
49
-
50
- gotCalledCorrectly = false
51
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
52
- zf.extract(zf.entries.first, EXTRACTED_FILENAME) do |entry, extractLoc|
53
- gotCalledCorrectly = zf.entries.first == entry &&
54
- extractLoc == EXTRACTED_FILENAME
55
- true
56
- end
57
- end
58
-
59
- assert(gotCalledCorrectly)
60
- ::File.open(EXTRACTED_FILENAME, 'r') do |f|
61
- assert(writtenText != f.read)
62
- end
63
- end
64
-
65
- def test_extract_non_entry
66
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
67
- assert_raises(Errno::ENOENT) { zf.extract('nonExistingEntry', 'nonExistingEntry') }
68
- ensure
69
- zf.close if zf
70
- end
71
-
72
- def test_extract_non_entry_2
73
- outFile = 'outfile'
74
- assert_raises(Errno::ENOENT) do
75
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
76
- nonEntry = 'hotdog-diddelidoo'
77
- assert(!zf.entries.include?(nonEntry))
78
- zf.extract(nonEntry, outFile)
79
- zf.close
80
- end
81
- assert(!File.exist?(outFile))
82
- end
83
- end
@@ -1,65 +0,0 @@
1
- require 'test_helper'
2
-
3
- class FilePermissionsTest < MiniTest::Test
4
- ZIPNAME = File.join(File.dirname(__FILE__), 'umask.zip')
5
- FILENAME = File.join(File.dirname(__FILE__), 'umask.txt')
6
-
7
- def teardown
8
- ::File.unlink(ZIPNAME)
9
- ::File.unlink(FILENAME)
10
- end
11
-
12
- def test_current_umask
13
- create_files
14
- assert_matching_permissions FILENAME, ZIPNAME
15
- end
16
-
17
- def test_umask_000
18
- set_umask(0o000) do
19
- create_files
20
- end
21
-
22
- assert_matching_permissions FILENAME, ZIPNAME
23
- end
24
-
25
- def test_umask_066
26
- set_umask(0o066) do
27
- create_files
28
- end
29
-
30
- assert_matching_permissions FILENAME, ZIPNAME
31
- end
32
-
33
- def test_umask_027
34
- set_umask(0o027) do
35
- create_files
36
- end
37
-
38
- assert_matching_permissions FILENAME, ZIPNAME
39
- end
40
-
41
- def assert_matching_permissions(expected_file, actual_file)
42
- assert_equal(
43
- ::File.stat(expected_file).mode.to_s(8).rjust(4, '0'),
44
- ::File.stat(actual_file).mode.to_s(8).rjust(4, '0')
45
- )
46
- end
47
-
48
- def create_files
49
- ::Zip::File.open(ZIPNAME, ::Zip::File::CREATE) do |zip|
50
- zip.comment = 'test'
51
- end
52
-
53
- ::File.open(FILENAME, 'w') do |file|
54
- file << 'test'
55
- end
56
- end
57
-
58
- # If anything goes wrong, make sure the umask is restored.
59
- def set_umask(umask)
60
- saved_umask = ::File.umask(umask)
61
- yield
62
- ensure
63
- ::File.umask(saved_umask)
64
- end
65
- end
@@ -1,57 +0,0 @@
1
- require 'test_helper'
2
-
3
- class ZipFileSplitTest < MiniTest::Test
4
- TEST_ZIP = TestZipFile::TEST_ZIP2.clone
5
- TEST_ZIP.zip_name = 'large_zip_file.zip'
6
- EXTRACTED_FILENAME = 'test/data/generated/extEntrySplit'
7
- UNSPLITTED_FILENAME = 'test/data/generated/unsplitted.zip'
8
- ENTRY_TO_EXTRACT = TEST_ZIP.entry_names.first
9
-
10
- def setup
11
- FileUtils.cp(TestZipFile::TEST_ZIP2.zip_name, TEST_ZIP.zip_name)
12
- end
13
-
14
- def teardown
15
- File.delete(TEST_ZIP.zip_name)
16
- File.delete(UNSPLITTED_FILENAME) if File.exist?(UNSPLITTED_FILENAME)
17
-
18
- Dir["#{TEST_ZIP.zip_name}.*"].each do |zip_file_name|
19
- File.delete(zip_file_name) if File.exist?(zip_file_name)
20
- end
21
- end
22
-
23
- def test_split_method_respond
24
- assert_respond_to ::Zip::File, :split, 'Does not have split class method'
25
- end
26
-
27
- def test_split
28
- result = ::Zip::File.split(TEST_ZIP.zip_name, 65_536, false)
29
-
30
- return if result.nil?
31
- Dir["#{TEST_ZIP.zip_name}.*"].sort.each_with_index do |zip_file_name, index|
32
- File.open(zip_file_name, 'rb') do |zip_file|
33
- zip_file.read([::Zip::File::SPLIT_SIGNATURE].pack('V').size) if index == 0
34
- File.open(UNSPLITTED_FILENAME, 'ab') do |file|
35
- file << zip_file.read
36
- end
37
- end
38
- end
39
-
40
- ::Zip::File.open(UNSPLITTED_FILENAME) do |zf|
41
- zf.extract(ENTRY_TO_EXTRACT, EXTRACTED_FILENAME)
42
-
43
- assert(File.exist?(EXTRACTED_FILENAME))
44
- AssertEntry.assert_contents(EXTRACTED_FILENAME,
45
- zf.get_input_stream(ENTRY_TO_EXTRACT) { |is| is.read })
46
-
47
- File.unlink(EXTRACTED_FILENAME)
48
-
49
- entry = zf.get_entry(ENTRY_TO_EXTRACT)
50
- entry.extract(EXTRACTED_FILENAME)
51
-
52
- assert(File.exist?(EXTRACTED_FILENAME))
53
- AssertEntry.assert_contents(EXTRACTED_FILENAME,
54
- entry.get_input_stream { |is| is.read })
55
- end
56
- end
57
- end
@@ -1,601 +0,0 @@
1
- require 'test_helper'
2
-
3
- class ZipFileTest < MiniTest::Test
4
- include CommonZipFileFixture
5
- include ZipEntryData
6
-
7
- OK_DELETE_FILE = 'test/data/generated/okToDelete.txt'
8
- OK_DELETE_MOVED_FILE = 'test/data/generated/okToDeleteMoved.txt'
9
-
10
- def teardown
11
- ::Zip.write_zip64_support = false
12
- end
13
-
14
- def test_create_from_scratch_to_buffer
15
- comment = 'a short comment'
16
-
17
- buffer = ::Zip::File.add_buffer do |zf|
18
- zf.get_output_stream('myFile') { |os| os.write 'myFile contains just this' }
19
- zf.mkdir('dir1')
20
- zf.comment = comment
21
- end
22
-
23
- ::File.open(EMPTY_FILENAME, 'wb') { |file| file.write buffer.string }
24
-
25
- zfRead = ::Zip::File.new(EMPTY_FILENAME)
26
- assert_equal(comment, zfRead.comment)
27
- assert_equal(2, zfRead.entries.length)
28
- end
29
-
30
- def test_create_from_scratch
31
- comment = 'a short comment'
32
-
33
- zf = ::Zip::File.new(EMPTY_FILENAME, ::Zip::File::CREATE)
34
- zf.get_output_stream('myFile') { |os| os.write 'myFile contains just this' }
35
- zf.mkdir('dir1')
36
- zf.comment = comment
37
- zf.close
38
-
39
- zfRead = ::Zip::File.new(EMPTY_FILENAME)
40
- assert_equal(comment, zfRead.comment)
41
- assert_equal(2, zfRead.entries.length)
42
- end
43
-
44
- def test_create_from_scratch_with_old_create_parameter
45
- comment = 'a short comment'
46
-
47
- zf = ::Zip::File.new(EMPTY_FILENAME, 1)
48
- zf.get_output_stream('myFile') { |os| os.write 'myFile contains just this' }
49
- zf.mkdir('dir1')
50
- zf.comment = comment
51
- zf.close
52
-
53
- zfRead = ::Zip::File.new(EMPTY_FILENAME)
54
- assert_equal(comment, zfRead.comment)
55
- assert_equal(2, zfRead.entries.length)
56
- end
57
-
58
- def test_get_input_stream_stored_with_gpflag_bit3
59
- ::Zip::File.open('test/data/gpbit3stored.zip') do |zf|
60
- assert_equal("foo\n", zf.read("foo.txt"))
61
- end
62
- end
63
-
64
- def test_get_output_stream
65
- entryCount = nil
66
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
67
- entryCount = zf.size
68
- zf.get_output_stream('newEntry.txt') do |os|
69
- os.write 'Putting stuff in newEntry.txt'
70
- end
71
- assert_equal(entryCount + 1, zf.size)
72
- assert_equal('Putting stuff in newEntry.txt', zf.read('newEntry.txt'))
73
-
74
- zf.get_output_stream(zf.get_entry('test/data/generated/empty.txt')) do |os|
75
- os.write 'Putting stuff in data/generated/empty.txt'
76
- end
77
- assert_equal(entryCount + 1, zf.size)
78
- assert_equal('Putting stuff in data/generated/empty.txt', zf.read('test/data/generated/empty.txt'))
79
-
80
- custom_entry_args = [TEST_COMMENT, TEST_EXTRA, TEST_COMPRESSED_SIZE, TEST_CRC, ::Zip::Entry::STORED, TEST_SIZE, TEST_TIME]
81
- zf.get_output_stream('entry_with_custom_args.txt', nil, *custom_entry_args) do |os|
82
- os.write 'Some data'
83
- end
84
- assert_equal(entryCount + 2, zf.size)
85
- entry = zf.get_entry('entry_with_custom_args.txt')
86
- assert_equal(custom_entry_args[0], entry.comment)
87
- assert_equal(custom_entry_args[2], entry.compressed_size)
88
- assert_equal(custom_entry_args[3], entry.crc)
89
- assert_equal(custom_entry_args[4], entry.compression_method)
90
- assert_equal(custom_entry_args[5], entry.size)
91
- assert_equal(custom_entry_args[6], entry.time)
92
-
93
- zf.get_output_stream('entry.bin') do |os|
94
- os.write(::File.open('test/data/generated/5entry.zip', 'rb').read)
95
- end
96
- end
97
-
98
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
99
- assert_equal(entryCount + 3, zf.size)
100
- assert_equal('Putting stuff in newEntry.txt', zf.read('newEntry.txt'))
101
- assert_equal('Putting stuff in data/generated/empty.txt', zf.read('test/data/generated/empty.txt'))
102
- assert_equal(File.open('test/data/generated/5entry.zip', 'rb').read, zf.read('entry.bin'))
103
- end
104
- end
105
-
106
- def test_open_buffer_with_stringio
107
- string_io = StringIO.new File.read('test/data/rubycode.zip')
108
- ::Zip::File.open_buffer string_io do |zf|
109
- assert zf.entries.map { |e| e.name }.include?('zippedruby1.rb')
110
- end
111
- end
112
-
113
- def test_close_buffer_with_stringio
114
- string_io = StringIO.new File.read('test/data/rubycode.zip')
115
- zf = ::Zip::File.open_buffer string_io
116
- assert(zf.close || true) # Poor man's refute_raises
117
- end
118
-
119
- def test_close_buffer_with_io
120
- f = File.open('test/data/rubycode.zip')
121
- zf = ::Zip::File.open_buffer f
122
- assert zf.close
123
- f.close
124
- end
125
-
126
- def test_open_buffer_without_block
127
- string_io = StringIO.new File.read('test/data/rubycode.zip')
128
- zf = ::Zip::File.open_buffer string_io
129
- assert zf.entries.map { |e| e.name }.include?('zippedruby1.rb')
130
- end
131
-
132
- def test_cleans_up_tempfiles_after_close
133
- zf = ::Zip::File.new(EMPTY_FILENAME, ::Zip::File::CREATE)
134
- zf.get_output_stream('myFile') do |os|
135
- @tempfile_path = os.path
136
- os.write 'myFile contains just this'
137
- end
138
-
139
- assert_equal(true, File.exist?(@tempfile_path))
140
-
141
- zf.close
142
-
143
- assert_equal(false, File.exist?(@tempfile_path))
144
- end
145
-
146
- def test_add
147
- srcFile = 'test/data/file2.txt'
148
- entryName = 'newEntryName.rb'
149
- assert(::File.exist?(srcFile))
150
- zf = ::Zip::File.new(EMPTY_FILENAME, ::Zip::File::CREATE)
151
- zf.add(entryName, srcFile)
152
- zf.close
153
-
154
- zfRead = ::Zip::File.new(EMPTY_FILENAME)
155
- assert_equal('', zfRead.comment)
156
- assert_equal(1, zfRead.entries.length)
157
- assert_equal(entryName, zfRead.entries.first.name)
158
- AssertEntry.assert_contents(srcFile,
159
- zfRead.get_input_stream(entryName) { |zis| zis.read })
160
- end
161
-
162
- def test_recover_permissions_after_add_files_to_archive
163
- srcZip = TEST_ZIP.zip_name
164
- ::File.chmod(0o664, srcZip)
165
- srcFile = 'test/data/file2.txt'
166
- entryName = 'newEntryName.rb'
167
- assert_equal(::File.stat(srcZip).mode, 0o100664)
168
- assert(::File.exist?(srcZip))
169
- zf = ::Zip::File.new(srcZip, ::Zip::File::CREATE)
170
- zf.add(entryName, srcFile)
171
- zf.close
172
- assert_equal(::File.stat(srcZip).mode, 0o100664)
173
- end
174
-
175
- def test_add_existing_entry_name
176
- assert_raises(::Zip::EntryExistsError) do
177
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
178
- zf.add(zf.entries.first.name, 'test/data/file2.txt')
179
- end
180
- end
181
- end
182
-
183
- def test_add_existing_entry_name_replace
184
- gotCalled = false
185
- replacedEntry = nil
186
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
187
- replacedEntry = zf.entries.first.name
188
- zf.add(replacedEntry, 'test/data/file2.txt') { gotCalled = true; true }
189
- end
190
- assert(gotCalled)
191
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
192
- assert_contains(zf, replacedEntry, 'test/data/file2.txt')
193
- end
194
- end
195
-
196
- def test_add_directory
197
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
198
- zf.add(TestFiles::EMPTY_TEST_DIR, TestFiles::EMPTY_TEST_DIR)
199
- end
200
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
201
- dirEntry = zf.entries.detect { |e| e.name == TestFiles::EMPTY_TEST_DIR + '/' }
202
- assert(dirEntry.directory?)
203
- end
204
- end
205
-
206
- def test_remove
207
- entryToRemove, *remainingEntries = TEST_ZIP.entry_names
208
-
209
- FileUtils.cp(TestZipFile::TEST_ZIP2.zip_name, TEST_ZIP.zip_name)
210
-
211
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
212
- assert(zf.entries.map { |e| e.name }.include?(entryToRemove))
213
- zf.remove(entryToRemove)
214
- assert(!zf.entries.map { |e| e.name }.include?(entryToRemove))
215
- assert_equal(zf.entries.map { |x| x.name }.sort, remainingEntries.sort)
216
- zf.close
217
-
218
- zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
219
- assert(!zfRead.entries.map { |e| e.name }.include?(entryToRemove))
220
- assert_equal(zfRead.entries.map { |x| x.name }.sort, remainingEntries.sort)
221
- zfRead.close
222
- end
223
-
224
- def test_rename
225
- entryToRename, * = TEST_ZIP.entry_names
226
-
227
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
228
- assert(zf.entries.map { |e| e.name }.include?(entryToRename))
229
-
230
- contents = zf.read(entryToRename)
231
- newName = 'changed entry name'
232
- assert(!zf.entries.map { |e| e.name }.include?(newName))
233
-
234
- zf.rename(entryToRename, newName)
235
- assert(zf.entries.map { |e| e.name }.include?(newName))
236
-
237
- assert_equal(contents, zf.read(newName))
238
-
239
- zf.close
240
-
241
- zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
242
- assert(zfRead.entries.map { |e| e.name }.include?(newName))
243
- assert_equal(contents, zfRead.read(newName))
244
- zfRead.close
245
- end
246
-
247
- def test_rename_with_each
248
- zf_name = 'test_rename_zip.zip'
249
- ::File.unlink(zf_name) if ::File.exist?(zf_name)
250
- arr = []
251
- arr_renamed = []
252
- ::Zip::File.open(zf_name, ::Zip::File::CREATE) do |zf|
253
- zf.mkdir('test')
254
- arr << 'test/'
255
- arr_renamed << 'Ztest/'
256
- %w[a b c d].each do |f|
257
- zf.get_output_stream("test/#{f}") { |file| file.puts 'aaaa' }
258
- arr << "test/#{f}"
259
- arr_renamed << "Ztest/#{f}"
260
- end
261
- end
262
- zf = ::Zip::File.open(zf_name)
263
- assert_equal(zf.entries.map(&:name), arr)
264
- zf.close
265
- Zip::File.open(zf_name, 'wb') do |z|
266
- z.each do |f|
267
- z.rename(f, "Z#{f.name}")
268
- end
269
- end
270
- zf = ::Zip::File.open(zf_name)
271
- assert_equal(zf.entries.map(&:name), arr_renamed)
272
- zf.close
273
- ::File.unlink(zf_name) if ::File.exist?(zf_name)
274
- end
275
-
276
- def test_rename_to_existing_entry
277
- oldEntries = nil
278
- ::Zip::File.open(TEST_ZIP.zip_name) { |zf| oldEntries = zf.entries }
279
-
280
- assert_raises(::Zip::EntryExistsError) do
281
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
282
- zf.rename(zf.entries[0], zf.entries[1].name)
283
- end
284
- end
285
-
286
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
287
- assert_equal(oldEntries.sort.map { |e| e.name }, zf.entries.sort.map { |e| e.name })
288
- end
289
- end
290
-
291
- def test_rename_to_existing_entry_overwrite
292
- oldEntries = nil
293
- ::Zip::File.open(TEST_ZIP.zip_name) { |zf| oldEntries = zf.entries }
294
-
295
- gotCalled = false
296
- renamedEntryName = nil
297
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
298
- renamedEntryName = zf.entries[0].name
299
- zf.rename(zf.entries[0], zf.entries[1].name) { gotCalled = true; true }
300
- end
301
-
302
- assert(gotCalled)
303
- oldEntries.delete_if { |e| e.name == renamedEntryName }
304
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
305
- assert_equal(oldEntries.sort.map { |e| e.name },
306
- zf.entries.sort.map { |e| e.name })
307
- end
308
- end
309
-
310
- def test_rename_non_entry
311
- nonEntry = 'bogusEntry'
312
- target_entry = 'target_entryName'
313
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
314
- assert(!zf.entries.include?(nonEntry))
315
- assert_raises(Errno::ENOENT) { zf.rename(nonEntry, target_entry) }
316
- zf.commit
317
- assert(!zf.entries.include?(target_entry))
318
- ensure
319
- zf.close
320
- end
321
-
322
- def test_rename_entry_to_existing_entry
323
- entry1, entry2, * = TEST_ZIP.entry_names
324
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
325
- assert_raises(::Zip::EntryExistsError) { zf.rename(entry1, entry2) }
326
- ensure
327
- zf.close
328
- end
329
-
330
- def test_replace
331
- entryToReplace = TEST_ZIP.entry_names[2]
332
- newEntrySrcFilename = 'test/data/file2.txt'
333
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
334
- zf.replace(entryToReplace, newEntrySrcFilename)
335
-
336
- zf.close
337
- zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
338
- AssertEntry.assert_contents(newEntrySrcFilename,
339
- zfRead.get_input_stream(entryToReplace) { |is| is.read })
340
- AssertEntry.assert_contents(TEST_ZIP.entry_names[0],
341
- zfRead.get_input_stream(TEST_ZIP.entry_names[0]) { |is| is.read })
342
- AssertEntry.assert_contents(TEST_ZIP.entry_names[1],
343
- zfRead.get_input_stream(TEST_ZIP.entry_names[1]) { |is| is.read })
344
- AssertEntry.assert_contents(TEST_ZIP.entry_names[3],
345
- zfRead.get_input_stream(TEST_ZIP.entry_names[3]) { |is| is.read })
346
- zfRead.close
347
- end
348
-
349
- def test_replace_non_entry
350
- entryToReplace = 'nonExistingEntryname'
351
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
352
- assert_raises(Errno::ENOENT) { zf.replace(entryToReplace, 'test/data/file2.txt') }
353
- end
354
- end
355
-
356
- def test_commit
357
- newName = 'renamedFirst'
358
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
359
- oldName = zf.entries.first
360
- zf.rename(oldName, newName)
361
- zf.commit
362
-
363
- zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
364
- assert(zfRead.entries.detect { |e| e.name == newName } != nil)
365
- assert(zfRead.entries.detect { |e| e.name == oldName }.nil?)
366
- zfRead.close
367
-
368
- zf.close
369
- res = system("unzip -tqq #{TEST_ZIP.zip_name}")
370
- assert_equal(res, true)
371
- end
372
-
373
- def test_double_commit(filename = 'test/data/generated/double_commit_test.zip')
374
- ::FileUtils.touch('test/data/generated/test_double_commit1.txt')
375
- ::FileUtils.touch('test/data/generated/test_double_commit2.txt')
376
- zf = ::Zip::File.open(filename, ::Zip::File::CREATE)
377
- zf.add('test1.txt', 'test/data/generated/test_double_commit1.txt')
378
- zf.commit
379
- zf.add('test2.txt', 'test/data/generated/test_double_commit2.txt')
380
- zf.commit
381
- zf.close
382
- zf2 = ::Zip::File.open(filename)
383
- assert(zf2.entries.detect { |e| e.name == 'test1.txt' } != nil)
384
- assert(zf2.entries.detect { |e| e.name == 'test2.txt' } != nil)
385
- res = system("unzip -tqq #{filename}")
386
- assert_equal(res, true)
387
- end
388
-
389
- def test_double_commit_zip64
390
- ::Zip.write_zip64_support = true
391
- test_double_commit('test/data/generated/double_commit_test64.zip')
392
- end
393
-
394
- def test_write_buffer
395
- newName = 'renamedFirst'
396
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
397
- oldName = zf.entries.first
398
- zf.rename(oldName, newName)
399
- io = ::StringIO.new('')
400
- buffer = zf.write_buffer(io)
401
- File.open(TEST_ZIP.zip_name, 'wb') { |f| f.write buffer.string }
402
- zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
403
- assert(zfRead.entries.detect { |e| e.name == newName } != nil)
404
- assert(zfRead.entries.detect { |e| e.name == oldName }.nil?)
405
- zfRead.close
406
-
407
- zf.close
408
- end
409
-
410
- # This test tests that after commit, you
411
- # can delete the file you used to add the entry to the zip file
412
- # with
413
- def test_commit_use_zip_entry
414
- FileUtils.cp(TestFiles::RANDOM_ASCII_FILE1, OK_DELETE_FILE)
415
- zf = ::Zip::File.open(TEST_ZIP.zip_name)
416
- zf.add('okToDelete.txt', OK_DELETE_FILE)
417
- assert_contains(zf, 'okToDelete.txt')
418
- zf.commit
419
- File.rename(OK_DELETE_FILE, OK_DELETE_MOVED_FILE)
420
- assert_contains(zf, 'okToDelete.txt', OK_DELETE_MOVED_FILE)
421
- end
422
-
423
- # def test_close
424
- # zf = ZipFile.new(TEST_ZIP.zip_name)
425
- # zf.close
426
- # assert_raises(IOError) {
427
- # zf.extract(TEST_ZIP.entry_names.first, "hullubullu")
428
- # }
429
- # end
430
-
431
- def test_compound1
432
- renamedName = 'renamedName'
433
- filename_to_remove = ''
434
- begin
435
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
436
- originalEntries = zf.entries.dup
437
-
438
- assert_not_contains(zf, TestFiles::RANDOM_ASCII_FILE1)
439
- zf.add(TestFiles::RANDOM_ASCII_FILE1,
440
- TestFiles::RANDOM_ASCII_FILE1)
441
- assert_contains(zf, TestFiles::RANDOM_ASCII_FILE1)
442
-
443
- entry_to_rename = zf.entries.find { |entry| entry.name.match('longAscii') }
444
- zf.rename(entry_to_rename, renamedName)
445
- assert_contains(zf, renamedName)
446
-
447
- TestFiles::BINARY_TEST_FILES.each do |filename|
448
- zf.add(filename, filename)
449
- assert_contains(zf, filename)
450
- end
451
-
452
- assert_contains(zf, originalEntries.last.to_s)
453
- filename_to_remove = originalEntries.map(&:to_s).find { |name| name.match('longBinary') }
454
- zf.remove(filename_to_remove)
455
- assert_not_contains(zf, filename_to_remove)
456
- ensure
457
- zf.close
458
- end
459
- begin
460
- zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
461
- assert_contains(zfRead, TestFiles::RANDOM_ASCII_FILE1)
462
- assert_contains(zfRead, renamedName)
463
- TestFiles::BINARY_TEST_FILES.each do |filename|
464
- assert_contains(zfRead, filename)
465
- end
466
- assert_not_contains(zfRead, filename_to_remove)
467
- ensure
468
- zfRead.close
469
- end
470
- end
471
-
472
- def test_compound2
473
- begin
474
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
475
- originalEntries = zf.entries.dup
476
-
477
- originalEntries.each do |entry|
478
- zf.remove(entry)
479
- assert_not_contains(zf, entry)
480
- end
481
- assert(zf.entries.empty?)
482
-
483
- TestFiles::ASCII_TEST_FILES.each do |filename|
484
- zf.add(filename, filename)
485
- assert_contains(zf, filename)
486
- end
487
- assert_equal(zf.entries.sort.map { |e| e.name }, TestFiles::ASCII_TEST_FILES)
488
-
489
- zf.rename(TestFiles::ASCII_TEST_FILES[0], 'newName')
490
- assert_not_contains(zf, TestFiles::ASCII_TEST_FILES[0])
491
- assert_contains(zf, 'newName')
492
- ensure
493
- zf.close
494
- end
495
- begin
496
- zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
497
- asciiTestFiles = TestFiles::ASCII_TEST_FILES.dup
498
- asciiTestFiles.shift
499
- asciiTestFiles.each do |filename|
500
- assert_contains(zf, filename)
501
- end
502
-
503
- assert_contains(zf, 'newName')
504
- ensure
505
- zfRead.close
506
- end
507
- end
508
-
509
- def test_change_comment
510
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
511
- zf.comment = 'my changed comment'
512
- end
513
- zfRead = ::Zip::File.open(TEST_ZIP.zip_name)
514
- assert_equal('my changed comment', zfRead.comment)
515
- end
516
-
517
- def test_preserve_file_order
518
- entryNames = nil
519
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
520
- entryNames = zf.entries.map { |e| e.to_s }
521
- zf.get_output_stream('a.txt') { |os| os.write 'this is a.txt' }
522
- zf.get_output_stream('z.txt') { |os| os.write 'this is z.txt' }
523
- zf.get_output_stream('k.txt') { |os| os.write 'this is k.txt' }
524
- entryNames << 'a.txt' << 'z.txt' << 'k.txt'
525
- end
526
-
527
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
528
- assert_equal(entryNames, zf.entries.map { |e| e.to_s })
529
- entries = zf.entries.sort_by { |e| e.name }.reverse
530
- entries.each do |e|
531
- zf.remove e
532
- zf.get_output_stream(e) { |os| os.write 'foo' }
533
- end
534
- entryNames = entries.map { |e| e.to_s }
535
- end
536
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
537
- assert_equal(entryNames, zf.entries.map { |e| e.to_s })
538
- end
539
- end
540
-
541
- def test_streaming
542
- fname = ::File.join(::File.expand_path(::File.dirname(__FILE__)), '../README.md')
543
- zname = 'test/data/generated/README.zip'
544
- Zip::File.open(zname, Zip::File::CREATE) do |zipfile|
545
- zipfile.get_output_stream(File.basename(fname)) do |f|
546
- f.puts File.read(fname)
547
- end
548
- end
549
-
550
- data = nil
551
- File.open(zname, 'rb') do |f|
552
- Zip::File.open_buffer(f) do |zipfile|
553
- zipfile.each do |entry|
554
- next unless entry.name =~ /README.md/
555
- data = zipfile.read(entry)
556
- end
557
- end
558
- end
559
- assert data
560
- assert data =~ /Simonov/
561
- end
562
-
563
- def test_nonexistant_zip
564
- assert_raises(::Zip::Error) do
565
- ::Zip::File.open('fake.zip')
566
- end
567
- end
568
-
569
- def test_empty_zip
570
- assert_raises(::Zip::Error) do
571
- ::Zip::File.open(TestFiles::NULL_FILE)
572
- end
573
- end
574
-
575
- def test_odd_extra_field
576
- entry_count = 0
577
- File.open 'test/data/oddExtraField.zip', 'rb' do |zip_io|
578
- Zip::File.open_buffer zip_io.read do |zip|
579
- zip.each do |_zip_entry|
580
- entry_count += 1
581
- end
582
- end
583
- end
584
- assert_equal 13, entry_count
585
- end
586
-
587
- def test_open_xls_does_not_raise_type_error
588
- ::Zip::File.open('test/data/test.xls')
589
- end
590
-
591
- private
592
-
593
- def assert_contains(zf, entryName, filename = entryName)
594
- assert(zf.entries.detect { |e| e.name == entryName } != nil, "entry #{entryName} not in #{zf.entries.join(', ')} in zip file #{zf}")
595
- assert_entry_contents(zf, entryName, filename) if File.exist?(filename)
596
- end
597
-
598
- def assert_not_contains(zf, entryName)
599
- assert(zf.entries.detect { |e| e.name == entryName }.nil?, "entry #{entryName} in #{zf.entries.join(', ')} in zip file #{zf}")
600
- end
601
- end