rubyzip 1.1.7 → 1.3.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 (106) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +143 -54
  3. data/Rakefile +3 -4
  4. data/lib/zip/central_directory.rb +8 -8
  5. data/lib/zip/compressor.rb +1 -2
  6. data/lib/zip/constants.rb +5 -5
  7. data/lib/zip/crypto/null_encryption.rb +4 -6
  8. data/lib/zip/crypto/traditional_encryption.rb +5 -5
  9. data/lib/zip/decompressor.rb +3 -3
  10. data/lib/zip/deflater.rb +8 -6
  11. data/lib/zip/dos_time.rb +5 -6
  12. data/lib/zip/entry.rb +132 -128
  13. data/lib/zip/entry_set.rb +14 -14
  14. data/lib/zip/errors.rb +2 -0
  15. data/lib/zip/extra_field/generic.rb +8 -8
  16. data/lib/zip/extra_field/ntfs.rb +14 -16
  17. data/lib/zip/extra_field/old_unix.rb +9 -10
  18. data/lib/zip/extra_field/universal_time.rb +14 -14
  19. data/lib/zip/extra_field/unix.rb +8 -9
  20. data/lib/zip/extra_field/zip64.rb +12 -11
  21. data/lib/zip/extra_field/zip64_placeholder.rb +1 -2
  22. data/lib/zip/extra_field.rb +8 -8
  23. data/lib/zip/file.rb +88 -81
  24. data/lib/zip/filesystem.rb +144 -143
  25. data/lib/zip/inflater.rb +5 -5
  26. data/lib/zip/input_stream.rb +22 -13
  27. data/lib/zip/ioextras/abstract_input_stream.rb +6 -10
  28. data/lib/zip/ioextras/abstract_output_stream.rb +3 -5
  29. data/lib/zip/ioextras.rb +1 -3
  30. data/lib/zip/null_compressor.rb +2 -2
  31. data/lib/zip/null_decompressor.rb +3 -3
  32. data/lib/zip/null_input_stream.rb +0 -0
  33. data/lib/zip/output_stream.rb +13 -14
  34. data/lib/zip/pass_thru_compressor.rb +4 -4
  35. data/lib/zip/pass_thru_decompressor.rb +3 -4
  36. data/lib/zip/streamable_directory.rb +2 -2
  37. data/lib/zip/streamable_stream.rb +3 -3
  38. data/lib/zip/version.rb +1 -1
  39. data/lib/zip.rb +13 -5
  40. data/samples/example.rb +29 -39
  41. data/samples/example_filesystem.rb +16 -18
  42. data/samples/example_recursive.rb +31 -25
  43. data/samples/{gtkRubyzip.rb → gtk_ruby_zip.rb} +23 -25
  44. data/samples/qtzip.rb +18 -27
  45. data/samples/write_simple.rb +12 -13
  46. data/samples/zipfind.rb +26 -34
  47. data/test/basic_zip_file_test.rb +11 -15
  48. data/test/case_sensitivity_test.rb +69 -0
  49. data/test/central_directory_entry_test.rb +32 -36
  50. data/test/central_directory_test.rb +46 -50
  51. data/test/crypto/null_encryption_test.rb +8 -4
  52. data/test/crypto/traditional_encryption_test.rb +5 -5
  53. data/test/data/gpbit3stored.zip +0 -0
  54. data/test/data/notzippedruby.rb +1 -1
  55. data/test/data/oddExtraField.zip +0 -0
  56. data/test/data/path_traversal/Makefile +10 -0
  57. data/test/data/path_traversal/jwilk/README.md +5 -0
  58. data/test/data/path_traversal/jwilk/absolute1.zip +0 -0
  59. data/test/data/path_traversal/jwilk/absolute2.zip +0 -0
  60. data/test/data/path_traversal/jwilk/dirsymlink.zip +0 -0
  61. data/test/data/path_traversal/jwilk/dirsymlink2a.zip +0 -0
  62. data/test/data/path_traversal/jwilk/dirsymlink2b.zip +0 -0
  63. data/test/data/path_traversal/jwilk/relative0.zip +0 -0
  64. data/test/data/path_traversal/jwilk/relative2.zip +0 -0
  65. data/test/data/path_traversal/jwilk/symlink.zip +0 -0
  66. data/test/data/path_traversal/relative1.zip +0 -0
  67. data/test/data/path_traversal/tilde.zip +0 -0
  68. data/test/data/path_traversal/tuzovakaoff/README.md +3 -0
  69. data/test/data/path_traversal/tuzovakaoff/absolutepath.zip +0 -0
  70. data/test/data/path_traversal/tuzovakaoff/symlink.zip +0 -0
  71. data/test/data/rubycode.zip +0 -0
  72. data/test/data/test.xls +0 -0
  73. data/test/deflater_test.rb +10 -12
  74. data/test/encryption_test.rb +2 -2
  75. data/test/entry_set_test.rb +50 -25
  76. data/test/entry_test.rb +76 -87
  77. data/test/errors_test.rb +1 -2
  78. data/test/extra_field_test.rb +19 -21
  79. data/test/file_extract_directory_test.rb +12 -14
  80. data/test/file_extract_test.rb +94 -39
  81. data/test/file_permissions_test.rb +65 -0
  82. data/test/file_split_test.rb +24 -27
  83. data/test/file_test.rb +286 -179
  84. data/test/filesystem/dir_iterator_test.rb +13 -17
  85. data/test/filesystem/directory_test.rb +101 -93
  86. data/test/filesystem/file_mutating_test.rb +52 -65
  87. data/test/filesystem/file_nonmutating_test.rb +223 -229
  88. data/test/filesystem/file_stat_test.rb +17 -19
  89. data/test/gentestfiles.rb +54 -62
  90. data/test/inflater_test.rb +1 -1
  91. data/test/input_stream_test.rb +52 -40
  92. data/test/ioextras/abstract_input_stream_test.rb +22 -23
  93. data/test/ioextras/abstract_output_stream_test.rb +33 -33
  94. data/test/ioextras/fake_io_test.rb +1 -1
  95. data/test/local_entry_test.rb +36 -38
  96. data/test/output_stream_test.rb +20 -21
  97. data/test/pass_thru_compressor_test.rb +5 -6
  98. data/test/pass_thru_decompressor_test.rb +0 -1
  99. data/test/path_traversal_test.rb +141 -0
  100. data/test/samples/example_recursive_test.rb +37 -0
  101. data/test/settings_test.rb +18 -15
  102. data/test/test_helper.rb +52 -46
  103. data/test/unicode_file_names_and_comments_test.rb +17 -7
  104. data/test/zip64_full_test.rb +10 -12
  105. data/test/zip64_support_test.rb +0 -1
  106. metadata +100 -66
