rubyzip 1.2.4 → 2.0.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 (82) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +55 -14
  3. data/lib/zip.rb +3 -1
  4. data/lib/zip/entry.rb +12 -0
  5. data/lib/zip/errors.rb +1 -0
  6. data/lib/zip/file.rb +7 -0
  7. data/lib/zip/version.rb +1 -1
  8. metadata +10 -153
  9. data/test/basic_zip_file_test.rb +0 -60
  10. data/test/case_sensitivity_test.rb +0 -69
  11. data/test/central_directory_entry_test.rb +0 -69
  12. data/test/central_directory_test.rb +0 -100
  13. data/test/crypto/null_encryption_test.rb +0 -57
  14. data/test/crypto/traditional_encryption_test.rb +0 -80
  15. data/test/data/WarnInvalidDate.zip +0 -0
  16. data/test/data/file1.txt +0 -46
  17. data/test/data/file1.txt.deflatedData +0 -0
  18. data/test/data/file2.txt +0 -1504
  19. data/test/data/globTest.zip +0 -0
  20. data/test/data/globTest/foo.txt +0 -0
  21. data/test/data/globTest/foo/bar/baz/foo.txt +0 -0
  22. data/test/data/globTest/food.txt +0 -0
  23. data/test/data/gpbit3stored.zip +0 -0
  24. data/test/data/mimetype +0 -1
  25. data/test/data/notzippedruby.rb +0 -7
  26. data/test/data/ntfs.zip +0 -0
  27. data/test/data/oddExtraField.zip +0 -0
  28. data/test/data/path_traversal/Makefile +0 -10
  29. data/test/data/path_traversal/jwilk/README.md +0 -5
  30. data/test/data/path_traversal/jwilk/absolute1.zip +0 -0
  31. data/test/data/path_traversal/jwilk/absolute2.zip +0 -0
  32. data/test/data/path_traversal/jwilk/dirsymlink.zip +0 -0
  33. data/test/data/path_traversal/jwilk/dirsymlink2a.zip +0 -0
  34. data/test/data/path_traversal/jwilk/dirsymlink2b.zip +0 -0
  35. data/test/data/path_traversal/jwilk/relative0.zip +0 -0
  36. data/test/data/path_traversal/jwilk/relative2.zip +0 -0
  37. data/test/data/path_traversal/jwilk/symlink.zip +0 -0
  38. data/test/data/path_traversal/relative1.zip +0 -0
  39. data/test/data/path_traversal/tilde.zip +0 -0
  40. data/test/data/path_traversal/tuzovakaoff/README.md +0 -3
  41. data/test/data/path_traversal/tuzovakaoff/absolutepath.zip +0 -0
  42. data/test/data/path_traversal/tuzovakaoff/symlink.zip +0 -0
  43. data/test/data/rubycode.zip +0 -0
  44. data/test/data/rubycode2.zip +0 -0
  45. data/test/data/test.xls +0 -0
  46. data/test/data/testDirectory.bin +0 -0
  47. data/test/data/zip64-sample.zip +0 -0
  48. data/test/data/zipWithDirs.zip +0 -0
  49. data/test/data/zipWithEncryption.zip +0 -0
  50. data/test/deflater_test.rb +0 -65
  51. data/test/encryption_test.rb +0 -42
  52. data/test/entry_set_test.rb +0 -163
  53. data/test/entry_test.rb +0 -154
  54. data/test/errors_test.rb +0 -35
  55. data/test/extra_field_test.rb +0 -76
  56. data/test/file_extract_directory_test.rb +0 -54
  57. data/test/file_extract_test.rb +0 -83
  58. data/test/file_permissions_test.rb +0 -65
  59. data/test/file_split_test.rb +0 -57
  60. data/test/file_test.rb +0 -646
  61. data/test/filesystem/dir_iterator_test.rb +0 -58
  62. data/test/filesystem/directory_test.rb +0 -139
  63. data/test/filesystem/file_mutating_test.rb +0 -87
  64. data/test/filesystem/file_nonmutating_test.rb +0 -508
  65. data/test/filesystem/file_stat_test.rb +0 -64
  66. data/test/gentestfiles.rb +0 -126
  67. data/test/inflater_test.rb +0 -14
  68. data/test/input_stream_test.rb +0 -182
  69. data/test/ioextras/abstract_input_stream_test.rb +0 -102
  70. data/test/ioextras/abstract_output_stream_test.rb +0 -106
  71. data/test/ioextras/fake_io_test.rb +0 -18
  72. data/test/local_entry_test.rb +0 -154
  73. data/test/output_stream_test.rb +0 -128
  74. data/test/pass_thru_compressor_test.rb +0 -30
  75. data/test/pass_thru_decompressor_test.rb +0 -14
  76. data/test/path_traversal_test.rb +0 -141
  77. data/test/samples/example_recursive_test.rb +0 -37
  78. data/test/settings_test.rb +0 -95
  79. data/test/test_helper.rb +0 -234
  80. data/test/unicode_file_names_and_comments_test.rb +0 -62
  81. data/test/zip64_full_test.rb +0 -51
  82. 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,646 +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_string
