rubyzip 1.0.0 → 1.2.0

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 (107) hide show
  1. checksums.yaml +6 -14
  2. data/README.md +173 -42
  3. data/Rakefile +10 -5
  4. data/TODO +0 -1
  5. data/lib/zip/central_directory.rb +55 -24
  6. data/lib/zip/compressor.rb +0 -0
  7. data/lib/zip/constants.rb +4 -2
  8. data/lib/zip/crypto/encryption.rb +11 -0
  9. data/lib/zip/crypto/null_encryption.rb +45 -0
  10. data/lib/zip/crypto/traditional_encryption.rb +99 -0
  11. data/lib/zip/decompressor.rb +2 -2
  12. data/lib/zip/deflater.rb +11 -6
  13. data/lib/zip/dos_time.rb +4 -5
  14. data/lib/zip/entry.rb +159 -97
  15. data/lib/zip/entry_set.rb +18 -18
  16. data/lib/zip/errors.rb +15 -6
  17. data/lib/zip/extra_field/generic.rb +8 -8
  18. data/lib/zip/extra_field/ntfs.rb +90 -0
  19. data/lib/zip/extra_field/old_unix.rb +44 -0
  20. data/lib/zip/extra_field/universal_time.rb +14 -14
  21. data/lib/zip/extra_field/unix.rb +8 -9
  22. data/lib/zip/extra_field/zip64.rb +44 -6
  23. data/lib/zip/extra_field/zip64_placeholder.rb +16 -0
  24. data/lib/zip/extra_field.rb +20 -8
  25. data/lib/zip/file.rb +126 -114
  26. data/lib/zip/filesystem.rb +140 -139
  27. data/lib/zip/inflater.rb +10 -9
  28. data/lib/zip/input_stream.rb +105 -80
  29. data/lib/zip/ioextras/abstract_input_stream.rb +15 -12
  30. data/lib/zip/ioextras/abstract_output_stream.rb +0 -2
  31. data/lib/zip/ioextras.rb +1 -3
  32. data/lib/zip/null_compressor.rb +2 -2
  33. data/lib/zip/null_decompressor.rb +4 -4
  34. data/lib/zip/null_input_stream.rb +2 -1
  35. data/lib/zip/output_stream.rb +57 -43
  36. data/lib/zip/pass_thru_compressor.rb +4 -4
  37. data/lib/zip/pass_thru_decompressor.rb +4 -5
  38. data/lib/zip/streamable_directory.rb +2 -2
  39. data/lib/zip/streamable_stream.rb +22 -13
  40. data/lib/zip/version.rb +1 -1
  41. data/lib/zip.rb +11 -2
  42. data/samples/example.rb +30 -40
  43. data/samples/example_filesystem.rb +16 -18
  44. data/samples/example_recursive.rb +35 -27
  45. data/samples/{gtkRubyzip.rb → gtk_ruby_zip.rb} +25 -27
  46. data/samples/qtzip.rb +19 -28
  47. data/samples/write_simple.rb +12 -13
  48. data/samples/zipfind.rb +29 -37
  49. data/test/basic_zip_file_test.rb +60 -0
  50. data/test/case_sensitivity_test.rb +69 -0
  51. data/test/central_directory_entry_test.rb +69 -0
  52. data/test/central_directory_test.rb +100 -0
  53. data/test/crypto/null_encryption_test.rb +53 -0
  54. data/test/crypto/traditional_encryption_test.rb +80 -0
  55. data/test/data/WarnInvalidDate.zip +0 -0
  56. data/test/data/file1.txt +46 -0
  57. data/test/data/file1.txt.deflatedData +0 -0
  58. data/test/data/file2.txt +1504 -0
  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 +1 -0
  64. data/test/data/notzippedruby.rb +7 -0
  65. data/test/data/ntfs.zip +0 -0
  66. data/test/data/oddExtraField.zip +0 -0
  67. data/test/data/rubycode.zip +0 -0
  68. data/test/data/rubycode2.zip +0 -0
  69. data/test/data/test.xls +0 -0
  70. data/test/data/testDirectory.bin +0 -0
  71. data/test/data/zip64-sample.zip +0 -0
  72. data/test/data/zipWithDirs.zip +0 -0
  73. data/test/data/zipWithEncryption.zip +0 -0
  74. data/test/deflater_test.rb +65 -0
  75. data/test/encryption_test.rb +42 -0
  76. data/test/entry_set_test.rb +152 -0
  77. data/test/entry_test.rb +163 -0
  78. data/test/errors_test.rb +34 -0
  79. data/test/extra_field_test.rb +76 -0
  80. data/test/file_extract_directory_test.rb +54 -0
  81. data/test/file_extract_test.rb +83 -0
  82. data/test/file_permissions_test.rb +69 -0
  83. data/test/file_split_test.rb +57 -0
  84. data/test/file_test.rb +563 -0
  85. data/test/filesystem/dir_iterator_test.rb +58 -0
  86. data/test/filesystem/directory_test.rb +121 -0
  87. data/test/filesystem/file_mutating_test.rb +88 -0
  88. data/test/filesystem/file_nonmutating_test.rb +508 -0
  89. data/test/filesystem/file_stat_test.rb +64 -0
  90. data/test/gentestfiles.rb +122 -0
  91. data/test/inflater_test.rb +14 -0
  92. data/test/input_stream_test.rb +182 -0
  93. data/test/ioextras/abstract_input_stream_test.rb +102 -0
  94. data/test/ioextras/abstract_output_stream_test.rb +106 -0
  95. data/test/ioextras/fake_io_test.rb +18 -0
  96. data/test/local_entry_test.rb +154 -0
  97. data/test/output_stream_test.rb +128 -0
  98. data/test/pass_thru_compressor_test.rb +30 -0
  99. data/test/pass_thru_decompressor_test.rb +14 -0
  100. data/test/samples/example_recursive_test.rb +37 -0
  101. data/test/settings_test.rb +95 -0
  102. data/test/test_helper.rb +221 -0
  103. data/test/unicode_file_names_and_comments_test.rb +50 -0
  104. data/test/zip64_full_test.rb +51 -0
  105. data/test/zip64_support_test.rb +14 -0
  106. metadata +198 -22
  107. data/NEWS +0 -182