data/test/file_test.rb CHANGED
@@ -1,8 +1,8 @@
1
1
  require 'test_helper'
2
2
 
3
-
4
3
  class ZipFileTest < MiniTest::Test
5
4
  include CommonZipFileFixture
5
+ include ZipEntryData
6
6
 
7
7
  OK_DELETE_FILE = 'test/data/generated/okToDelete.txt'
8
8
  OK_DELETE_MOVED_FILE = 'test/data/generated/okToDeleteMoved.txt'
@@ -11,12 +11,12 @@ class ZipFileTest < MiniTest::Test
11
11
  ::Zip.write_zip64_support = false
12
12
  end
13
13
 
14
- def test_createFromScratchToBuffer
15
- comment = "a short comment"
14
+ def test_create_from_scratch_to_buffer
15
+ comment = 'a short comment'
16
16
 
17
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")
18
+ zf.get_output_stream('myFile') { |os| os.write 'myFile contains just this' }
19
+ zf.mkdir('dir1')
20
20
  zf.comment = comment
21
21
  end
22
22
 
@@ -27,12 +27,12 @@ class ZipFileTest < MiniTest::Test
27
27
  assert_equal(2, zfRead.entries.length)
28
28
  end
29
29
 
30
- def test_createFromScratch
31
- comment = "a short comment"
30
+ def test_create_from_scratch
31
+ comment = 'a short comment'
32
32
 
