rubyzip 1.1.4 → 1.1.5

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rubyzip might be problematic. Click here for more details.

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