@@ -0,0 +1,508 @@
1
+ require 'test_helper'
2
+ require 'zip/filesystem'
3
+
4
+ class ZipFsFileNonmutatingTest < MiniTest::Test
5
+ def setup
6
+ @zipsha = Digest::SHA1.file('test/data/zipWithDirs.zip')
7
+ @zip_file = ::Zip::File.new('test/data/zipWithDirs.zip')
8
+ end
9
+
10
+ def teardown
11
+ @zip_file.close if @zip_file
12
+ assert_equal(@zipsha, Digest::SHA1.file('test/data/zipWithDirs.zip'))
13
+ end
14
+
15
+ def test_umask
16
+ assert_equal(::File.umask, @zip_file.file.umask)
17
+ @zip_file.file.umask(0006)
18
+ end
19
+
20
+ def test_exists?
21
+ assert(! @zip_file.file.exists?('notAFile'))
22
+ assert(@zip_file.file.exists?('file1'))
23
+ assert(@zip_file.file.exists?('dir1'))
24
+ assert(@zip_file.file.exists?('dir1/'))
25
+ assert(@zip_file.file.exists?('dir1/file12'))
26
+ assert(@zip_file.file.exist?('dir1/file12')) # notice, tests exist? alias of exists? !
27
+
28
+ @zip_file.dir.chdir 'dir1/'
29
+ assert(!@zip_file.file.exists?('file1'))
30
+ assert(@zip_file.file.exists?('file12'))
31
+ end
32
+
33
+ def test_open_read
34
+ blockCalled = false
35
+ @zip_file.file.open('file1', 'r') do |f|
36
+ blockCalled = true
37
+ assert_equal("this is the entry 'file1' in my test archive!",
38
+ f.readline.chomp)
39
+ end
40
+ assert(blockCalled)
41
+
42
+ blockCalled = false
43
+ @zip_file.file.open('file1', 'rb') do |f| # test binary flag is ignored
44
+ blockCalled = true
45
+ assert_equal("this is the entry 'file1' in my test archive!",
46
+ f.readline.chomp)
47
+ end
48
+ assert(blockCalled)
49
+
50
+ blockCalled = false
51
+ @zip_file.dir.chdir 'dir2'
52
+ @zip_file.file.open('file21', 'r') do |f|
53
+ blockCalled = true
54
+ assert_equal("this is the entry 'dir2/file21' in my test archive!",
55
+ f.readline.chomp)
56
+ end
57
+ assert(blockCalled)
58
+ @zip_file.dir.chdir '/'
59
+
60
+ assert_raises(Errno::ENOENT) do
61
+ @zip_file.file.open('noSuchEntry')
62
+ end
63
+
64
+ begin
65
+ is = @zip_file.file.open('file1')
66
+ assert_equal("this is the entry 'file1' in my test archive!",
67
+ is.readline.chomp)
68
+ ensure
69
+ is.close if is
70
+ end
71
+ end
72
+
73
+ def test_new
74
+ begin
75
+ is = @zip_file.file.new('file1')
76
+ assert_equal("this is the entry 'file1' in my test archive!",
77
+ is.readline.chomp)
78
+ ensure
79
+ is.close if is
80
+ end
81
+ begin
82
+ is = @zip_file.file.new('file1') do
83
+ fail 'should not call block'
84
+ end
85
+ ensure
86
+ is.close if is
87
+ end
88
+ end
89
+
90
+ def test_symlink
91
+ assert_raises(NotImplementedError) do
92
+ @zip_file.file.symlink('file1', 'aSymlink')
93
+ end
94
+ end
95
+
96
+ def test_size
97
+ assert_raises(Errno::ENOENT) { @zip_file.file.size('notAFile') }
98
+ assert_equal(72, @zip_file.file.size('file1'))
99
+ assert_equal(0, @zip_file.file.size('dir2/dir21'))
100
+
101
+ assert_equal(72, @zip_file.file.stat('file1').size)
102
+ assert_equal(0, @zip_file.file.stat('dir2/dir21').size)
103
+ end
104
+
105
+ def test_size?
106
+ assert_equal(nil, @zip_file.file.size?('notAFile'))
107
+ assert_equal(72, @zip_file.file.size?('file1'))
108
+ assert_equal(nil, @zip_file.file.size?('dir2/dir21'))
109
+
110
+ assert_equal(72, @zip_file.file.stat('file1').size?)
111
+ assert_equal(nil, @zip_file.file.stat('dir2/dir21').size?)
112
+ end
113
+
114
+ def test_file?
115
+ assert(@zip_file.file.file?('file1'))
116
+ assert(@zip_file.file.file?('dir2/file21'))
117
+ assert(! @zip_file.file.file?('dir1'))
118
+ assert(! @zip_file.file.file?('dir1/dir11'))
119
+
120
+ assert(@zip_file.file.stat('file1').file?)
121
+ assert(@zip_file.file.stat('dir2/file21').file?)
122
+ assert(! @zip_file.file.stat('dir1').file?)
123
+ assert(! @zip_file.file.stat('dir1/dir11').file?)
124
+ end
125
+
126
+ include ExtraAssertions
127
+
128
+ def test_dirname
129
+ assert_forwarded(File, :dirname, 'retVal', 'a/b/c/d') do
130
+ @zip_file.file.dirname('a/b/c/d')
131
+ end
132
+ end
133
+
134
+ def test_basename
135
+ assert_forwarded(File, :basename, 'retVal', 'a/b/c/d') do
136
+ @zip_file.file.basename('a/b/c/d')
137
+ end
138
+ end
139
+
140
+ def test_split
141
+ assert_forwarded(File, :split, 'retVal', 'a/b/c/d') do
142
+ @zip_file.file.split('a/b/c/d')
143
+ end
144
+ end
145
+
146
+ def test_join
147
+ assert_equal('a/b/c', @zip_file.file.join('a/b', 'c'))
148
+ assert_equal('a/b/c/d', @zip_file.file.join('a/b', 'c/d'))
149
+ assert_equal('/c/d', @zip_file.file.join('', 'c/d'))
150
+ assert_equal('a/b/c/d', @zip_file.file.join('a', 'b', 'c', 'd'))
151
+ end
152
+
153
+ def test_utime
154
+ t_now = ::Zip::DOSTime.now
155
+ t_bak = @zip_file.file.mtime('file1')
156
+ @zip_file.file.utime(t_now, 'file1')
157
+ assert_equal(t_now, @zip_file.file.mtime('file1'))
158
+ @zip_file.file.utime(t_bak, 'file1')
159
+ assert_equal(t_bak, @zip_file.file.mtime('file1'))
160
+ end
161
+
162
+ def assert_always_false(operation)
163
+ assert(! @zip_file.file.send(operation, 'noSuchFile'))
164
+ assert(! @zip_file.file.send(operation, 'file1'))
165
+ assert(! @zip_file.file.send(operation, 'dir1'))
166
+ assert(! @zip_file.file.stat('file1').send(operation))
167
+ assert(! @zip_file.file.stat('dir1').send(operation))
168
+ end
169
+
170
+ def assert_true_if_entry_exists(operation)
171
+ assert(! @zip_file.file.send(operation, 'noSuchFile'))
172
+ assert(@zip_file.file.send(operation, 'file1'))
173
+ assert(@zip_file.file.send(operation, 'dir1'))
174
+ assert(@zip_file.file.stat('file1').send(operation))
175
+ assert(@zip_file.file.stat('dir1').send(operation))
176
+ end
177
+
178
+ def test_pipe?
179
+ assert_always_false(:pipe?)
180
+ end
181
+
182
+ def test_blockdev?
183
+ assert_always_false(:blockdev?)
184
+ end
185
+
186
+ def test_symlink?
187
+ assert_always_false(:symlink?)
188
+ end
189
+
190
+ def test_socket?
191
+ assert_always_false(:socket?)
192
+ end
193
+
194
+ def test_chardev?
195
+ assert_always_false(:chardev?)
196
+ end
197
+
198
+ def test_truncate
199
+ assert_raises(StandardError, 'truncate not supported') do
200
+ @zip_file.file.truncate('file1', 100)
201
+ end
202
+ end
203
+
204
+ def assert_e_n_o_e_n_t(operation, args = ['NoSuchFile'])
205
+ assert_raises(Errno::ENOENT) do
206
+ @zip_file.file.send(operation, *args)
207
+ end
208
+ end
209
+
210
+ def test_ftype
211
+ assert_e_n_o_e_n_t(:ftype)
212
+ assert_equal('file', @zip_file.file.ftype('file1'))
213
+ assert_equal('directory', @zip_file.file.ftype('dir1/dir11'))
214
+ assert_equal('directory', @zip_file.file.ftype('dir1/dir11/'))
215
+ end
216
+
217
+ def test_link
218
+ assert_raises(NotImplementedError) do
219
+ @zip_file.file.link('file1', 'someOtherString')
220
+ end
221
+ end
222
+
223
+ def test_directory?
224
+ assert(! @zip_file.file.directory?('notAFile'))
225
+ assert(! @zip_file.file.directory?('file1'))
226
+ assert(! @zip_file.file.directory?('dir1/file11'))
227
+ assert(@zip_file.file.directory?('dir1'))
228
+ assert(@zip_file.file.directory?('dir1/'))
229
+ assert(@zip_file.file.directory?('dir2/dir21'))
230
+
231
+ assert(! @zip_file.file.stat('file1').directory?)
232
+ assert(! @zip_file.file.stat('dir1/file11').directory?)
233
+ assert(@zip_file.file.stat('dir1').directory?)
234
+ assert(@zip_file.file.stat('dir1/').directory?)
235
+ assert(@zip_file.file.stat('dir2/dir21').directory?)
236
+ end
237
+
238
+ def test_chown
239
+ assert_equal(2, @zip_file.file.chown(1, 2, 'dir1', 'file1'))
240
+ assert_equal(1, @zip_file.file.stat('dir1').uid)
241
+ assert_equal(2, @zip_file.file.stat('dir1').gid)
242
+ assert_equal(2, @zip_file.file.chown(nil, nil, 'dir1', 'file1'))
243
+ end
244
+
245
+ def test_zero?
246
+ assert(! @zip_file.file.zero?('notAFile'))
247
+ assert(! @zip_file.file.zero?('file1'))
248
+ assert(@zip_file.file.zero?('dir1'))
249
+ blockCalled = false
250
+ ::Zip::File.open('test/data/generated/5entry.zip') do |zf|
251
+ blockCalled = true
252
+ assert(zf.file.zero?('test/data/generated/empty.txt'))
253
+ end
254
+ assert(blockCalled)
255
+
256
+ assert(! @zip_file.file.stat('file1').zero?)
257
+ assert(@zip_file.file.stat('dir1').zero?)
258
+ blockCalled = false
259
+ ::Zip::File.open('test/data/generated/5entry.zip') do |zf|
260
+ blockCalled = true
261
+ assert(zf.file.stat('test/data/generated/empty.txt').zero?)
262
+ end
263
+ assert(blockCalled)
264
+ end
265
+
266
+ def test_expand_path
267
+ ::Zip::File.open('test/data/zipWithDirs.zip') do |zf|
268
+ assert_equal('/', zf.file.expand_path('.'))
269
+ zf.dir.chdir 'dir1'
270
+ assert_equal('/dir1', zf.file.expand_path('.'))
271
+ assert_equal('/dir1/file12', zf.file.expand_path('file12'))
272
+ assert_equal('/', zf.file.expand_path('..'))
273
+ assert_equal('/dir2/dir21', zf.file.expand_path('../dir2/dir21'))
274
+ end
275
+ end
276
+
277
+ def test_mtime
278
+ assert_equal(::Zip::DOSTime.at(1_027_694_306),
279
+ @zip_file.file.mtime('dir2/file21'))
280
+ assert_equal(::Zip::DOSTime.at(1_027_690_863),
281
+ @zip_file.file.mtime('dir2/dir21'))
282
+ assert_raises(Errno::ENOENT) do
283
+ @zip_file.file.mtime('noSuchEntry')
284
+ end
285
+
286
+ assert_equal(::Zip::DOSTime.at(1_027_694_306),
287
+ @zip_file.file.stat('dir2/file21').mtime)
288
+ assert_equal(::Zip::DOSTime.at(1_027_690_863),
289
+ @zip_file.file.stat('dir2/dir21').mtime)
290
+ end
291
+
292
+ def test_ctime
293
+ assert_nil(@zip_file.file.ctime('file1'))
294
+ assert_nil(@zip_file.file.stat('file1').ctime)
295
+ end
296
+
297
+ def test_atime
298
+ assert_nil(@zip_file.file.atime('file1'))
299
+ assert_nil(@zip_file.file.stat('file1').atime)
300
+ end
301
+
302
+ def test_ntfs_time
303
+ ::Zip::File.open('test/data/ntfs.zip') do |zf|
304
+ t = ::Zip::DOSTime.at(1_410_496_497.405178)
305
+ assert_equal(zf.file.mtime('data.txt'), t)
306
+ assert_equal(zf.file.atime('data.txt'), t)
307
+ assert_equal(zf.file.ctime('data.txt'), t)
308
+ end
309
+ end
310
+
311
+ def test_readable?
312
+ assert(! @zip_file.file.readable?('noSuchFile'))
313
+ assert(@zip_file.file.readable?('file1'))
314
+ assert(@zip_file.file.readable?('dir1'))
315
+ assert(@zip_file.file.stat('file1').readable?)
316
+ assert(@zip_file.file.stat('dir1').readable?)
317
+ end
318
+
319
+ def test_readable_real?
320
+ assert(! @zip_file.file.readable_real?('noSuchFile'))
321
+ assert(@zip_file.file.readable_real?('file1'))
322
+ assert(@zip_file.file.readable_real?('dir1'))
323
+ assert(@zip_file.file.stat('file1').readable_real?)
324
+ assert(@zip_file.file.stat('dir1').readable_real?)
325
+ end
326
+
327
+ def test_writable?
328
+ assert(! @zip_file.file.writable?('noSuchFile'))
329
+ assert(@zip_file.file.writable?('file1'))
330
+ assert(@zip_file.file.writable?('dir1'))
331
+ assert(@zip_file.file.stat('file1').writable?)
332
+ assert(@zip_file.file.stat('dir1').writable?)
333
+ end
334
+
335
+ def test_writable_real?
336
+ assert(! @zip_file.file.writable_real?('noSuchFile'))
337
+ assert(@zip_file.file.writable_real?('file1'))
338
+ assert(@zip_file.file.writable_real?('dir1'))
339
+ assert(@zip_file.file.stat('file1').writable_real?)
340
+ assert(@zip_file.file.stat('dir1').writable_real?)
341
+ end
342
+
343
+ def test_executable?
344
+ assert(! @zip_file.file.executable?('noSuchFile'))
345
+ assert(! @zip_file.file.executable?('file1'))
346
+ assert(@zip_file.file.executable?('dir1'))
347
+ assert(! @zip_file.file.stat('file1').executable?)
348
+ assert(@zip_file.file.stat('dir1').executable?)
349
+ end
350
+
351
+ def test_executable_real?
352
+ assert(! @zip_file.file.executable_real?('noSuchFile'))
353
+ assert(! @zip_file.file.executable_real?('file1'))
354
+ assert(@zip_file.file.executable_real?('dir1'))
355
+ assert(! @zip_file.file.stat('file1').executable_real?)
356
+ assert(@zip_file.file.stat('dir1').executable_real?)
357
+ end
358
+
359
+ def test_owned?
360
+ assert_true_if_entry_exists(:owned?)
361
+ end
362
+
363
+ def test_grpowned?
364
+ assert_true_if_entry_exists(:grpowned?)
365
+ end
366
+
367
+ def test_setgid?
368
+ assert_always_false(:setgid?)
369
+ end
370
+
371
+ def test_setuid?
372
+ assert_always_false(:setgid?)
373
+ end
374
+
375
+ def test_sticky?
376
+ assert_always_false(:sticky?)
377
+ end
378
+
379
+ def test_readlink
380
+ assert_raises(NotImplementedError) do
381
+ @zip_file.file.readlink('someString')
382
+ end
383
+ end
384
+
385
+ def test_stat
386
+ s = @zip_file.file.stat('file1')
387
+ assert(s.kind_of?(File::Stat)) # It pretends
388
+ assert_raises(Errno::ENOENT, 'No such file or directory - noSuchFile') do
389
+ @zip_file.file.stat('noSuchFile')
390
+ end
391
+ end
392
+
393
+ def test_lstat
394
+ assert(@zip_file.file.lstat('file1').file?)
395
+ end
396
+
397
+ def test_pipe
398
+ assert_raises(NotImplementedError) do
399
+ @zip_file.file.pipe
400
+ end
401
+ end
402
+
403
+ def test_foreach
404
+ ::Zip::File.open('test/data/generated/zipWithDir.zip') do |zf|
405
+ ref = []
406
+ File.foreach('test/data/file1.txt') { |e| ref << e }
407
+ index = 0
408
+
409
+ zf.file.foreach('test/data/file1.txt') do |l|
410
+ # Ruby replaces \n with \r\n automatically on windows
411
+ newline = Zip::RUNNING_ON_WINDOWS ? l.gsub(/\r\n/, "\n") : l
412
+ assert_equal(ref[index], newline)
413
+ index = index.next
414
+ end
415
+ assert_equal(ref.size, index)
416
+ end
417
+
418
+ ::Zip::File.open('test/data/generated/zipWithDir.zip') do |zf|
419
+ ref = []
420
+ File.foreach('test/data/file1.txt', ' ') { |e| ref << e }
421
+ index = 0
422
+
423
+ zf.file.foreach('test/data/file1.txt', ' ') do |l|
424
+ # Ruby replaces \n with \r\n automatically on windows
425
+ newline = Zip::RUNNING_ON_WINDOWS ? l.gsub(/\r\n/, "\n") : l
426
+ assert_equal(ref[index], newline)
427
+ index = index.next
428
+ end
429
+ assert_equal(ref.size, index)
430
+ end
431
+ end
432
+
433
+ def test_glob
434
+ ::Zip::File.open('test/data/globTest.zip') do |zf|
435
+ {
436
+ 'globTest/foo.txt' => ['globTest/foo.txt'],
437
+ '*/foo.txt' => ['globTest/foo.txt'],
438
+ '**/foo.txt' => ['globTest/foo.txt', 'globTest/foo/bar/baz/foo.txt'],
439
+ '*/foo/**/*.txt' => ['globTest/foo/bar/baz/foo.txt']
440
+ }.each do |spec, expected_results|
441
+ results = zf.glob(spec)
442
+ assert results.all? { |entry| entry.is_a? ::Zip::Entry }
443
+
444
+ result_strings = results.map(&:to_s)
445
+ missing_matches = expected_results - result_strings
446
+ extra_matches = result_strings - expected_results
447
+
448
+ assert extra_matches.empty?, "spec #{spec.inspect} has extra results #{extra_matches.inspect}"
449
+ assert missing_matches.empty?, "spec #{spec.inspect} missing results #{missing_matches.inspect}"
450
+ end
451
+ end
452
+
453
+ ::Zip::File.open('test/data/globTest.zip') do |zf|
454
+ results = []
455
+ zf.glob('**/foo.txt') do |match|
456
+ results << "<#{match.class.name}: #{match}>"
457
+ end
458
+ assert((!results.empty?), 'block not run, or run out of context')
459
+ assert_equal 2, results.size
460
+ assert_operator results, :include?, '<Zip::Entry: globTest/foo.txt>'
461
+ assert_operator results, :include?, '<Zip::Entry: globTest/foo/bar/baz/foo.txt>'
462
+ end
463
+ end
464
+
465
+ def test_popen
466
+ if Zip::RUNNING_ON_WINDOWS
467
+ # This is pretty much projectile vomit but it allows the test to be
468
+ # run on windows also
469
+ system_dir = ::File.popen('dir') { |f| f.read }.gsub(/Dir\(s\).*$/, '')
470
+ zipfile_dir = @zip_file.file.popen('dir') { |f| f.read }.gsub(/Dir\(s\).*$/, '')
471
+ assert_equal(system_dir, zipfile_dir)
472
+ else
473
+ assert_equal(::File.popen('ls') { |f| f.read },
474
+ @zip_file.file.popen('ls') { |f| f.read })
475
+ end
476
+ end
477
+
478
+ # Can be added later
479
+ # def test_select
480
+ # fail "implement test"
481
+ # end
482
+
483
+ def test_readlines
484
+ ::Zip::File.open('test/data/generated/zipWithDir.zip') do |zf|
485
+ orig_file = ::File.readlines('test/data/file1.txt')
486
+ zip_file = zf.file.readlines('test/data/file1.txt')
487
+
488
+ # Ruby replaces \n with \r\n automatically on windows
489
+ zip_file.each { |l| l.gsub!(/\r\n/, "\n") } if Zip::RUNNING_ON_WINDOWS
490
+
491
+ assert_equal(orig_file, zip_file)
492
+ end
493
+ end
494
+
495
+ def test_read
496
+ ::Zip::File.open('test/data/generated/zipWithDir.zip') do |zf|
497
+ orig_file = ::File.read('test/data/file1.txt')
498
+
499
+ # Ruby replaces \n with \r\n automatically on windows
500
+ zip_file = if Zip::RUNNING_ON_WINDOWS
501
+ zf.file.read('test/data/file1.txt').gsub(/\r\n/, "\n")
502
+ else
503
+ zf.file.read('test/data/file1.txt')
504
+ end
505
+ assert_equal(orig_file, zip_file)
506
+ end
507
+ end
508
+ end
@@ -0,0 +1,64 @@
1
+ require 'test_helper'
2
+ require 'zip/filesystem'
3
+
4
+ class ZipFsFileStatTest < MiniTest::Test
5
+ def setup
6
+ @zip_file = ::Zip::File.new('test/data/zipWithDirs.zip')
7
+ end
8
+
9
+ def teardown
10
+ @zip_file.close if @zip_file
11
+ end
12
+
13
+ def test_blocks
14
+ assert_equal(nil, @zip_file.file.stat('file1').blocks)
15
+ end
16
+
17
+ def test_ino
18
+ assert_equal(0, @zip_file.file.stat('file1').ino)
19
+ end
20
+
21
+ def test_uid
22
+ assert_equal(0, @zip_file.file.stat('file1').uid)
23
+ end
24
+
25
+ def test_gid
26
+ assert_equal(0, @zip_file.file.stat('file1').gid)
27
+ end
28
+
29
+ def test_ftype
30
+ assert_equal('file', @zip_file.file.stat('file1').ftype)
31
+ assert_equal('directory', @zip_file.file.stat('dir1').ftype)
32
+ end
33
+
34
+ def test_mode
35
+ assert_equal(0600, @zip_file.file.stat('file1').mode & 0777)
36
+ assert_equal(0600, @zip_file.file.stat('file1').mode & 0777)
37
+ assert_equal(0755, @zip_file.file.stat('dir1').mode & 0777)
38
+ assert_equal(0755, @zip_file.file.stat('dir1').mode & 0777)
39
+ end
40
+
41
+ def test_dev
42
+ assert_equal(0, @zip_file.file.stat('file1').dev)
43
+ end
44
+
45
+ def test_rdev
46
+ assert_equal(0, @zip_file.file.stat('file1').rdev)
47
+ end
48
+
49
+ def test_rdev_major
50
+ assert_equal(0, @zip_file.file.stat('file1').rdev_major)
51
+ end
52
+
53
+ def test_rdev_minor
54
+ assert_equal(0, @zip_file.file.stat('file1').rdev_minor)
55
+ end
56
+
57
+ def test_nlink
58
+ assert_equal(1, @zip_file.file.stat('file1').nlink)
59
+ end
60
+
61
+ def test_blksize
62
+ assert_nil(@zip_file.file.stat('file1').blksize)
63
+ end
64
+ end
@@ -0,0 +1,122 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $VERBOSE = true
4
+
5
+ class TestFiles
6
+ RANDOM_ASCII_FILE1 = 'test/data/generated/randomAscii1.txt'
7
+ RANDOM_ASCII_FILE2 = 'test/data/generated/randomAscii2.txt'
8
+ RANDOM_ASCII_FILE3 = 'test/data/generated/randomAscii3.txt'
9
+ RANDOM_BINARY_FILE1 = 'test/data/generated/randomBinary1.bin'
10
+ RANDOM_BINARY_FILE2 = 'test/data/generated/randomBinary2.bin'
11
+
12
+ EMPTY_TEST_DIR = 'test/data/generated/emptytestdir'
13
+
14
+ ASCII_TEST_FILES = [RANDOM_ASCII_FILE1, RANDOM_ASCII_FILE2, RANDOM_ASCII_FILE3]
15
+ BINARY_TEST_FILES = [RANDOM_BINARY_FILE1, RANDOM_BINARY_FILE2]
16
+ TEST_DIRECTORIES = [EMPTY_TEST_DIR]
17
+ TEST_FILES = [ASCII_TEST_FILES, BINARY_TEST_FILES, EMPTY_TEST_DIR].flatten!
18
+
19
+ class << self
20
+ def create_test_files
21
+ Dir.mkdir 'test/data/generated' unless Dir.exist?('test/data/generated')
22
+
23
+ ASCII_TEST_FILES.each_with_index do |filename, index|
24
+ create_random_ascii(filename, 1E4 * (index + 1))
25
+ end
26
+
27
+ BINARY_TEST_FILES.each_with_index do |filename, index|
28
+ create_random_binary(filename, 1E4 * (index + 1))
29
+ end
30
+
31
+ ensure_dir(EMPTY_TEST_DIR)
32
+ end
33
+
34
+ private
35
+
36
+ def create_random_ascii(filename, size)
37
+ File.open(filename, 'wb') do |file|
38
+ file << rand while file.tell < size
39
+ end
40
+ end
41
+
42
+ def create_random_binary(filename, size)
43
+ File.open(filename, 'wb') do |file|
44
+ file << [rand].pack('V') while file.tell < size
45
+ end
46
+ end
47
+
48
+ def ensure_dir(name)
49
+ if File.exist?(name)
50
+ return if File.stat(name).directory?
51
+ File.delete(name)
52
+ end
53
+ Dir.mkdir(name)
54
+ end
55
+ end
56
+ end
57
+
58
+ # For representation and creation of
59
+ # test data
60
+ class TestZipFile
61
+ attr_accessor :zip_name, :entry_names, :comment
62
+
63
+ def initialize(zip_name, entry_names, comment = '')
64
+ @zip_name = zip_name
65
+ @entry_names = entry_names
66
+ @comment = comment
67
+ end
68
+
69
+ def self.create_test_zips
70
+ raise "failed to create test zip '#{TEST_ZIP1.zip_name}'" unless system("/usr/bin/zip #{TEST_ZIP1.zip_name} test/data/file2.txt")
71
+ raise "failed to remove entry from '#{TEST_ZIP1.zip_name}'" unless system("/usr/bin/zip #{TEST_ZIP1.zip_name} -d test/data/file2.txt")
72
+
73
+ File.open('test/data/generated/empty.txt', 'w') {}
74
+ File.open('test/data/generated/empty_chmod640.txt', 'w') {}
75
+ ::File.chmod(0640, 'test/data/generated/empty_chmod640.txt')
76
+
77
+ File.open('test/data/generated/short.txt', 'w') { |file| file << 'ABCDEF' }
78
+ ziptestTxt = ''
79
+ File.open('test/data/file2.txt') { |file| ziptestTxt = file.read }
80
+ File.open('test/data/generated/longAscii.txt', 'w') do |file|
81
+ file << ziptestTxt while file.tell < 1E5
82
+ end
83
+
84
+ testBinaryPattern = ''
85
+ File.open('test/data/generated/empty.zip') { |file| testBinaryPattern = file.read }
86
+ testBinaryPattern *= 4
87
+
88
+ File.open('test/data/generated/longBinary.bin', 'wb') do |file|
89
+ file << testBinaryPattern << rand << "\0" while file.tell < 6E5
90
+ end
91
+
92
+ raise "failed to create test zip '#{TEST_ZIP2.zip_name}'" unless system("/usr/bin/zip #{TEST_ZIP2.zip_name} #{TEST_ZIP2.entry_names.join(' ')}")
93
+
94
+ if RUBY_PLATFORM =~ /mswin|mingw|cygwin/
95
+ raise "failed to add comment to test zip '#{TEST_ZIP2.zip_name}'" unless system("echo #{TEST_ZIP2.comment}| /usr/bin/zip -z #{TEST_ZIP2.zip_name}\"")
96
+ else
97
+ # without bash system interprets everything after echo as parameters to
98
+ # echo including | zip -z ...
99
+ raise "failed to add comment to test zip '#{TEST_ZIP2.zip_name}'" unless system("bash -c \"echo #{TEST_ZIP2.comment} | /usr/bin/zip -z #{TEST_ZIP2.zip_name}\"")
100
+ end
101
+
102
+ raise "failed to create test zip '#{TEST_ZIP3.zip_name}'" unless system("/usr/bin/zip #{TEST_ZIP3.zip_name} #{TEST_ZIP3.entry_names.join(' ')}")
103
+
104
+ raise "failed to create test zip '#{TEST_ZIP4.zip_name}'" unless system("/usr/bin/zip #{TEST_ZIP4.zip_name} #{TEST_ZIP4.entry_names.join(' ')}")
105
+ rescue
106
+ # If there are any Windows developers wanting to use a command line zip.exe
107
+ # to help create the following files, there's a free one available from
108
+ # http://stahlworks.com/dev/index.php?tool=zipunzip
109
+ # that works with the above code
110
+ raise $!.to_s +
111
+ "\n\nziptest.rb requires the Info-ZIP program 'zip' in the path\n" \
112
+ "to create test data. If you don't have it you can download\n" \
113
+ 'the necessary test files at http://sf.net/projects/rubyzip.'
114
+ end
115
+
116
+ TEST_ZIP1 = TestZipFile.new('test/data/generated/empty.zip', [])
117
+ TEST_ZIP2 = TestZipFile.new('test/data/generated/5entry.zip', %w(test/data/generated/longAscii.txt test/data/generated/empty.txt test/data/generated/empty_chmod640.txt test/data/generated/short.txt test/data/generated/longBinary.bin),
118
+ 'my zip comment')
119
+ TEST_ZIP3 = TestZipFile.new('test/data/generated/test1.zip', %w(test/data/file1.txt))
120
+ TEST_ZIP4 = TestZipFile.new('test/data/generated/zipWithDir.zip', ['test/data/file1.txt',
121
+ TestFiles::EMPTY_TEST_DIR])
122
+ end