33
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")
34
+ zf.get_output_stream('myFile') { |os| os.write 'myFile contains just this' }
35
+ zf.mkdir('dir1')
36
36
  zf.comment = comment
37
37
  zf.close
38
38
 
@@ -41,31 +41,47 @@ class ZipFileTest < MiniTest::Test
41
41
  assert_equal(2, zfRead.entries.length)
42
42
  end
43
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
+
44
64
  def test_get_output_stream
45
65
  entryCount = nil
46
- ::Zip::File.open(TEST_ZIP.zip_name) {
47
- |zf|
66
+ ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
48
67
  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)
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)
69
85
  entry = zf.get_entry('entry_with_custom_args.txt')
70
86
  assert_equal(custom_entry_args[0], entry.comment)
71
87
  assert_equal(custom_entry_args[2], entry.compressed_size)
@@ -74,26 +90,95 @@ class ZipFileTest < MiniTest::Test
74
90
  assert_equal(custom_entry_args[5], entry.size)
75
91
  assert_equal(custom_entry_args[6], entry.time)
76
92
 
77
- zf.get_output_stream('entry.bin') {
78
- |os|
93
+ zf.get_output_stream('entry.bin') do |os|
79
94
  os.write(::File.open('test/data/generated/5entry.zip', 'rb').read)
80
- }
81
- }
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
82
155
 
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
- }
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')
90
175
  end
91
176
 
92
177
  def test_cleans_up_tempfiles_after_close
93
178
  zf = ::Zip::File.new(EMPTY_FILENAME, ::Zip::File::CREATE)
94
- zf.get_output_stream("myFile") do |os|
179
+ zf.get_output_stream('myFile') do |os|
95
180
  @tempfile_path = os.path
96
- os.write "myFile contains just this"
181
+ os.write 'myFile contains just this'
97
182
  end
98
183
 
99
184
  assert_equal(true, File.exist?(@tempfile_path))
@@ -104,68 +189,83 @@ class ZipFileTest < MiniTest::Test
104
189
  end
105
190
 
106
191
  def test_add
107
- srcFile = "test/data/file2.txt"
108
- entryName = "newEntryName.rb"
192
+ srcFile = 'test/data/file2.txt'
193
+ entryName = 'newEntryName.rb'
109
194
  assert(::File.exist?(srcFile))
110
195
  zf = ::Zip::File.new(EMPTY_FILENAME, ::Zip::File::CREATE)
111
196
  zf.add(entryName, srcFile)
112
197
  zf.close
113
198
 
114
199
  zfRead = ::Zip::File.new(EMPTY_FILENAME)
115
- assert_equal("", zfRead.comment)
200
+ assert_equal('', zfRead.comment)
116
201
  assert_equal(1, zfRead.entries.length)
117
202
  assert_equal(entryName, zfRead.entries.first.name)
118
203
  AssertEntry.assert_contents(srcFile,
119
204
  zfRead.get_input_stream(entryName) { |zis| zis.read })
120
205
  end
121
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
+
122
227
  def test_recover_permissions_after_add_files_to_archive
123
228
  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)
229
+ ::File.chmod(0o664, srcZip)
230
+ srcFile = 'test/data/file2.txt'
231
+ entryName = 'newEntryName.rb'
232
+ assert_equal(::File.stat(srcZip).mode, 0o100664)
128
233
  assert(::File.exist?(srcZip))
129
234
  zf = ::Zip::File.new(srcZip, ::Zip::File::CREATE)
130
235
  zf.add(entryName, srcFile)
131
236
  zf.close
132
- assert_equal(::File.stat(srcZip).mode, 0100664)
237
+ assert_equal(::File.stat(srcZip).mode, 0o100664)
133
238
  end
134
239
 
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
- }
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
142
246
  end
143
247
 
144
- def test_addExistingEntryNameReplace
248
+ def test_add_existing_entry_name_replace
145
249
  gotCalled = false
146
250
  replacedEntry = nil
