rubyzip 1.1.7 → 2.3.2

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 (101) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +137 -54
  3. data/Rakefile +6 -4
  4. data/lib/zip/central_directory.rb +17 -13
  5. data/lib/zip/compressor.rb +1 -2
  6. data/lib/zip/constants.rb +57 -5
  7. data/lib/zip/crypto/decrypted_io.rb +40 -0
  8. data/lib/zip/crypto/null_encryption.rb +4 -6
  9. data/lib/zip/crypto/traditional_encryption.rb +14 -14
  10. data/lib/zip/decompressor.rb +22 -4
  11. data/lib/zip/deflater.rb +8 -6
  12. data/lib/zip/dos_time.rb +17 -13
  13. data/lib/zip/entry.rb +171 -148
  14. data/lib/zip/entry_set.rb +16 -14
  15. data/lib/zip/errors.rb +3 -0
  16. data/lib/zip/extra_field/generic.rb +14 -13
  17. data/lib/zip/extra_field/ntfs.rb +18 -16
  18. data/lib/zip/extra_field/old_unix.rb +12 -11
  19. data/lib/zip/extra_field/universal_time.rb +46 -16
  20. data/lib/zip/extra_field/unix.rb +10 -9
  21. data/lib/zip/extra_field/zip64.rb +15 -12
  22. data/lib/zip/extra_field/zip64_placeholder.rb +1 -2
  23. data/lib/zip/extra_field.rb +18 -16
  24. data/lib/zip/file.rb +147 -115
  25. data/lib/zip/filesystem.rb +289 -272
  26. data/lib/zip/inflater.rb +24 -36
  27. data/lib/zip/input_stream.rb +44 -28
  28. data/lib/zip/ioextras/abstract_input_stream.rb +24 -17
  29. data/lib/zip/ioextras/abstract_output_stream.rb +4 -6
  30. data/lib/zip/ioextras.rb +2 -4
  31. data/lib/zip/null_compressor.rb +2 -2
  32. data/lib/zip/null_decompressor.rb +3 -11
  33. data/lib/zip/null_input_stream.rb +0 -0
  34. data/lib/zip/output_stream.rb +25 -17
  35. data/lib/zip/pass_thru_compressor.rb +6 -6
  36. data/lib/zip/pass_thru_decompressor.rb +14 -24
  37. data/lib/zip/streamable_directory.rb +3 -3
  38. data/lib/zip/streamable_stream.rb +7 -11
  39. data/lib/zip/version.rb +1 -1
  40. data/lib/zip.rb +15 -6
  41. data/samples/example.rb +29 -39
  42. data/samples/example_filesystem.rb +16 -18
  43. data/samples/example_recursive.rb +31 -25
  44. data/samples/gtk_ruby_zip.rb +84 -0
  45. data/samples/qtzip.rb +23 -32
  46. data/samples/write_simple.rb +10 -13
  47. data/samples/zipfind.rb +33 -40
  48. metadata +50 -141
  49. data/samples/gtkRubyzip.rb +0 -86
  50. data/test/basic_zip_file_test.rb +0 -64
  51. data/test/central_directory_entry_test.rb +0 -73
  52. data/test/central_directory_test.rb +0 -104
  53. data/test/crypto/null_encryption_test.rb +0 -53
  54. data/test/crypto/traditional_encryption_test.rb +0 -80
  55. data/test/data/WarnInvalidDate.zip +0 -0
  56. data/test/data/file1.txt +0 -46
  57. data/test/data/file1.txt.deflatedData +0 -0
  58. data/test/data/file2.txt +0 -1504
  59. data/test/data/globTest/foo/bar/baz/foo.txt +0 -0
  60. data/test/data/globTest/foo.txt +0 -0
  61. data/test/data/globTest/food.txt +0 -0
  62. data/test/data/globTest.zip +0 -0
  63. data/test/data/mimetype +0 -1
  64. data/test/data/notzippedruby.rb +0 -7
  65. data/test/data/ntfs.zip +0 -0
  66. data/test/data/rubycode.zip +0 -0
  67. data/test/data/rubycode2.zip +0 -0
  68. data/test/data/testDirectory.bin +0 -0
  69. data/test/data/zip64-sample.zip +0 -0
  70. data/test/data/zipWithDirs.zip +0 -0
  71. data/test/data/zipWithEncryption.zip +0 -0
  72. data/test/deflater_test.rb +0 -67
  73. data/test/encryption_test.rb +0 -42
  74. data/test/entry_set_test.rb +0 -138
  75. data/test/entry_test.rb +0 -165
  76. data/test/errors_test.rb +0 -36
  77. data/test/extra_field_test.rb +0 -78
  78. data/test/file_extract_directory_test.rb +0 -56
  79. data/test/file_extract_test.rb +0 -90
  80. data/test/file_split_test.rb +0 -60
  81. data/test/file_test.rb +0 -559
  82. data/test/filesystem/dir_iterator_test.rb +0 -62
  83. data/test/filesystem/directory_test.rb +0 -131
  84. data/test/filesystem/file_mutating_test.rb +0 -100
  85. data/test/filesystem/file_nonmutating_test.rb +0 -514
  86. data/test/filesystem/file_stat_test.rb +0 -66
  87. data/test/gentestfiles.rb +0 -134
  88. data/test/inflater_test.rb +0 -14
  89. data/test/input_stream_test.rb +0 -170
  90. data/test/ioextras/abstract_input_stream_test.rb +0 -103
  91. data/test/ioextras/abstract_output_stream_test.rb +0 -106
  92. data/test/ioextras/fake_io_test.rb +0 -18
  93. data/test/local_entry_test.rb +0 -156
  94. data/test/output_stream_test.rb +0 -129
  95. data/test/pass_thru_compressor_test.rb +0 -31
  96. data/test/pass_thru_decompressor_test.rb +0 -15
  97. data/test/settings_test.rb +0 -92
  98. data/test/test_helper.rb +0 -228
  99. data/test/unicode_file_names_and_comments_test.rb +0 -52
  100. data/test/zip64_full_test.rb +0 -53
  101. data/test/zip64_support_test.rb +0 -15
