rubyzip 1.3.0 → 3.0.0.alpha

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