147
- ::Zip::File.open(TEST_ZIP.zip_name) {
148
- |zf|
251
+ ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
149
252
  replacedEntry = zf.entries.first.name
150
- zf.add(replacedEntry, "test/data/file2.txt") { gotCalled = true; true }
151
- }
253
+ zf.add(replacedEntry, 'test/data/file2.txt') { gotCalled = true; true }
254
+ end
152
255
  assert(gotCalled)
153
- ::Zip::File.open(TEST_ZIP.zip_name) {
154
- |zf|
155
- assert_contains(zf, replacedEntry, "test/data/file2.txt")
156
- }
256
+ ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
257
+ assert_contains(zf, replacedEntry, 'test/data/file2.txt')
258
+ end
157
259
  end
158
260
 
159
- def test_addDirectory
160
- ::Zip::File.open(TEST_ZIP.zip_name) {
161
- |zf|
261
+ def test_add_directory
262
+ ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
162
263
  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+"/" }
264
+ end
265
+ ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
266
+ dirEntry = zf.entries.detect { |e| e.name == TestFiles::EMPTY_TEST_DIR + '/' }
167
267
  assert(dirEntry.directory?)
168
- }
268
+ end
169
269
  end
170
270
 
171
271
  def test_remove
@@ -193,7 +293,7 @@ class ZipFileTest < MiniTest::Test
193
293
  assert(zf.entries.map { |e| e.name }.include?(entryToRename))
194
294
 
195
295
  contents = zf.read(entryToRename)
196
- newName = "changed entry name"
296
+ newName = 'changed entry name'
197
297
  assert(!zf.entries.map { |e| e.name }.include?(newName))
198
298
 
199
299
  zf.rename(entryToRename, newName)
@@ -211,16 +311,14 @@ class ZipFileTest < MiniTest::Test
211
311
 
212
312
  def test_rename_with_each
213
313
  zf_name = 'test_rename_zip.zip'
214
- if ::File.exist?(zf_name)
215
- ::File.unlink(zf_name)
216
- end
314
+ ::File.unlink(zf_name) if ::File.exist?(zf_name)
217
315
  arr = []
218
316
  arr_renamed = []
219
317
  ::Zip::File.open(zf_name, ::Zip::File::CREATE) do |zf|
220
318
  zf.mkdir('test')
221
319
  arr << 'test/'
222
320
  arr_renamed << 'Ztest/'
223
- %w(a b c d).each do |f|
321
+ %w[a b c d].each do |f|
224
322
  zf.get_output_stream("test/#{f}") { |file| file.puts 'aaaa' }
225
323
  arr << "test/#{f}"
226
324
  arr_renamed << "Ztest/#{f}"
@@ -229,7 +327,7 @@ class ZipFileTest < MiniTest::Test
229
327
  zf = ::Zip::File.open(zf_name)
230
328
  assert_equal(zf.entries.map(&:name), arr)
231
329
  zf.close
232
- Zip::File.open(zf_name, "wb") do |z|
330
+ Zip::File.open(zf_name, 'wb') do |z|
233
331
  z.each do |f|
234
332
  z.rename(f, "Z#{f.name}")
235
333
  end
@@ -237,12 +335,10 @@ class ZipFileTest < MiniTest::Test
237
335
  zf = ::Zip::File.open(zf_name)
238
336
  assert_equal(zf.entries.map(&:name), arr_renamed)
239
337
  zf.close
240
- if ::File.exist?(zf_name)
241
- ::File.unlink(zf_name)
242
- end
338
+ ::File.unlink(zf_name) if ::File.exist?(zf_name)
243
339
  end
244
340
 
245
- def test_renameToExistingEntry
341
+ def test_rename_to_existing_entry
246
342
  oldEntries = nil
247
343
  ::Zip::File.open(TEST_ZIP.zip_name) { |zf| oldEntries = zf.entries }
248
344
 
@@ -257,7 +353,7 @@ class ZipFileTest < MiniTest::Test
257
353
  end
258
354
  end
259
355
 
