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.
- checksums.yaml +6 -14
- data/README.md +173 -42
- data/Rakefile +10 -5
- data/TODO +0 -1
- data/lib/zip/central_directory.rb +55 -24
- data/lib/zip/compressor.rb +0 -0
- data/lib/zip/constants.rb +4 -2
- data/lib/zip/crypto/encryption.rb +11 -0
- data/lib/zip/crypto/null_encryption.rb +45 -0
- data/lib/zip/crypto/traditional_encryption.rb +99 -0
- data/lib/zip/decompressor.rb +2 -2
- data/lib/zip/deflater.rb +11 -6
- data/lib/zip/dos_time.rb +4 -5
- data/lib/zip/entry.rb +159 -97
- data/lib/zip/entry_set.rb +18 -18
- data/lib/zip/errors.rb +15 -6
- data/lib/zip/extra_field/generic.rb +8 -8
- data/lib/zip/extra_field/ntfs.rb +90 -0
- data/lib/zip/extra_field/old_unix.rb +44 -0
- data/lib/zip/extra_field/universal_time.rb +14 -14
- data/lib/zip/extra_field/unix.rb +8 -9
- data/lib/zip/extra_field/zip64.rb +44 -6
- data/lib/zip/extra_field/zip64_placeholder.rb +16 -0
- data/lib/zip/extra_field.rb +20 -8
- data/lib/zip/file.rb +126 -114
- data/lib/zip/filesystem.rb +140 -139
- data/lib/zip/inflater.rb +10 -9
- data/lib/zip/input_stream.rb +105 -80
- data/lib/zip/ioextras/abstract_input_stream.rb +15 -12
- data/lib/zip/ioextras/abstract_output_stream.rb +0 -2
- data/lib/zip/ioextras.rb +1 -3
- data/lib/zip/null_compressor.rb +2 -2
- data/lib/zip/null_decompressor.rb +4 -4
- data/lib/zip/null_input_stream.rb +2 -1
- data/lib/zip/output_stream.rb +57 -43
- data/lib/zip/pass_thru_compressor.rb +4 -4
- data/lib/zip/pass_thru_decompressor.rb +4 -5
- data/lib/zip/streamable_directory.rb +2 -2
- data/lib/zip/streamable_stream.rb +22 -13
- data/lib/zip/version.rb +1 -1
- data/lib/zip.rb +11 -2
- data/samples/example.rb +30 -40
- data/samples/example_filesystem.rb +16 -18
- data/samples/example_recursive.rb +35 -27
- data/samples/{gtkRubyzip.rb → gtk_ruby_zip.rb} +25 -27
- data/samples/qtzip.rb +19 -28
- data/samples/write_simple.rb +12 -13
- data/samples/zipfind.rb +29 -37
- data/test/basic_zip_file_test.rb +60 -0
- data/test/case_sensitivity_test.rb +69 -0
- data/test/central_directory_entry_test.rb +69 -0
- data/test/central_directory_test.rb +100 -0
- data/test/crypto/null_encryption_test.rb +53 -0
- data/test/crypto/traditional_encryption_test.rb +80 -0
- data/test/data/WarnInvalidDate.zip +0 -0
- data/test/data/file1.txt +46 -0
- data/test/data/file1.txt.deflatedData +0 -0
- data/test/data/file2.txt +1504 -0
- data/test/data/globTest/foo/bar/baz/foo.txt +0 -0
- data/test/data/globTest/foo.txt +0 -0
- data/test/data/globTest/food.txt +0 -0
- data/test/data/globTest.zip +0 -0
- data/test/data/mimetype +1 -0
- data/test/data/notzippedruby.rb +7 -0
- data/test/data/ntfs.zip +0 -0
- data/test/data/oddExtraField.zip +0 -0
- data/test/data/rubycode.zip +0 -0
- data/test/data/rubycode2.zip +0 -0
- data/test/data/test.xls +0 -0
- data/test/data/testDirectory.bin +0 -0
- data/test/data/zip64-sample.zip +0 -0
- data/test/data/zipWithDirs.zip +0 -0
- data/test/data/zipWithEncryption.zip +0 -0
- data/test/deflater_test.rb +65 -0
- data/test/encryption_test.rb +42 -0
- data/test/entry_set_test.rb +152 -0
- data/test/entry_test.rb +163 -0
- data/test/errors_test.rb +34 -0
- data/test/extra_field_test.rb +76 -0
- data/test/file_extract_directory_test.rb +54 -0
- data/test/file_extract_test.rb +83 -0
- data/test/file_permissions_test.rb +69 -0
- data/test/file_split_test.rb +57 -0
- data/test/file_test.rb +563 -0
- data/test/filesystem/dir_iterator_test.rb +58 -0
- data/test/filesystem/directory_test.rb +121 -0
- data/test/filesystem/file_mutating_test.rb +88 -0
- data/test/filesystem/file_nonmutating_test.rb +508 -0
- data/test/filesystem/file_stat_test.rb +64 -0
- data/test/gentestfiles.rb +122 -0
- data/test/inflater_test.rb +14 -0
- data/test/input_stream_test.rb +182 -0
- data/test/ioextras/abstract_input_stream_test.rb +102 -0
- data/test/ioextras/abstract_output_stream_test.rb +106 -0
- data/test/ioextras/fake_io_test.rb +18 -0
- data/test/local_entry_test.rb +154 -0
- data/test/output_stream_test.rb +128 -0
- data/test/pass_thru_compressor_test.rb +30 -0
- data/test/pass_thru_decompressor_test.rb +14 -0
- data/test/samples/example_recursive_test.rb +37 -0
- data/test/settings_test.rb +95 -0
- data/test/test_helper.rb +221 -0
- data/test/unicode_file_names_and_comments_test.rb +50 -0
- data/test/zip64_full_test.rb +51 -0
- data/test/zip64_support_test.rb +14 -0
- metadata +198 -22
- 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
|