107
- string = File.read('test/data/rubycode.zip')
108
- ::Zip::File.open_buffer string do |zf|
109
- assert zf.entries.map { |e| e.name }.include?('zippedruby1.rb')
110
- end
111
- end
112
-
113
- def test_open_buffer_with_stringio
114
- string_io = StringIO.new File.read('test/data/rubycode.zip')
115
- ::Zip::File.open_buffer string_io do |zf|
116
- assert zf.entries.map { |e| e.name }.include?('zippedruby1.rb')
117
- end
118
- end
119
-
120
- def test_close_buffer_with_stringio
121
- string_io = StringIO.new File.read('test/data/rubycode.zip')
122
- zf = ::Zip::File.open_buffer string_io
123
- assert_nil zf.close
124
- end
125
-
126
- def test_open_buffer_no_op_does_not_change_file
127
- Dir.mktmpdir do |tmp|
128
- test_zip = File.join(tmp, 'test.zip')
129
- FileUtils.cp 'test/data/rubycode.zip', test_zip
130
-
131
- # Note: this may change the file if it is opened with r+b instead of rb.
132
- # The 'extra fields' in this particular zip file get reordered.
133
- File.open(test_zip, 'rb') do |file|
134
- Zip::File.open_buffer(file) do |zf|
135
- nil # do nothing
136
- end
137
- end
138
-
139
- assert_equal \
140
- File.binread('test/data/rubycode.zip'),
141
- File.binread(test_zip)
142
- end
143
- end
144
-
145
- def test_open_buffer_close_does_not_change_file
146
- Dir.mktmpdir do |tmp|
147
- test_zip = File.join(tmp, 'test.zip')
148
- FileUtils.cp 'test/data/rubycode.zip', test_zip
149
-
150
- File.open(test_zip, 'rb') do |file|
151
- zf = Zip::File.open_buffer(file)
152
- refute zf.commit_required?
153
- assert_nil zf.close
154
- end
155
-
156
- assert_equal \
157
- File.binread('test/data/rubycode.zip'),
158
- File.binread(test_zip)
159
- end
160
- end
161
-
162
- def test_open_buffer_with_io_and_block
163
- File.open('test/data/rubycode.zip') do |io|
164
- io.set_encoding(Encoding::BINARY) # not strictly required but can be set
165
- Zip::File.open_buffer(io) do |zip_io|
166
- # left empty on purpose
167
- end
168
- end
169
- end
170
-
171
- def test_open_buffer_without_block
172
- string_io = StringIO.new File.read('test/data/rubycode.zip')
173
- zf = ::Zip::File.open_buffer string_io
174
- assert zf.entries.map { |e| e.name }.include?('zippedruby1.rb')
175
- end
176
-
177
- def test_cleans_up_tempfiles_after_close
178
- zf = ::Zip::File.new(EMPTY_FILENAME, ::Zip::File::CREATE)
179
- zf.get_output_stream('myFile') do |os|
180
- @tempfile_path = os.path
181
- os.write 'myFile contains just this'
182
- end
183
-
184
- assert_equal(true, File.exist?(@tempfile_path))
185
-
186
- zf.close
187
-
188
- assert_equal(false, File.exist?(@tempfile_path))
189
- end
190
-
191
- def test_add
192
- srcFile = 'test/data/file2.txt'
193
- entryName = 'newEntryName.rb'
194
- assert(::File.exist?(srcFile))
195
- zf = ::Zip::File.new(EMPTY_FILENAME, ::Zip::File::CREATE)
196
- zf.add(entryName, srcFile)
197
- zf.close
198
-
199
- zfRead = ::Zip::File.new(EMPTY_FILENAME)
200
- assert_equal('', zfRead.comment)
201
- assert_equal(1, zfRead.entries.length)
202
- assert_equal(entryName, zfRead.entries.first.name)
203
- AssertEntry.assert_contents(srcFile,
204
- zfRead.get_input_stream(entryName) { |zis| zis.read })
205
- end
206
-
207
- def test_recover_permissions_after_add_files_to_archive
208
- srcZip = TEST_ZIP.zip_name
209
- ::File.chmod(0o664, srcZip)
210
- srcFile = 'test/data/file2.txt'
211
- entryName = 'newEntryName.rb'
212
- assert_equal(::File.stat(srcZip).mode, 0o100664)
213
- assert(::File.exist?(srcZip))
214
- zf = ::Zip::File.new(srcZip, ::Zip::File::CREATE)
215
- zf.add(entryName, srcFile)
216
- zf.close
217
- assert_equal(::File.stat(srcZip).mode, 0o100664)
218
- end
219
-
220
- def test_add_existing_entry_name
221
- assert_raises(::Zip::EntryExistsError) do
222
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
223
- zf.add(zf.entries.first.name, 'test/data/file2.txt')
224
- end
225
- end
226
- end
227
-
228
- def test_add_existing_entry_name_replace
229
- gotCalled = false
230
- replacedEntry = nil
231
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
232
- replacedEntry = zf.entries.first.name
233
- zf.add(replacedEntry, 'test/data/file2.txt') { gotCalled = true; true }
234
- end
235
- assert(gotCalled)
236
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
237
- assert_contains(zf, replacedEntry, 'test/data/file2.txt')
238
- end
239
- end
240
-
241
- def test_add_directory
242
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
243
- zf.add(TestFiles::EMPTY_TEST_DIR, TestFiles::EMPTY_TEST_DIR)
244
- end
245
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
246
- dirEntry = zf.entries.detect { |e| e.name == TestFiles::EMPTY_TEST_DIR + '/' }
247
- assert(dirEntry.directory?)
248
- end
249
- end
250
-
251
- def test_remove
252
- entryToRemove, *remainingEntries = TEST_ZIP.entry_names
253
-
254
- FileUtils.cp(TestZipFile::TEST_ZIP2.zip_name, TEST_ZIP.zip_name)
255
-
256
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
257
- assert(zf.entries.map { |e| e.name }.include?(entryToRemove))
258
- zf.remove(entryToRemove)
259
- assert(!zf.entries.map { |e| e.name }.include?(entryToRemove))
260
- assert_equal(zf.entries.map { |x| x.name }.sort, remainingEntries.sort)
261
- zf.close
262
-
263
- zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
264
- assert(!zfRead.entries.map { |e| e.name }.include?(entryToRemove))
265
- assert_equal(zfRead.entries.map { |x| x.name }.sort, remainingEntries.sort)
266
- zfRead.close
267
- end
268
-
269
- def test_rename
270
- entryToRename, * = TEST_ZIP.entry_names
271
-
272
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
273
- assert(zf.entries.map { |e| e.name }.include?(entryToRename))
274
-
275
- contents = zf.read(entryToRename)
276
- newName = 'changed entry name'
277
- assert(!zf.entries.map { |e| e.name }.include?(newName))
278
-
279
- zf.rename(entryToRename, newName)
280
- assert(zf.entries.map { |e| e.name }.include?(newName))
281
-
282
- assert_equal(contents, zf.read(newName))
283
-
284
- zf.close
285
-
286
- zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
287
- assert(zfRead.entries.map { |e| e.name }.include?(newName))
288
- assert_equal(contents, zfRead.read(newName))
289
- zfRead.close
290
- end
291
-
292
- def test_rename_with_each
293
- zf_name = 'test_rename_zip.zip'
294
- ::File.unlink(zf_name) if ::File.exist?(zf_name)
295
- arr = []
296
- arr_renamed = []
297
- ::Zip::File.open(zf_name, ::Zip::File::CREATE) do |zf|
298
- zf.mkdir('test')
299
- arr << 'test/'
300
- arr_renamed << 'Ztest/'
301
- %w[a b c d].each do |f|
302
- zf.get_output_stream("test/#{f}") { |file| file.puts 'aaaa' }
303
- arr << "test/#{f}"
304
- arr_renamed << "Ztest/#{f}"
305
- end
306
- end
307
- zf = ::Zip::File.open(zf_name)
308
- assert_equal(zf.entries.map(&:name), arr)
309
- zf.close
310
- Zip::File.open(zf_name, 'wb') do |z|
311
- z.each do |f|
312
- z.rename(f, "Z#{f.name}")
313
- end
314
- end
315
- zf = ::Zip::File.open(zf_name)
316
- assert_equal(zf.entries.map(&:name), arr_renamed)
317
- zf.close
318
- ::File.unlink(zf_name) if ::File.exist?(zf_name)
319
- end
320
-
321
- def test_rename_to_existing_entry
322
- oldEntries = nil
323
- ::Zip::File.open(TEST_ZIP.zip_name) { |zf| oldEntries = zf.entries }
324
-
325
- assert_raises(::Zip::EntryExistsError) do
326
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
327
- zf.rename(zf.entries[0], zf.entries[1].name)
328
- end
329
- end
330
-
331
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
332
- assert_equal(oldEntries.sort.map { |e| e.name }, zf.entries.sort.map { |e| e.name })
333
- end
334
- end
335
-
336
- def test_rename_to_existing_entry_overwrite
337
- oldEntries = nil
338
- ::Zip::File.open(TEST_ZIP.zip_name) { |zf| oldEntries = zf.entries }
339
-
340
- gotCalled = false
341
- renamedEntryName = nil
342
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
343
- renamedEntryName = zf.entries[0].name
344
- zf.rename(zf.entries[0], zf.entries[1].name) { gotCalled = true; true }
345
- end
346
-
347
- assert(gotCalled)
348
- oldEntries.delete_if { |e| e.name == renamedEntryName }
349
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
350
- assert_equal(oldEntries.sort.map { |e| e.name },
351
- zf.entries.sort.map { |e| e.name })
352
- end
353
- end
354
-
355
- def test_rename_non_entry
356
- nonEntry = 'bogusEntry'
357
- target_entry = 'target_entryName'
358
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
359
- assert(!zf.entries.include?(nonEntry))
360
- assert_raises(Errno::ENOENT) { zf.rename(nonEntry, target_entry) }
361
- zf.commit
362
- assert(!zf.entries.include?(target_entry))
363
- ensure
364
- zf.close
365
- end
366
-
367
- def test_rename_entry_to_existing_entry
368
- entry1, entry2, * = TEST_ZIP.entry_names
369
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
370
- assert_raises(::Zip::EntryExistsError) { zf.rename(entry1, entry2) }
371
- ensure
372
- zf.close
373
- end
374
-
375
- def test_replace
376
- entryToReplace = TEST_ZIP.entry_names[2]
377
- newEntrySrcFilename = 'test/data/file2.txt'
378
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
379
- zf.replace(entryToReplace, newEntrySrcFilename)
380
-
381
- zf.close
382
- zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
383
- AssertEntry.assert_contents(newEntrySrcFilename,
384
- zfRead.get_input_stream(entryToReplace) { |is| is.read })
385
- AssertEntry.assert_contents(TEST_ZIP.entry_names[0],
386
- zfRead.get_input_stream(TEST_ZIP.entry_names[0]) { |is| is.read })
387
- AssertEntry.assert_contents(TEST_ZIP.entry_names[1],
388
- zfRead.get_input_stream(TEST_ZIP.entry_names[1]) { |is| is.read })
389
- AssertEntry.assert_contents(TEST_ZIP.entry_names[3],
390
- zfRead.get_input_stream(TEST_ZIP.entry_names[3]) { |is| is.read })
391
- zfRead.close
392
- end
393
-
394
- def test_replace_non_entry
395
- entryToReplace = 'nonExistingEntryname'
396
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
397
- assert_raises(Errno::ENOENT) { zf.replace(entryToReplace, 'test/data/file2.txt') }
398
- end
399
- end
400
-
401
- def test_commit
402
- newName = 'renamedFirst'
403
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
404
- oldName = zf.entries.first
405
- zf.rename(oldName, newName)
406
- zf.commit
407
-
408
- zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
409
- assert(zfRead.entries.detect { |e| e.name == newName } != nil)
410
- assert(zfRead.entries.detect { |e| e.name == oldName }.nil?)
411
- zfRead.close
412
-
413
- zf.close
414
- res = system("unzip -tqq #{TEST_ZIP.zip_name}")
415
- assert_equal(res, true)
416
- end
417
-
418
- def test_double_commit(filename = 'test/data/generated/double_commit_test.zip')
419
- ::FileUtils.touch('test/data/generated/test_double_commit1.txt')
420
- ::FileUtils.touch('test/data/generated/test_double_commit2.txt')
421
- zf = ::Zip::File.open(filename, ::Zip::File::CREATE)
422
- zf.add('test1.txt', 'test/data/generated/test_double_commit1.txt')
423
- zf.commit
424
- zf.add('test2.txt', 'test/data/generated/test_double_commit2.txt')
425
- zf.commit
426
- zf.close
427
- zf2 = ::Zip::File.open(filename)
428
- assert(zf2.entries.detect { |e| e.name == 'test1.txt' } != nil)
429
- assert(zf2.entries.detect { |e| e.name == 'test2.txt' } != nil)
430
- res = system("unzip -tqq #{filename}")
431
- assert_equal(res, true)
432
- end
433
-
434
- def test_double_commit_zip64
435
- ::Zip.write_zip64_support = true
436
- test_double_commit('test/data/generated/double_commit_test64.zip')
437
- end
438
-
439
- def test_write_buffer
440
- newName = 'renamedFirst'
441
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
442
- oldName = zf.entries.first
443
- zf.rename(oldName, newName)
444
- io = ::StringIO.new('')
445
- buffer = zf.write_buffer(io)
446
- File.open(TEST_ZIP.zip_name, 'wb') { |f| f.write buffer.string }
447
- zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
448
- assert(zfRead.entries.detect { |e| e.name == newName } != nil)
449
- assert(zfRead.entries.detect { |e| e.name == oldName }.nil?)
450
- zfRead.close
451
-
452
- zf.close
453
- end
454
-
455
- # This test tests that after commit, you
456
- # can delete the file you used to add the entry to the zip file
457
- # with
458
- def test_commit_use_zip_entry
459
- FileUtils.cp(TestFiles::RANDOM_ASCII_FILE1, OK_DELETE_FILE)
460
- zf = ::Zip::File.open(TEST_ZIP.zip_name)
461
- zf.add('okToDelete.txt', OK_DELETE_FILE)
462
- assert_contains(zf, 'okToDelete.txt')
463
- zf.commit
464
- File.rename(OK_DELETE_FILE, OK_DELETE_MOVED_FILE)
465
- assert_contains(zf, 'okToDelete.txt', OK_DELETE_MOVED_FILE)
466
- end
467
-
468
- # def test_close
469
- # zf = ZipFile.new(TEST_ZIP.zip_name)
470
- # zf.close
471
- # assert_raises(IOError) {
472
- # zf.extract(TEST_ZIP.entry_names.first, "hullubullu")
473
- # }
474
- # end
475
-
476
- def test_compound1
477
- renamedName = 'renamedName'
478
- filename_to_remove = ''
479
- begin
480
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
481
- originalEntries = zf.entries.dup
482
-
483
- assert_not_contains(zf, TestFiles::RANDOM_ASCII_FILE1)
484
- zf.add(TestFiles::RANDOM_ASCII_FILE1,
485
- TestFiles::RANDOM_ASCII_FILE1)
486
- assert_contains(zf, TestFiles::RANDOM_ASCII_FILE1)
487
-
488
- entry_to_rename = zf.entries.find { |entry| entry.name.match('longAscii') }
489
- zf.rename(entry_to_rename, renamedName)
490
- assert_contains(zf, renamedName)
491
-
492
- TestFiles::BINARY_TEST_FILES.each do |filename|
493
- zf.add(filename, filename)
494
- assert_contains(zf, filename)
495
- end
496
-
497
- assert_contains(zf, originalEntries.last.to_s)
498
- filename_to_remove = originalEntries.map(&:to_s).find { |name| name.match('longBinary') }
499
- zf.remove(filename_to_remove)
500
- assert_not_contains(zf, filename_to_remove)
501
- ensure
502
- zf.close
503
- end
504
- begin
505
- zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
506
- assert_contains(zfRead, TestFiles::RANDOM_ASCII_FILE1)
507
- assert_contains(zfRead, renamedName)
508
- TestFiles::BINARY_TEST_FILES.each do |filename|
509
- assert_contains(zfRead, filename)
510
- end
511
- assert_not_contains(zfRead, filename_to_remove)
512
- ensure
513
- zfRead.close
514
- end
515
- end
516
-
517
- def test_compound2
518
- begin
519
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
520
- originalEntries = zf.entries.dup
521
-
522
- originalEntries.each do |entry|
523
- zf.remove(entry)
524
- assert_not_contains(zf, entry)
525
- end
526
- assert(zf.entries.empty?)
527
-
528
- TestFiles::ASCII_TEST_FILES.each do |filename|
529
- zf.add(filename, filename)
530
- assert_contains(zf, filename)
531
- end
532
- assert_equal(zf.entries.sort.map { |e| e.name }, TestFiles::ASCII_TEST_FILES)
533
-
534
- zf.rename(TestFiles::ASCII_TEST_FILES[0], 'newName')
535
- assert_not_contains(zf, TestFiles::ASCII_TEST_FILES[0])
536
- assert_contains(zf, 'newName')
537
- ensure
538
- zf.close
539
- end
540
- begin
541
- zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
542
- asciiTestFiles = TestFiles::ASCII_TEST_FILES.dup
543
- asciiTestFiles.shift
544
- asciiTestFiles.each do |filename|
545
- assert_contains(zf, filename)
546
- end
547
-
548
- assert_contains(zf, 'newName')
549
- ensure
550
- zfRead.close
551
- end
552
- end
553
-
554
- def test_change_comment
555
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
556
- zf.comment = 'my changed comment'
557
- end
558
- zfRead = ::Zip::File.open(TEST_ZIP.zip_name)
559
- assert_equal('my changed comment', zfRead.comment)
560
- end
561
-
562
- def test_preserve_file_order
563
- entryNames = nil
564
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
565
- entryNames = zf.entries.map { |e| e.to_s }
566
- zf.get_output_stream('a.txt') { |os| os.write 'this is a.txt' }
567
- zf.get_output_stream('z.txt') { |os| os.write 'this is z.txt' }
568
- zf.get_output_stream('k.txt') { |os| os.write 'this is k.txt' }
569
- entryNames << 'a.txt' << 'z.txt' << 'k.txt'
570
- end
571
-
572
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
573
- assert_equal(entryNames, zf.entries.map { |e| e.to_s })
574
- entries = zf.entries.sort_by { |e| e.name }.reverse
575
- entries.each do |e|
576
- zf.remove e
577
- zf.get_output_stream(e) { |os| os.write 'foo' }
578
- end
579
- entryNames = entries.map { |e| e.to_s }
580
- end
581
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
582
- assert_equal(entryNames, zf.entries.map { |e| e.to_s })
583
- end
584
- end
585
-
586
- def test_streaming
587
- fname = ::File.join(::File.expand_path(::File.dirname(__FILE__)), '../README.md')
588
- zname = 'test/data/generated/README.zip'
589
- Zip::File.open(zname, Zip::File::CREATE) do |zipfile|
590
- zipfile.get_output_stream(File.basename(fname)) do |f|
591
- f.puts File.read(fname)
592
- end
593
- end
594
-
595
- data = nil
596
- File.open(zname, 'rb') do |f|
597
- Zip::File.open_buffer(f) do |zipfile|
598
- zipfile.each do |entry|
599
- next unless entry.name =~ /README.md/
600
- data = zipfile.read(entry)
601
- end
602
- end
603
- end
604
- assert data
605
- assert data =~ /Simonov/
606
- end
607
-
608
- def test_nonexistant_zip
609
- assert_raises(::Zip::Error) do
610
- ::Zip::File.open('fake.zip')
611
- end
612
- end
613
-
614
- def test_empty_zip
615
- assert_raises(::Zip::Error) do
616
- ::Zip::File.open(TestFiles::NULL_FILE)
617
- end
618
- end
619
-
620
- def test_odd_extra_field
621
- entry_count = 0
622
- File.open 'test/data/oddExtraField.zip', 'rb' do |zip_io|
623
- Zip::File.open_buffer zip_io.read do |zip|
624
- zip.each do |_zip_entry|
625
- entry_count += 1
626
- end
627
- end
628
- end
629
- assert_equal 13, entry_count
630
- end
631
-
632
- def test_open_xls_does_not_raise_type_error
633
- ::Zip::File.open('test/data/test.xls')
634
- end
635
-
636
- private
637
-
638
- def assert_contains(zf, entryName, filename = entryName)
639
- assert(zf.entries.detect { |e| e.name == entryName } != nil, "entry #{entryName} not in #{zf.entries.join(', ')} in zip file #{zf}")
640
- assert_entry_contents(zf, entryName, filename) if File.exist?(filename)
641
- end
642
-
643
- def assert_not_contains(zf, entryName)
644
- assert(zf.entries.detect { |e| e.name == entryName }.nil?, "entry #{entryName} in #{zf.entries.join(', ')} in zip file #{zf}")
645
- end
646
- end