260
- def test_renameToExistingEntryOverwrite
356
+ def test_rename_to_existing_entry_overwrite
261
357
  oldEntries = nil
262
358
  ::Zip::File.open(TEST_ZIP.zip_name) { |zf| oldEntries = zf.entries }
263
359
 
@@ -276,61 +372,54 @@ class ZipFileTest < MiniTest::Test
276
372
  end
277
373
  end
278
374
 
279
- def test_renameNonEntry
280
- nonEntry = "bogusEntry"
281
- target_entry = "target_entryName"
375
+ def test_rename_non_entry
376
+ nonEntry = 'bogusEntry'
377
+ target_entry = 'target_entryName'
282
378
  zf = ::Zip::File.new(TEST_ZIP.zip_name)
283
379
  assert(!zf.entries.include?(nonEntry))
284
- assert_raises(Errno::ENOENT) {
285
- zf.rename(nonEntry, target_entry)
286
- }
380
+ assert_raises(Errno::ENOENT) { zf.rename(nonEntry, target_entry) }
287
381
  zf.commit
288
382
  assert(!zf.entries.include?(target_entry))
289
383
  ensure
290
384
  zf.close
291
385
  end
292
386
 
293
- def test_renameEntryToExistingEntry
387
+ def test_rename_entry_to_existing_entry
294
388
  entry1, entry2, * = TEST_ZIP.entry_names
295
389
  zf = ::Zip::File.new(TEST_ZIP.zip_name)
296
- assert_raises(::Zip::EntryExistsError) {
297
- zf.rename(entry1, entry2)
298
- }
390
+ assert_raises(::Zip::EntryExistsError) { zf.rename(entry1, entry2) }
299
391
  ensure
300
392
  zf.close
301
393
  end
302
394
 
303
395
  def test_replace
304
396
  entryToReplace = TEST_ZIP.entry_names[2]
305
- newEntrySrcFilename = "test/data/file2.txt"
397
+ newEntrySrcFilename = 'test/data/file2.txt'
306
398
  zf = ::Zip::File.new(TEST_ZIP.zip_name)
307
399
  zf.replace(entryToReplace, newEntrySrcFilename)
308
400
 
309
401
  zf.close
310
402
  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 })
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 })
319
411
  zfRead.close
320
412
  end
321
413
 
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
- }
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
330
419
  end
331
420
 
332
421
  def test_commit
333
- newName = "renamedFirst"
422
+ newName = 'renamedFirst'
334
423
  zf = ::Zip::File.new(TEST_ZIP.zip_name)
335
424
  oldName = zf.entries.first
336
425
  zf.rename(oldName, newName)
@@ -338,11 +427,11 @@ class ZipFileTest < MiniTest::Test
338
427
 
339
428
  zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
340
429
  assert(zfRead.entries.detect { |e| e.name == newName } != nil)
341
- assert(zfRead.entries.detect { |e| e.name == oldName } == nil)
430
+ assert(zfRead.entries.detect { |e| e.name == oldName }.nil?)
342
431
  zfRead.close
343
432
 
344
433
  zf.close
345
- res = system("unzip -t #{TEST_ZIP.zip_name}")
434
+ res = system("unzip -tqq #{TEST_ZIP.zip_name}")
346
435
  assert_equal(res, true)
347
436
  end
348
437
 
@@ -356,9 +445,9 @@ class ZipFileTest < MiniTest::Test
356
445
  zf.commit
357
446
  zf.close
358
447
  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}")
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}")
362
451
  assert_equal(res, true)
363
452
  end
364
453
 
@@ -368,7 +457,7 @@ class ZipFileTest < MiniTest::Test
368
457
  end
369
458
 
370
459
  def test_write_buffer
371
- newName = "renamedFirst"
460
+ newName = 'renamedFirst'
372
461
  zf = ::Zip::File.new(TEST_ZIP.zip_name)
373
462
  oldName = zf.entries.first
374
463
  zf.rename(oldName, newName)
@@ -377,7 +466,7 @@ class ZipFileTest < MiniTest::Test
377
466
  File.open(TEST_ZIP.zip_name, 'wb') { |f| f.write buffer.string }
