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
@@ -1,508 +0,0 @@
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(0o006)
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_nil(@zip_file.file.size?('notAFile'))
107
- assert_equal(72, @zip_file.file.size?('file1'))
108
- assert_nil(@zip_file.file.size?('dir2/dir21'))
109
-
110
- assert_equal(72, @zip_file.file.stat('file1').size?)
111
- assert_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
@@ -1,64 +0,0 @@
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_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(0o600, @zip_file.file.stat('file1').mode & 0o777)
36
- assert_equal(0o600, @zip_file.file.stat('file1').mode & 0o777)
37
- assert_equal(0o755, @zip_file.file.stat('dir1').mode & 0o777)
38
- assert_equal(0o755, @zip_file.file.stat('dir1').mode & 0o777)
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
data/test/gentestfiles.rb DELETED
@@ -1,126 +0,0 @@
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
- NULL_FILE = 'test/data/generated/null.zip' # Zero length, so not a zip file.
13
-
14
- EMPTY_TEST_DIR = 'test/data/generated/emptytestdir'
15
-
16
- ASCII_TEST_FILES = [RANDOM_ASCII_FILE1, RANDOM_ASCII_FILE2, RANDOM_ASCII_FILE3]
17
- BINARY_TEST_FILES = [RANDOM_BINARY_FILE1, RANDOM_BINARY_FILE2]
18
- TEST_DIRECTORIES = [EMPTY_TEST_DIR]
19
- TEST_FILES = [ASCII_TEST_FILES, BINARY_TEST_FILES, EMPTY_TEST_DIR].flatten!
20
-
21
- class << self
22
- def create_test_files
23
- Dir.mkdir 'test/data/generated' unless Dir.exist?('test/data/generated')
24
-
25
- ASCII_TEST_FILES.each_with_index do |filename, index|
26
- create_random_ascii(filename, 1E4 * (index + 1))
27
- end
28
-
29
- BINARY_TEST_FILES.each_with_index do |filename, index|
30
- create_random_binary(filename, 1E4 * (index + 1))
31
- end
32
-
33
- system("touch #{NULL_FILE}")
34
-
35
- ensure_dir(EMPTY_TEST_DIR)
36
- end
37
-
38
- private
39
-
40
- def create_random_ascii(filename, size)
41
- File.open(filename, 'wb') do |file|
42
- file << rand while file.tell < size
43
- end
44
- end
45
-
46
- def create_random_binary(filename, size)
47
- File.open(filename, 'wb') do |file|
48
- file << [rand].pack('V') while file.tell < size
49
- end
50
- end
51
-
52
- def ensure_dir(name)
53
- if File.exist?(name)
54
- return if File.stat(name).directory?
55
- File.delete(name)
56
- end
57
- Dir.mkdir(name)
58
- end
59
- end
60
- end
61
-
62
- # For representation and creation of
63
- # test data
64
- class TestZipFile
65
- attr_accessor :zip_name, :entry_names, :comment
66
-
67
- def initialize(zip_name, entry_names, comment = '')
68
- @zip_name = zip_name
69
- @entry_names = entry_names
70
- @comment = comment
71
- end
72
-
73
- def self.create_test_zips
74
- raise "failed to create test zip '#{TEST_ZIP1.zip_name}'" unless system("/usr/bin/zip -q #{TEST_ZIP1.zip_name} test/data/file2.txt")
75
- raise "failed to remove entry from '#{TEST_ZIP1.zip_name}'" unless system("/usr/bin/zip -q #{TEST_ZIP1.zip_name} -d test/data/file2.txt")
76
-
77
- File.open('test/data/generated/empty.txt', 'w') {}
78
- File.open('test/data/generated/empty_chmod640.txt', 'w') {}
79
- ::File.chmod(0o640, 'test/data/generated/empty_chmod640.txt')
80
-
81
- File.open('test/data/generated/short.txt', 'w') { |file| file << 'ABCDEF' }
82
- ziptestTxt = ''
83
- File.open('test/data/file2.txt') { |file| ziptestTxt = file.read }
84
- File.open('test/data/generated/longAscii.txt', 'w') do |file|
85
- file << ziptestTxt while file.tell < 1E5
86
- end
87
-
88
- testBinaryPattern = ''
89
- File.open('test/data/generated/empty.zip') { |file| testBinaryPattern = file.read }
90
- testBinaryPattern *= 4
91
-
92
- File.open('test/data/generated/longBinary.bin', 'wb') do |file|
93
- file << testBinaryPattern << rand << "\0" while file.tell < 6E5
94
- end
95
-
96
- raise "failed to create test zip '#{TEST_ZIP2.zip_name}'" unless system("/usr/bin/zip -q #{TEST_ZIP2.zip_name} #{TEST_ZIP2.entry_names.join(' ')}")
97
-
98
- if RUBY_PLATFORM =~ /mswin|mingw|cygwin/
99
- raise "failed to add comment to test zip '#{TEST_ZIP2.zip_name}'" unless system("echo #{TEST_ZIP2.comment}| /usr/bin/zip -zq #{TEST_ZIP2.zip_name}\"")
100
- else
101
- # without bash system interprets everything after echo as parameters to
102
- # echo including | zip -z ...
103
- raise "failed to add comment to test zip '#{TEST_ZIP2.zip_name}'" unless system("bash -c \"echo #{TEST_ZIP2.comment} | /usr/bin/zip -zq #{TEST_ZIP2.zip_name}\"")
104
- end
105
-
106
- raise "failed to create test zip '#{TEST_ZIP3.zip_name}'" unless system("/usr/bin/zip -q #{TEST_ZIP3.zip_name} #{TEST_ZIP3.entry_names.join(' ')}")
107
-
108
- raise "failed to create test zip '#{TEST_ZIP4.zip_name}'" unless system("/usr/bin/zip -q #{TEST_ZIP4.zip_name} #{TEST_ZIP4.entry_names.join(' ')}")
109
- rescue
110
- # If there are any Windows developers wanting to use a command line zip.exe
111
- # to help create the following files, there's a free one available from
112
- # http://stahlworks.com/dev/index.php?tool=zipunzip
113
- # that works with the above code
114
- raise $!.to_s +
115
- "\n\nziptest.rb requires the Info-ZIP program 'zip' in the path\n" \
116
- "to create test data. If you don't have it you can download\n" \
117
- 'the necessary test files at http://sf.net/projects/rubyzip.'
118
- end
119
-
120
- TEST_ZIP1 = TestZipFile.new('test/data/generated/empty.zip', [])
121
- 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],
122
- 'my zip comment')
123
- TEST_ZIP3 = TestZipFile.new('test/data/generated/test1.zip', %w[test/data/file1.txt])
124
- TEST_ZIP4 = TestZipFile.new('test/data/generated/zipWithDir.zip', ['test/data/file1.txt',
125
- TestFiles::EMPTY_TEST_DIR])
126
- end