@@ -1,90 +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) {
15
- |zf|
16
- zf.extract(ENTRY_TO_EXTRACT, EXTRACTED_FILENAME)
17
-
18
- assert(File.exist?(EXTRACTED_FILENAME))
19
- AssertEntry::assert_contents(EXTRACTED_FILENAME,
20
- zf.get_input_stream(ENTRY_TO_EXTRACT) { |is| is.read })
21
-
22
-
23
- ::File.unlink(EXTRACTED_FILENAME)
24
-
25
- entry = zf.get_entry(ENTRY_TO_EXTRACT)
26
- entry.extract(EXTRACTED_FILENAME)
27
-
28
- assert(File.exist?(EXTRACTED_FILENAME))
29
- AssertEntry::assert_contents(EXTRACTED_FILENAME,
30
- entry.get_input_stream() { |is| is.read })
31
-
32
- }
33
- end
34
-
35
- def test_extractExists
36
- writtenText = "written text"
37
- ::File.open(EXTRACTED_FILENAME, "w") { |f| f.write(writtenText) }
38
-
39
- assert_raises(::Zip::DestinationFileExistsError) {
40
- ::Zip::File.open(TEST_ZIP.zip_name) { |zf|
41
- zf.extract(zf.entries.first, EXTRACTED_FILENAME)
42
- }
43
- }
44
- File.open(EXTRACTED_FILENAME, "r") { |f|
45
- assert_equal(writtenText, f.read)
46
- }
47
- end
48
-
49
- def test_extractExistsOverwrite
50
- writtenText = "written text"
51
- ::File.open(EXTRACTED_FILENAME, "w") { |f| f.write(writtenText) }
52
-
53
- gotCalledCorrectly = false
54
- ::Zip::File.open(TEST_ZIP.zip_name) {
55
- |zf|
56
- zf.extract(zf.entries.first, EXTRACTED_FILENAME) {
57
- |entry, extractLoc|
58
- gotCalledCorrectly = zf.entries.first == entry &&
59
- extractLoc == EXTRACTED_FILENAME
60
- true
61
- }
62
- }
63
-
64
- assert(gotCalledCorrectly)
65
- ::File.open(EXTRACTED_FILENAME, "r") {
66
- |f|
67
- assert(writtenText != f.read)
68
- }
69
- end
70
-
71
- def test_extractNonEntry
72
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
73
- assert_raises(Errno::ENOENT) { zf.extract("nonExistingEntry", "nonExistingEntry") }
74
- ensure
75
- zf.close if zf
76
- end
77
-
78
- def test_extractNonEntry2
79
- outFile = "outfile"
80
- assert_raises(Errno::ENOENT) {
81
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
82
- nonEntry = "hotdog-diddelidoo"
83
- assert(!zf.entries.include?(nonEntry))
84
- zf.extract(nonEntry, outFile)
85
- zf.close
86
- }
87
- assert(!File.exist?(outFile))
88
- end
89
-
90
- end
@@ -1,60 +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, 65536, false)
29
-
30
- unless 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
-
48
- File.unlink(EXTRACTED_FILENAME)
49
-
50
- entry = zf.get_entry(ENTRY_TO_EXTRACT)
51
- entry.extract(EXTRACTED_FILENAME)
52
-
53
- assert(File.exist?(EXTRACTED_FILENAME))
54
- AssertEntry::assert_contents(EXTRACTED_FILENAME,
55
- entry.get_input_stream() { |is| is.read })
56
-
57
- end
58
- end
59
- end
60
- end
data/test/file_test.rb DELETED
@@ -1,559 +0,0 @@
1
- require 'test_helper'
2
-
3
-
4
- class ZipFileTest < MiniTest::Test
5
- include CommonZipFileFixture
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_createFromScratchToBuffer
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_createFromScratch
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_get_output_stream
45
- entryCount = nil
46
- ::Zip::File.open(TEST_ZIP.zip_name) {
47
- |zf|
48
- entryCount = zf.size
49
- zf.get_output_stream('newEntry.txt') {
50
- |os|
51
- os.write "Putting stuff in newEntry.txt"
52
- }
53
- assert_equal(entryCount+1, zf.size)
54
- assert_equal("Putting stuff in newEntry.txt", zf.read("newEntry.txt"))
55
-
56
- zf.get_output_stream(zf.get_entry('test/data/generated/empty.txt')) {
57
- |os|
58
- os.write "Putting stuff in data/generated/empty.txt"
59
- }
60
- assert_equal(entryCount+1, zf.size)
61
- assert_equal("Putting stuff in data/generated/empty.txt", zf.read("test/data/generated/empty.txt"))
62
-
63
- custom_entry_args = [ZipEntryTest::TEST_COMMENT, ZipEntryTest::TEST_EXTRA, ZipEntryTest::TEST_COMPRESSED_SIZE, ZipEntryTest::TEST_CRC, ::Zip::Entry::STORED, ZipEntryTest::TEST_SIZE, ZipEntryTest::TEST_TIME]
64
- zf.get_output_stream('entry_with_custom_args.txt', nil, *custom_entry_args) {
65
- |os|
66
- os.write "Some data"
67
- }
68
- assert_equal(entryCount+2, zf.size)
69
- entry = zf.get_entry('entry_with_custom_args.txt')
70
- assert_equal(custom_entry_args[0], entry.comment)
71
- assert_equal(custom_entry_args[2], entry.compressed_size)
72
- assert_equal(custom_entry_args[3], entry.crc)
73
- assert_equal(custom_entry_args[4], entry.compression_method)
74
- assert_equal(custom_entry_args[5], entry.size)
75
- assert_equal(custom_entry_args[6], entry.time)
76
-
77
- zf.get_output_stream('entry.bin') {
78
- |os|
79
- os.write(::File.open('test/data/generated/5entry.zip', 'rb').read)
80
- }
81
- }
82
-
83
- ::Zip::File.open(TEST_ZIP.zip_name) {
84
- |zf|
85
- assert_equal(entryCount+3, zf.size)
86
- assert_equal("Putting stuff in newEntry.txt", zf.read("newEntry.txt"))
87
- assert_equal("Putting stuff in data/generated/empty.txt", zf.read("test/data/generated/empty.txt"))
88
- assert_equal(File.open('test/data/generated/5entry.zip', 'rb').read, zf.read("entry.bin"))
89
- }
90
- end
91
-
92
- def test_cleans_up_tempfiles_after_close
93
- zf = ::Zip::File.new(EMPTY_FILENAME, ::Zip::File::CREATE)
94
- zf.get_output_stream("myFile") do |os|
95
- @tempfile_path = os.path
96
- os.write "myFile contains just this"
97
- end
98
-
99
- assert_equal(true, File.exist?(@tempfile_path))
100
-
101
- zf.close
102
-
103
- assert_equal(false, File.exist?(@tempfile_path))
104
- end
105
-
106
- def test_add
107
- srcFile = "test/data/file2.txt"
108
- entryName = "newEntryName.rb"
109
- assert(::File.exist?(srcFile))
110
- zf = ::Zip::File.new(EMPTY_FILENAME, ::Zip::File::CREATE)
111
- zf.add(entryName, srcFile)
112
- zf.close
113
-
114
- zfRead = ::Zip::File.new(EMPTY_FILENAME)
115
- assert_equal("", zfRead.comment)
116
- assert_equal(1, zfRead.entries.length)
117
- assert_equal(entryName, zfRead.entries.first.name)
118
- AssertEntry.assert_contents(srcFile,
119
- zfRead.get_input_stream(entryName) { |zis| zis.read })
120
- end
121
-
122
- def test_recover_permissions_after_add_files_to_archive
123
- srcZip = TEST_ZIP.zip_name
124
- ::File.chmod(0664, srcZip)
125
- srcFile = "test/data/file2.txt"
126
- entryName = "newEntryName.rb"
127
- assert_equal(::File.stat(srcZip).mode, 0100664)
128
- assert(::File.exist?(srcZip))
129
- zf = ::Zip::File.new(srcZip, ::Zip::File::CREATE)
130
- zf.add(entryName, srcFile)
131
- zf.close
132
- assert_equal(::File.stat(srcZip).mode, 0100664)
133
- end
134
-
135
- def test_addExistingEntryName
136
- assert_raises(::Zip::EntryExistsError) {
137
- ::Zip::File.open(TEST_ZIP.zip_name) {
138
- |zf|
139
- zf.add(zf.entries.first.name, "test/data/file2.txt")
140
- }
141
- }
142
- end
143
-
144
- def test_addExistingEntryNameReplace
145
- gotCalled = false
146
- replacedEntry = nil
147
- ::Zip::File.open(TEST_ZIP.zip_name) {
148
- |zf|
149
- replacedEntry = zf.entries.first.name
150
- zf.add(replacedEntry, "test/data/file2.txt") { gotCalled = true; true }
151
- }
152
- assert(gotCalled)
153
- ::Zip::File.open(TEST_ZIP.zip_name) {
154
- |zf|
155
- assert_contains(zf, replacedEntry, "test/data/file2.txt")
156
- }
157
- end
158
-
159
- def test_addDirectory
160
- ::Zip::File.open(TEST_ZIP.zip_name) {
161
- |zf|
162
- zf.add(TestFiles::EMPTY_TEST_DIR, TestFiles::EMPTY_TEST_DIR)
163
- }
164
- ::Zip::File.open(TEST_ZIP.zip_name) {
165
- |zf|
166
- dirEntry = zf.entries.detect { |e| e.name == TestFiles::EMPTY_TEST_DIR+"/" }
167
- assert(dirEntry.directory?)
168
- }
169
- end
170
-
171
- def test_remove
172
- entryToRemove, *remainingEntries = TEST_ZIP.entry_names
173
-
174
- FileUtils.cp(TestZipFile::TEST_ZIP2.zip_name, TEST_ZIP.zip_name)
175
-
176
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
177
- assert(zf.entries.map { |e| e.name }.include?(entryToRemove))
178
- zf.remove(entryToRemove)
179
- assert(!zf.entries.map { |e| e.name }.include?(entryToRemove))
180
- assert_equal(zf.entries.map { |x| x.name }.sort, remainingEntries.sort)
181
- zf.close
182
-
183
- zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
184
- assert(!zfRead.entries.map { |e| e.name }.include?(entryToRemove))
185
- assert_equal(zfRead.entries.map { |x| x.name }.sort, remainingEntries.sort)
186
- zfRead.close
187
- end
188
-
189
- def test_rename
190
- entryToRename, * = TEST_ZIP.entry_names
191
-
192
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
193
- assert(zf.entries.map { |e| e.name }.include?(entryToRename))
194
-
195
- contents = zf.read(entryToRename)
196
- newName = "changed entry name"
197
- assert(!zf.entries.map { |e| e.name }.include?(newName))
198
-
199
- zf.rename(entryToRename, newName)
200
- assert(zf.entries.map { |e| e.name }.include?(newName))
201
-
202
- assert_equal(contents, zf.read(newName))
203
-
204
- zf.close
205
-
206
- zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
207
- assert(zfRead.entries.map { |e| e.name }.include?(newName))
208
- assert_equal(contents, zfRead.read(newName))
209
- zfRead.close
210
- end
211
-
212
- def test_rename_with_each
213
- zf_name = 'test_rename_zip.zip'
214
- if ::File.exist?(zf_name)
215
- ::File.unlink(zf_name)
216
- end
217
- arr = []
218
- arr_renamed = []
219
- ::Zip::File.open(zf_name, ::Zip::File::CREATE) do |zf|
220
- zf.mkdir('test')
221
- arr << 'test/'
222
- arr_renamed << 'Ztest/'
223
- %w(a b c d).each do |f|
224
- zf.get_output_stream("test/#{f}") { |file| file.puts 'aaaa' }
225
- arr << "test/#{f}"
226
- arr_renamed << "Ztest/#{f}"
227
- end
228
- end
229
- zf = ::Zip::File.open(zf_name)
230
- assert_equal(zf.entries.map(&:name), arr)
231
- zf.close
232
- Zip::File.open(zf_name, "wb") do |z|
233
- z.each do |f|
234
- z.rename(f, "Z#{f.name}")
235
- end
236
- end
237
- zf = ::Zip::File.open(zf_name)
238
- assert_equal(zf.entries.map(&:name), arr_renamed)
239
- zf.close
240
- if ::File.exist?(zf_name)
241
- ::File.unlink(zf_name)
242
- end
243
- end
244
-
245
- def test_renameToExistingEntry
246
- oldEntries = nil
247
- ::Zip::File.open(TEST_ZIP.zip_name) { |zf| oldEntries = zf.entries }
248
-
249
- assert_raises(::Zip::EntryExistsError) do
250
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
251
- zf.rename(zf.entries[0], zf.entries[1].name)
252
- end
253
- end
254
-
255
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
256
- assert_equal(oldEntries.sort.map { |e| e.name }, zf.entries.sort.map { |e| e.name })
257
- end
258
- end
259
-
260
- def test_renameToExistingEntryOverwrite
261
- oldEntries = nil
262
- ::Zip::File.open(TEST_ZIP.zip_name) { |zf| oldEntries = zf.entries }
263
-
264
- gotCalled = false
265
- renamedEntryName = nil
266
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
267
- renamedEntryName = zf.entries[0].name
268
- zf.rename(zf.entries[0], zf.entries[1].name) { gotCalled = true; true }
269
- end
270
-
271
- assert(gotCalled)
272
- oldEntries.delete_if { |e| e.name == renamedEntryName }
273
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
274
- assert_equal(oldEntries.sort.map { |e| e.name },
275
- zf.entries.sort.map { |e| e.name })
276
- end
277
- end
278
-
279
- def test_renameNonEntry
280
- nonEntry = "bogusEntry"
281
- target_entry = "target_entryName"
282
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
283
- assert(!zf.entries.include?(nonEntry))
284
- assert_raises(Errno::ENOENT) {
285
- zf.rename(nonEntry, target_entry)
286
- }
287
- zf.commit
288
- assert(!zf.entries.include?(target_entry))
289
- ensure
290
- zf.close
291
- end
292
-
293
- def test_renameEntryToExistingEntry
294
- entry1, entry2, * = TEST_ZIP.entry_names
295
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
296
- assert_raises(::Zip::EntryExistsError) {
297
- zf.rename(entry1, entry2)
298
- }
299
- ensure
300
- zf.close
301
- end
302
-
303
- def test_replace
304
- entryToReplace = TEST_ZIP.entry_names[2]
305
- newEntrySrcFilename = "test/data/file2.txt"
306
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
307
- zf.replace(entryToReplace, newEntrySrcFilename)
308
-
309
- zf.close
310
- zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
311
- AssertEntry::assert_contents(newEntrySrcFilename,
312
- zfRead.get_input_stream(entryToReplace) { |is| is.read })
313
- AssertEntry::assert_contents(TEST_ZIP.entry_names[0],
314
- zfRead.get_input_stream(TEST_ZIP.entry_names[0]) { |is| is.read })
315
- AssertEntry::assert_contents(TEST_ZIP.entry_names[1],
316
- zfRead.get_input_stream(TEST_ZIP.entry_names[1]) { |is| is.read })
317
- AssertEntry::assert_contents(TEST_ZIP.entry_names[3],
318
- zfRead.get_input_stream(TEST_ZIP.entry_names[3]) { |is| is.read })
319
- zfRead.close
320
- end
321
-
322
- def test_replaceNonEntry
323
- entryToReplace = "nonExistingEntryname"
324
- ::Zip::File.open(TEST_ZIP.zip_name) {
325
- |zf|
326
- assert_raises(Errno::ENOENT) {
327
- zf.replace(entryToReplace, "test/data/file2.txt")
328
- }
329
- }
330
- end
331
-
332
- def test_commit
333
- newName = "renamedFirst"
334
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
335
- oldName = zf.entries.first
336
- zf.rename(oldName, newName)
337
- zf.commit
338
-
339
- zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
340
- assert(zfRead.entries.detect { |e| e.name == newName } != nil)
341
- assert(zfRead.entries.detect { |e| e.name == oldName } == nil)
342
- zfRead.close
343
-
344
- zf.close
345
- res = system("unzip -t #{TEST_ZIP.zip_name}")
346
- assert_equal(res, true)
347
- end
348
-
349
- def test_double_commit(filename = 'test/data/generated/double_commit_test.zip')
350
- ::FileUtils.touch('test/data/generated/test_double_commit1.txt')
351
- ::FileUtils.touch('test/data/generated/test_double_commit2.txt')
352
- zf = ::Zip::File.open(filename, ::Zip::File::CREATE)
353
- zf.add('test1.txt', 'test/data/generated/test_double_commit1.txt')
354
- zf.commit
355
- zf.add('test2.txt', 'test/data/generated/test_double_commit2.txt')
356
- zf.commit
357
- zf.close
358
- zf2 = ::Zip::File.open(filename)
359
- assert(zf2.entries.detect {|e| e.name == 'test1.txt'} != nil )
360
- assert(zf2.entries.detect {|e| e.name == 'test2.txt'} != nil )
361
- res = system("unzip -t #{filename}")
362
- assert_equal(res, true)
363
- end
364
-
365
- def test_double_commit_zip64
366
- ::Zip.write_zip64_support = true
367
- test_double_commit('test/data/generated/double_commit_test64.zip')
368
- end
369
-
370
- def test_write_buffer
371
- newName = "renamedFirst"
372
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
373
- oldName = zf.entries.first
374
- zf.rename(oldName, newName)
375
- io = ::StringIO.new('')
376
- buffer = zf.write_buffer(io)
377
- File.open(TEST_ZIP.zip_name, 'wb') { |f| f.write buffer.string }
378
- zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
379
- assert(zfRead.entries.detect { |e| e.name == newName } != nil)
380
- assert(zfRead.entries.detect { |e| e.name == oldName } == nil)
381
- zfRead.close
382
-
383
- zf.close
384
- end
385
-
386
- # This test tests that after commit, you
387
- # can delete the file you used to add the entry to the zip file
388
- # with
389
- def test_commitUseZipEntry
390
- FileUtils.cp(TestFiles::RANDOM_ASCII_FILE1, OK_DELETE_FILE)
391
- zf = ::Zip::File.open(TEST_ZIP.zip_name)
392
- zf.add("okToDelete.txt", OK_DELETE_FILE)
393
- assert_contains(zf, "okToDelete.txt")
394
- zf.commit
395
- File.rename(OK_DELETE_FILE, OK_DELETE_MOVED_FILE)
396
- assert_contains(zf, "okToDelete.txt", OK_DELETE_MOVED_FILE)
397
- end
398
-
399
- # def test_close
400
- # zf = ZipFile.new(TEST_ZIP.zip_name)
401
- # zf.close
402
- # assert_raises(IOError) {
403
- # zf.extract(TEST_ZIP.entry_names.first, "hullubullu")
404
- # }
405
- # end
406
-
407
- def test_compound1
408
- renamedName = "renamedName"
409
- originalEntries = []
410
- filename_to_remove = ''
411
- begin
412
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
413
- originalEntries = zf.entries.dup
414
-
415
- assert_not_contains(zf, TestFiles::RANDOM_ASCII_FILE1)
416
- zf.add(TestFiles::RANDOM_ASCII_FILE1,
417
- TestFiles::RANDOM_ASCII_FILE1)
418
- assert_contains(zf, TestFiles::RANDOM_ASCII_FILE1)
419
-
420
- entry_to_rename = zf.entries.find { |entry| entry.name.match('longAscii') }
421
- zf.rename(entry_to_rename, renamedName)
422
- assert_contains(zf, renamedName)
423
-
424
- TestFiles::BINARY_TEST_FILES.each {
425
- |filename|
426
- zf.add(filename, filename)
427
- assert_contains(zf, filename)
428
- }
429
-
430
- assert_contains(zf, originalEntries.last.to_s)
431
- filename_to_remove = originalEntries.map(&:to_s).find { |name| name.match('longBinary') }
432
- zf.remove(filename_to_remove)
433
- assert_not_contains(zf, filename_to_remove)
434
-
435
- ensure
436
- zf.close
437
- end
438
- begin
439
- zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
440
- assert_contains(zfRead, TestFiles::RANDOM_ASCII_FILE1)
441
- assert_contains(zfRead, renamedName)
442
- TestFiles::BINARY_TEST_FILES.each {
443
- |filename|
444
- assert_contains(zfRead, filename)
445
- }
446
- assert_not_contains(zfRead, filename_to_remove)
447
- ensure
448
- zfRead.close
449
- end
450
- end
451
-
452
- def test_compound2
453
- begin
454
- zf = ::Zip::File.new(TEST_ZIP.zip_name)
455
- originalEntries = zf.entries.dup
456
-
457
- originalEntries.each {
458
- |entry|
459
- zf.remove(entry)
460
- assert_not_contains(zf, entry)
461
- }
462
- assert(zf.entries.empty?)
463
-
464
- TestFiles::ASCII_TEST_FILES.each {
465
- |filename|
466
- zf.add(filename, filename)
467
- assert_contains(zf, filename)
468
- }
469
- assert_equal(zf.entries.sort.map { |e| e.name }, TestFiles::ASCII_TEST_FILES)
470
-
471
- zf.rename(TestFiles::ASCII_TEST_FILES[0], "newName")
472
- assert_not_contains(zf, TestFiles::ASCII_TEST_FILES[0])
473
- assert_contains(zf, "newName")
474
- ensure
475
- zf.close
476
- end
477
- begin
478
- zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
479
- asciiTestFiles = TestFiles::ASCII_TEST_FILES.dup
480
- asciiTestFiles.shift
481
- asciiTestFiles.each {
482
- |filename|
483
- assert_contains(zf, filename)
484
- }
485
-
486
- assert_contains(zf, "newName")
487
- ensure
488
- zfRead.close
489
- end
490
- end
491
-
492
- def test_changeComment
493
- ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
494
- zf.comment = "my changed comment"
495
- end
496
- zfRead = ::Zip::File.open(TEST_ZIP.zip_name)
497
- assert_equal("my changed comment", zfRead.comment)
498
- end
499
-
500
- def test_preserve_file_order
501
- entryNames = nil
502
- ::Zip::File.open(TEST_ZIP.zip_name) {
503
- |zf|
504
- entryNames = zf.entries.map { |e| e.to_s }
505
- zf.get_output_stream("a.txt") { |os| os.write "this is a.txt" }
506
- zf.get_output_stream("z.txt") { |os| os.write "this is z.txt" }
507
- zf.get_output_stream("k.txt") { |os| os.write "this is k.txt" }
508
- entryNames << "a.txt" << "z.txt" << "k.txt"
509
- }
510
-
511
- ::Zip::File.open(TEST_ZIP.zip_name) {
512
- |zf|
513
- assert_equal(entryNames, zf.entries.map { |e| e.to_s })
514
- entries = zf.entries.sort_by { |e| e.name }.reverse
515
- entries.each {
516
- |e|
517
- zf.remove e
518
- zf.get_output_stream(e) { |os| os.write "foo" }
519
- }
520
- entryNames = entries.map { |e| e.to_s }
521
- }
522
- ::Zip::File.open(TEST_ZIP.zip_name) {
523
- |zf|
524
- assert_equal(entryNames, zf.entries.map { |e| e.to_s })
525
- }
526
- end
527
-
528
- def test_streaming
529
- fname = ::File.join(::File.expand_path(::File.dirname(__FILE__)), "../README.md")
530
- zname = "test/data/generated/README.zip"
531
- Zip::File.open(zname, Zip::File::CREATE) do |zipfile|
532
- zipfile.get_output_stream(File.basename(fname)) do |f|
533
- f.puts File.read(fname)
534
- end
535
- end
536
-
537
- data = nil
538
- File.open(zname, 'rb') do |f|
539
- Zip::File.open_buffer(f) do |zipfile|
540
- zipfile.each do |entry|
541
- next unless entry.name =~ /README.md/
542
- data = zipfile.read(entry)
543
- end
544
- end
545
- end
546
- assert data
547
- assert data =~ /Simonov/
548
- end
549
-
550
- private
551
- def assert_contains(zf, entryName, filename = entryName)
552
- assert(zf.entries.detect { |e| e.name == entryName } != nil, "entry #{entryName} not in #{zf.entries.join(', ')} in zip file #{zf}")
553
- assert_entryContents(zf, entryName, filename) if File.exist?(filename)
554
- end
555
-
556
- def assert_not_contains(zf, entryName)
557
- assert(zf.entries.detect { |e| e.name == entryName } == nil, "entry #{entryName} in #{zf.entries.join(', ')} in zip file #{zf}")
558
- end
559
- end