378
467
  zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
379
468
  assert(zfRead.entries.detect { |e| e.name == newName } != nil)
380
- assert(zfRead.entries.detect { |e| e.name == oldName } == nil)
469
+ assert(zfRead.entries.detect { |e| e.name == oldName }.nil?)
381
470
  zfRead.close
382
471
 
383
472
  zf.close
@@ -386,27 +475,26 @@ class ZipFileTest < MiniTest::Test
386
475
  # This test tests that after commit, you
387
476
  # can delete the file you used to add the entry to the zip file
388
477
  # with
389
- def test_commitUseZipEntry
478
+ def test_commit_use_zip_entry
390
479
  FileUtils.cp(TestFiles::RANDOM_ASCII_FILE1, OK_DELETE_FILE)
391
480
  zf = ::Zip::File.open(TEST_ZIP.zip_name)
392
- zf.add("okToDelete.txt", OK_DELETE_FILE)
393
- assert_contains(zf, "okToDelete.txt")
481
+ zf.add('okToDelete.txt', OK_DELETE_FILE)
482
+ assert_contains(zf, 'okToDelete.txt')
394
483
  zf.commit
395
484
  File.rename(OK_DELETE_FILE, OK_DELETE_MOVED_FILE)
396
- assert_contains(zf, "okToDelete.txt", OK_DELETE_MOVED_FILE)
485
+ assert_contains(zf, 'okToDelete.txt', OK_DELETE_MOVED_FILE)
397
486
  end
398
487
 
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
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
406
495
 
407
496
  def test_compound1
408
- renamedName = "renamedName"
409
- originalEntries = []
497
+ renamedName = 'renamedName'
410
498
  filename_to_remove = ''
411
499
  begin
412
500
  zf = ::Zip::File.new(TEST_ZIP.zip_name)
@@ -421,17 +509,15 @@ class ZipFileTest < MiniTest::Test
421
509
  zf.rename(entry_to_rename, renamedName)
422
510
  assert_contains(zf, renamedName)
423
511
 
424
- TestFiles::BINARY_TEST_FILES.each {
425
- |filename|
512
+ TestFiles::BINARY_TEST_FILES.each do |filename|
426
513
  zf.add(filename, filename)
427
514
  assert_contains(zf, filename)
428
- }
515
+ end
429
516
 
430
517
  assert_contains(zf, originalEntries.last.to_s)
431
518
  filename_to_remove = originalEntries.map(&:to_s).find { |name| name.match('longBinary') }
432
519
  zf.remove(filename_to_remove)
433
520
  assert_not_contains(zf, filename_to_remove)
434
-
435
521
  ensure
436
522
  zf.close
437
523
  end
@@ -439,10 +525,9 @@ class ZipFileTest < MiniTest::Test
439
525
  zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
440
526
  assert_contains(zfRead, TestFiles::RANDOM_ASCII_FILE1)
441
527
  assert_contains(zfRead, renamedName)
442
- TestFiles::BINARY_TEST_FILES.each {
443
- |filename|
528
+ TestFiles::BINARY_TEST_FILES.each do |filename|
444
529
  assert_contains(zfRead, filename)
445
- }
530
+ end
446
531
  assert_not_contains(zfRead, filename_to_remove)
447
532
  ensure
448
533
  zfRead.close
@@ -454,23 +539,21 @@ class ZipFileTest < MiniTest::Test
454
539
  zf = ::Zip::File.new(TEST_ZIP.zip_name)
455
540
  originalEntries = zf.entries.dup
456
541
 
457
- originalEntries.each {
458
- |entry|
542
+ originalEntries.each do |entry|
459
543
  zf.remove(entry)
460
544
  assert_not_contains(zf, entry)
461
- }
545
+ end
462
546
  assert(zf.entries.empty?)
463
547
 
464
- TestFiles::ASCII_TEST_FILES.each {
465
- |filename|
548
+ TestFiles::ASCII_TEST_FILES.each do |filename|
466
549
  zf.add(filename, filename)
467
550
  assert_contains(zf, filename)
468
- }
551
+ end
469
552
  assert_equal(zf.entries.sort.map { |e| e.name }, TestFiles::ASCII_TEST_FILES)
470
553
 
471
- zf.rename(TestFiles::ASCII_TEST_FILES[0], "newName")
554
+ zf.rename(TestFiles::ASCII_TEST_FILES[0], 'newName')
472
555
  assert_not_contains(zf, TestFiles::ASCII_TEST_FILES[0])
473
- assert_contains(zf, "newName")
556
+ assert_contains(zf, 'newName')
474
557
  ensure
475
558
  zf.close
476
559
  end
@@ -478,56 +561,51 @@ class ZipFileTest < MiniTest::Test
478
561
  zfRead = ::Zip::File.new(TEST_ZIP.zip_name)
479
562
  asciiTestFiles = TestFiles::ASCII_TEST_FILES.dup
480
563
  asciiTestFiles.shift
481
- asciiTestFiles.each {
482
- |filename|
564
+ asciiTestFiles.each do |filename|
483
565
  assert_contains(zf, filename)
484
- }
566
+ end
485
567
 
486
- assert_contains(zf, "newName")
568
+ assert_contains(zf, 'newName')
487
569
  ensure
488
570
  zfRead.close
489
571
  end
490
572
  end
491
573
 
492
- def test_changeComment
574
+ def test_change_comment
493
575
  ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
494
- zf.comment = "my changed comment"
576
+ zf.comment = 'my changed comment'
495
577
  end
496
578
  zfRead = ::Zip::File.open(TEST_ZIP.zip_name)
497
- assert_equal("my changed comment", zfRead.comment)
579
+ assert_equal('my changed comment', zfRead.comment)
498
580
  end
499
581
 
500
582
  def test_preserve_file_order
501
583
  entryNames = nil
502
- ::Zip::File.open(TEST_ZIP.zip_name) {
503
- |zf|
584
+ ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
504
585
  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|
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|
513
593
  assert_equal(entryNames, zf.entries.map { |e| e.to_s })
514
594
  entries = zf.entries.sort_by { |e| e.name }.reverse
515
- entries.each {
516
- |e|
595
+ entries.each do |e|
517
596
  zf.remove e
518
- zf.get_output_stream(e) { |os| os.write "foo" }
519
- }
597
+ zf.get_output_stream(e) { |os| os.write 'foo' }
598
+ end
520
599
  entryNames = entries.map { |e| e.to_s }
521
- }
522
- ::Zip::File.open(TEST_ZIP.zip_name) {
523
- |zf|
600
+ end
601
+ ::Zip::File.open(TEST_ZIP.zip_name) do |zf|
524
602
  assert_equal(entryNames, zf.entries.map { |e| e.to_s })
525
- }
603
+ end
526
604
  end
527
605
 
528
606
  def test_streaming
529
- fname = ::File.join(::File.expand_path(::File.dirname(__FILE__)), "../README.md")
530
- zname = "test/data/generated/README.zip"
607
+ fname = ::File.join(::File.expand_path(::File.dirname(__FILE__)), '../README.md')
608
+ zname = 'test/data/generated/README.zip'
531
609
  Zip::File.open(zname, Zip::File::CREATE) do |zipfile|
532
610
  zipfile.get_output_stream(File.basename(fname)) do |f|
533
611
  f.puts File.read(fname)
@@ -547,13 +625,42 @@ class ZipFileTest < MiniTest::Test
547
625
  assert data =~ /Simonov/
548
626
  end
549
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
+
550
656
  private
657
+
551
658
  def assert_contains(zf, entryName, filename = entryName)
552
659
  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)
660
+ assert_entry_contents(zf, entryName, filename) if File.exist?(filename)
554
661
  end
555
662
 
556
663
  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}")
664
+ assert(zf.entries.detect { |e| e.name == entryName }.nil?, "entry #{entryName} in #{zf.entries.join(', ')} in zip file #{zf}")
558
665
  end
559
666
  end