archive-tar-minitar 0.5.1

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

Potentially problematic release.


This version of archive-tar-minitar might be problematic. Click here for more details.

@@ -0,0 +1,624 @@
1
+ #!/usr/bin/env ruby
2
+ #--
3
+ # Ruwiki version 0.8.0
4
+ # Copyright � 2002 - 2004, Digikata and HaloStatue
5
+ # Alan Chen (alan@digikata.com)
6
+ # Austin Ziegler (ruwiki@halostatue.ca)
7
+ #
8
+ # Licensed under the same terms as Ruby.
9
+ #
10
+ # $Id: tc_tar.rb,v 1.1 2004/09/06 22:35:41 austin Exp $
11
+ #++
12
+
13
+ $LOAD_PATH.unshift("#{File.dirname(__FILE__)}/../lib") if __FILE__ == $0
14
+
15
+ require 'archive/tar/minitar'
16
+ require 'test/unit'
17
+ require 'stringio'
18
+ require 'yaml'
19
+ require 'zlib'
20
+
21
+ module TarTester
22
+ private
23
+ def assert_headers_equal(h1, h2)
24
+ fields = %w(name 100 mode 8 uid 8 gid 8 size 12 mtime 12 checksum 8
25
+ typeflag 1 linkname 100 magic 6 version 2 uname 32 gname 32
26
+ devmajor 8 devminor 8 prefix 155)
27
+ offset = 0
28
+ until fields.empty?
29
+ name = fields.shift
30
+ length = fields.shift.to_i
31
+ if name == "checksum"
32
+ chksum_off = offset
33
+ offset += length
34
+ next
35
+ end
36
+ assert_equal(h1[offset, length], h2[offset, length],
37
+ "Field #{name} of the tar header differs.")
38
+ offset += length
39
+ end
40
+ assert_equal(h1[chksum_off, 8], h2[chksum_off, 8], "Checksumes differ.")
41
+ end
42
+
43
+ def tar_file_header(fname, dname, mode, length)
44
+ h = header("0", fname, dname, length, mode)
45
+ checksum = calc_checksum(h)
46
+ header("0", fname, dname, length, mode, checksum)
47
+ end
48
+
49
+ def tar_dir_header(name, prefix, mode)
50
+ h = header("5", name, prefix, 0, mode)
51
+ checksum = calc_checksum(h)
52
+ header("5", name, prefix, 0, mode, checksum)
53
+ end
54
+
55
+ def header(type, fname, dname, length, mode, checksum = nil)
56
+ checksum ||= " " * 8
57
+ arr = [ASCIIZ(fname, 100), Z(to_oct(mode, 7)), Z(to_oct(nil, 7)),
58
+ Z(to_oct(nil, 7)), Z(to_oct(length, 11)), Z(to_oct(0, 11)),
59
+ checksum, type, "\0" * 100, "ustar\0", "00", ASCIIZ("", 32),
60
+ ASCIIZ("", 32), Z(to_oct(nil, 7)), Z(to_oct(nil, 7)),
61
+ ASCIIZ(dname, 155) ]
62
+ arr = arr.join("").split(//).map{ |x| x[0] }
63
+ h = arr.pack("C100C8C8C8C12C12C8CC100C6C2C32C32C8C8C155")
64
+ ret = h + "\0" * (512 - h.size)
65
+ assert_equal(512, ret.size)
66
+ ret
67
+ end
68
+
69
+ def calc_checksum(header)
70
+ sum = header.unpack("C*").inject { |s, a| s + a }
71
+ SP(Z(to_oct(sum, 6)))
72
+ end
73
+
74
+ def to_oct(n, pad_size)
75
+ if n.nil?
76
+ "\0" * pad_size
77
+ else
78
+ "%0#{pad_size}o" % n
79
+ end
80
+ end
81
+
82
+ def ASCIIZ(str, length)
83
+ str + "\0" * (length - str.length)
84
+ end
85
+
86
+ def SP(s)
87
+ s + " "
88
+ end
89
+
90
+ def Z(s)
91
+ s + "\0"
92
+ end
93
+
94
+ def SP_Z(s)
95
+ s + " \0"
96
+ end
97
+ end
98
+
99
+ class TC_Tar__Header < Test::Unit::TestCase
100
+ include Archive::Tar::Minitar
101
+ include TarTester
102
+
103
+ def test_arguments_are_checked
104
+ e = ArgumentError
105
+ assert_raises(e) { Archive::Tar::PosixHeader.new(:name => "", :size => "", :mode => "") }
106
+ assert_raises(e) { Archive::Tar::PosixHeader.new(:name => "", :size => "", :prefix => "") }
107
+ assert_raises(e) { Archive::Tar::PosixHeader.new(:name => "", :prefix => "", :mode => "") }
108
+ assert_raises(e) { Archive::Tar::PosixHeader.new(:prefix => "", :size => "", :mode => "") }
109
+ end
110
+
111
+ def test_basic_headers
112
+ header = { :name => "bla", :mode => 012345, :size => 10, :prefix => "", :typeflag => "0" }
113
+ assert_headers_equal(tar_file_header("bla", "", 012345, 10),
114
+ Archive::Tar::PosixHeader.new(header).to_s)
115
+ header = { :name => "bla", :mode => 012345, :size => 0, :prefix => "", :typeflag => "5" }
116
+ assert_headers_equal(tar_dir_header("bla", "", 012345),
117
+ Archive::Tar::PosixHeader.new(header).to_s)
118
+ end
119
+
120
+ def test_long_name_works
121
+ header = { :name => "a" * 100, :mode => 012345, :size => 10, :prefix => "" }
122
+ assert_headers_equal(tar_file_header("a" * 100, "", 012345, 10),
123
+ Archive::Tar::PosixHeader.new(header).to_s)
124
+ header = { :name => "a" * 100, :mode => 012345, :size => 10, :prefix => "bb" * 60 }
125
+ assert_headers_equal(tar_file_header("a" * 100, "bb" * 60, 012345, 10),
126
+ Archive::Tar::PosixHeader.new(header).to_s)
127
+ end
128
+
129
+ def test_new_from_stream
130
+ header = tar_file_header("a" * 100, "", 012345, 10)
131
+ h = nil
132
+ header = StringIO.new(header)
133
+ assert_nothing_raised { h = Archive::Tar::PosixHeader.new_from_stream(header) }
134
+ assert_equal("a" * 100, h.name)
135
+ assert_equal(012345, h.mode)
136
+ assert_equal(10, h.size)
137
+ assert_equal("", h.prefix)
138
+ assert_equal("ustar", h.magic)
139
+ end
140
+
141
+ def test_new_from_stream_with_evil_name
142
+ header = tar_file_header("a \0" + "\0" * 97, "", 012345, 10)
143
+ h = nil
144
+ header = StringIO.new(header)
145
+ assert_nothing_raised{ h = Archive::Tar::PosixHeader.new_from_stream header }
146
+ assert_equal("a ", h.name)
147
+ end
148
+ end
149
+
150
+ class TC_Tar__Writer < Test::Unit::TestCase
151
+ include Archive::Tar::Minitar
152
+ include TarTester
153
+
154
+ class DummyIO
155
+ attr_reader :data
156
+
157
+ def initialize
158
+ @data = ""
159
+ end
160
+
161
+ def write(dat)
162
+ data << dat
163
+ dat.size
164
+ end
165
+
166
+ def reset
167
+ @data = ""
168
+ end
169
+ end
170
+
171
+ def setup
172
+ @data = "a" * 10
173
+ @dummyos = DummyIO.new
174
+ @os = Writer.new(@dummyos)
175
+ end
176
+
177
+ def teardown
178
+ @os.close
179
+ end
180
+
181
+ def test_add_file_simple
182
+ @dummyos.reset
183
+
184
+ Writer.open(@dummyos) do |os|
185
+ os.add_file_simple("lib/foo/bar", :mode => 0644, :size => 10) do |f|
186
+ f.write "a" * 10
187
+ end
188
+ os.add_file_simple("lib/bar/baz", :mode => 0644, :size => 100) do |f|
189
+ f.write "fillme"
190
+ end
191
+ end
192
+
193
+ assert_headers_equal(tar_file_header("lib/foo/bar", "", 0644, 10),
194
+ @dummyos.data[0, 512])
195
+ assert_equal("a" * 10 + "\0" * 502, @dummyos.data[512, 512])
196
+ assert_headers_equal(tar_file_header("lib/bar/baz", "", 0644, 100),
197
+ @dummyos.data[512 * 2, 512])
198
+ assert_equal("fillme" + "\0" * 506, @dummyos.data[512 * 3, 512])
199
+ assert_equal("\0" * 512, @dummyos.data[512 * 4, 512])
200
+ assert_equal("\0" * 512, @dummyos.data[512 * 5, 512])
201
+ end
202
+
203
+ def test_write_operations_fail_after_closed
204
+ @dummyos.reset
205
+ @os.add_file_simple("sadd", :mode => 0644, :size => 20) { |f| }
206
+ @os.close
207
+ assert_raises(ClosedStream) { @os.flush }
208
+ assert_raises(ClosedStream) { @os.add_file("dfdsf", :mode => 0644) {} }
209
+ assert_raises(ClosedStream) { @os.mkdir "sdfdsf", :mode => 0644 }
210
+ end
211
+
212
+ def test_file_name_is_split_correctly
213
+ # test insane file lengths, and: a{100}/b{155}, etc
214
+ @dummyos.reset
215
+ names = [ "#{'a' * 155}/#{'b' * 100}", "#{'a' * 151}/#{'qwer/' * 19}bla" ]
216
+ o_names = [ "#{'b' * 100}", "#{'qwer/' * 19}bla" ]
217
+ o_prefixes = [ "a" * 155, "a" * 151 ]
218
+ names.each do |name|
219
+ @os.add_file_simple(name, :mode => 0644, :size => 10) { }
220
+ end
221
+ o_names.each_with_index do |nam, i|
222
+ assert_headers_equal(tar_file_header(nam, o_prefixes[i], 0644, 10),
223
+ @dummyos.data[2 * i * 512, 512])
224
+ end
225
+ assert_raises(FileNameTooLong) do
226
+ @os.add_file_simple(File.join("a" * 152, "b" * 10, "a" * 92),
227
+ :mode => 0644, :size => 10) { }
228
+ end
229
+ assert_raises(FileNameTooLong) do
230
+ @os.add_file_simple(File.join("a" * 162, "b" * 10),
231
+ :mode => 0644, :size => 10) { }
232
+ end
233
+ assert_raises(FileNameTooLong) do
234
+ @os.add_file_simple(File.join("a" * 10, "b" * 110),
235
+ :mode => 0644, :size => 10) { }
236
+ end
237
+ end
238
+
239
+ def test_add_file
240
+ dummyos = StringIO.new
241
+ class << dummyos
242
+ def method_missing(meth, *a)
243
+ self.string.send(meth, *a)
244
+ end
245
+ end
246
+ os = Writer.new dummyos
247
+ content1 = ('a'..'z').to_a.join("") # 26
248
+ content2 = ('aa'..'zz').to_a.join("") # 1352
249
+ Writer.open(dummyos) do |os|
250
+ os.add_file("lib/foo/bar", :mode => 0644) { |f, opts| f.write "a" * 10 }
251
+ os.add_file("lib/bar/baz", :mode => 0644) { |f, opts| f.write content1 }
252
+ os.add_file("lib/bar/baz", :mode => 0644) { |f, opts| f.write content2 }
253
+ os.add_file("lib/bar/baz", :mode => 0644) { |f, opts| }
254
+ end
255
+ assert_headers_equal(tar_file_header("lib/foo/bar", "", 0644, 10),
256
+ dummyos[0, 512])
257
+ assert_equal(%Q(#{"a" * 10}#{"\0" * 502}), dummyos[512, 512])
258
+ offset = 512 * 2
259
+ [content1, content2, ""].each do |data|
260
+ assert_headers_equal(tar_file_header("lib/bar/baz", "", 0644,
261
+ data.size), dummyos[offset, 512])
262
+ offset += 512
263
+ until !data || data == ""
264
+ chunk = data[0, 512]
265
+ data[0, 512] = ""
266
+ assert_equal(chunk + "\0" * (512 - chunk.size),
267
+ dummyos[offset, 512])
268
+ offset += 512
269
+ end
270
+ end
271
+ assert_equal("\0" * 1024, dummyos[offset, 1024])
272
+ end
273
+
274
+ def test_add_file_tests_seekability
275
+ assert_raises(Archive::Tar::Minitar::NonSeekableStream) do
276
+ @os.add_file("libdfdsfd", :mode => 0644) { |f| }
277
+ end
278
+ end
279
+
280
+ def test_write_header
281
+ @dummyos.reset
282
+ @os.add_file_simple("lib/foo/bar", :mode => 0644, :size => 0) { |f| }
283
+ @os.flush
284
+ assert_headers_equal(tar_file_header("lib/foo/bar", "", 0644, 0),
285
+ @dummyos.data[0, 512])
286
+ @dummyos.reset
287
+ @os.mkdir("lib/foo", :mode => 0644)
288
+ assert_headers_equal(tar_dir_header("lib/foo", "", 0644),
289
+ @dummyos.data[0, 512])
290
+ @os.mkdir("lib/bar", :mode => 0644)
291
+ assert_headers_equal(tar_dir_header("lib/bar", "", 0644),
292
+ @dummyos.data[512 * 1, 512])
293
+ end
294
+
295
+ def test_write_data
296
+ @dummyos.reset
297
+ @os.add_file_simple("lib/foo/bar", :mode => 0644, :size => 10) do |f|
298
+ f.write @data
299
+ end
300
+ @os.flush
301
+ assert_equal(@data + ("\0" * (512-@data.size)),
302
+ @dummyos.data[512, 512])
303
+ end
304
+
305
+ def test_file_size_is_checked
306
+ @dummyos.reset
307
+ assert_raises(Archive::Tar::Minitar::Writer::BoundedStream::FileOverflow) do
308
+ @os.add_file_simple("lib/foo/bar", :mode => 0644, :size => 10) do |f|
309
+ f.write "1" * 100
310
+ end
311
+ end
312
+ assert_nothing_raised do
313
+ @os.add_file_simple("lib/foo/bar", :mode => 0644, :size => 10) {|f| }
314
+ end
315
+ end
316
+ end
317
+
318
+ class TC_Tar__Reader < Test::Unit::TestCase
319
+ include Archive::Tar::Minitar
320
+ include TarTester
321
+
322
+ def setup
323
+ end
324
+
325
+ def teardown
326
+ end
327
+
328
+ def test_multiple_entries
329
+ str = tar_file_header("lib/foo", "", 010644, 10) + "\0" * 512
330
+ str += tar_file_header("bar", "baz", 0644, 0)
331
+ str += tar_dir_header("foo", "bar", 012345)
332
+ str += "\0" * 1024
333
+ names = %w[lib/foo bar foo]
334
+ prefixes = ["", "baz", "bar"]
335
+ modes = [010644, 0644, 012345]
336
+ sizes = [10, 0, 0]
337
+ isdir = [false, false, true]
338
+ isfile = [true, true, false]
339
+ Reader.new(StringIO.new(str)) do |is|
340
+ i = 0
341
+ is.each_entry do |entry|
342
+ assert_kind_of(Reader::EntryStream, entry)
343
+ assert_equal(names[i], entry.name)
344
+ assert_equal(prefixes[i], entry.prefix)
345
+ assert_equal(sizes[i], entry.size)
346
+ assert_equal(modes[i], entry.mode)
347
+ assert_equal(isdir[i], entry.directory?)
348
+ assert_equal(isfile[i], entry.file?)
349
+ if prefixes[i] != ""
350
+ assert_equal(File.join(prefixes[i], names[i]), entry.full_name)
351
+ else
352
+ assert_equal(names[i], entry.name)
353
+ end
354
+ i += 1
355
+ end
356
+ assert_equal(names.size, i)
357
+ end
358
+ end
359
+
360
+ def test_rewind_entry_works
361
+ content = ('a'..'z').to_a.join(" ")
362
+ str = tar_file_header("lib/foo", "", 010644, content.size) + content +
363
+ "\0" * (512 - content.size)
364
+ str << "\0" * 1024
365
+ Reader.new(StringIO.new(str)) do |is|
366
+ is.each_entry do |entry|
367
+ 3.times do
368
+ entry.rewind
369
+ assert_equal(content, entry.read)
370
+ assert_equal(content.size, entry.pos)
371
+ end
372
+ end
373
+ end
374
+ end
375
+
376
+ def test_rewind_works
377
+ content = ('a'..'z').to_a.join(" ")
378
+ str = tar_file_header("lib/foo", "", 010644, content.size) + content +
379
+ "\0" * (512 - content.size)
380
+ str << "\0" * 1024
381
+ Reader.new(StringIO.new(str)) do |is|
382
+ 3.times do
383
+ is.rewind
384
+ i = 0
385
+ is.each_entry do |entry|
386
+ assert_equal(content, entry.read)
387
+ i += 1
388
+ end
389
+ assert_equal(1, i)
390
+ end
391
+ end
392
+ end
393
+
394
+ def test_read_works
395
+ contents = ('a'..'z').inject(""){|s, x| s << x * 100}
396
+ str = tar_file_header("lib/foo", "", 010644, contents.size) + contents
397
+ str += "\0" * (512 - (str.size % 512))
398
+ Reader.new(StringIO.new(str)) do |is|
399
+ is.each_entry do |entry|
400
+ assert_kind_of(Reader::EntryStream, entry)
401
+ data = entry.read(3000) # bigger than contents.size
402
+ assert_equal(contents, data)
403
+ assert_equal(true, entry.eof?)
404
+ end
405
+ end
406
+ Reader.new(StringIO.new(str)) do |is|
407
+ is.each_entry do |entry|
408
+ assert_kind_of(Reader::EntryStream, entry)
409
+ data = entry.read(100)
410
+ (entry.size - data.size).times {|i| data << entry.getc.chr }
411
+ assert_equal(contents, data)
412
+ assert_equal(nil, entry.read(10))
413
+ assert_equal(true, entry.eof?)
414
+ end
415
+ end
416
+ Reader.new(StringIO.new(str)) do |is|
417
+ is.each_entry do |entry|
418
+ assert_kind_of(Reader::EntryStream, entry)
419
+ data = entry.read
420
+ assert_equal(contents, data)
421
+ assert_equal(nil, entry.read(10))
422
+ assert_equal(nil, entry.read)
423
+ assert_equal(nil, entry.getc)
424
+ assert_equal(true, entry.eof?)
425
+ end
426
+ end
427
+ end
428
+
429
+ def test_eof_works
430
+ str = tar_file_header("bar", "baz", 0644, 0)
431
+ Reader.new(StringIO.new(str)) do |is|
432
+ is.each_entry do |entry|
433
+ assert_kind_of(Reader::EntryStream, entry)
434
+ data = entry.read
435
+ assert_equal(nil, data)
436
+ assert_equal(nil, entry.read(10))
437
+ assert_equal(nil, entry.read)
438
+ assert_equal(nil, entry.getc)
439
+ assert_equal(true, entry.eof?)
440
+ end
441
+ end
442
+ str = tar_dir_header("foo", "bar", 012345)
443
+ Reader.new(StringIO.new(str)) do |is|
444
+ is.each_entry do |entry|
445
+ assert_kind_of(Reader::EntryStream, entry)
446
+ data = entry.read
447
+ assert_equal(nil, data)
448
+ assert_equal(nil, entry.read(10))
449
+ assert_equal(nil, entry.read)
450
+ assert_equal(nil, entry.getc)
451
+ assert_equal(true, entry.eof?)
452
+ end
453
+ end
454
+ str = tar_dir_header("foo", "bar", 012345)
455
+ str += tar_file_header("bar", "baz", 0644, 0)
456
+ str += tar_file_header("bar", "baz", 0644, 0)
457
+ Reader.new(StringIO.new(str)) do |is|
458
+ is.each_entry do |entry|
459
+ assert_kind_of(Reader::EntryStream, entry)
460
+ data = entry.read
461
+ assert_equal(nil, data)
462
+ assert_equal(nil, entry.read(10))
463
+ assert_equal(nil, entry.read)
464
+ assert_equal(nil, entry.getc)
465
+ assert_equal(true, entry.eof?)
466
+ end
467
+ end
468
+ end
469
+ end
470
+
471
+ class TC_Tar__Input < Test::Unit::TestCase
472
+ include Archive::Tar::Minitar
473
+ include TarTester
474
+
475
+ require 'rbconfig'
476
+
477
+ TEST_TGZ = "\037\213\010\000\001B1A\000\vKI,I\324+I,\322K\257b\240\0250\000\002sSS\254\342 `dj\306``nnnbndbjd\000\0247336`P0\240\231\213\220@i1\320\367@+\351a\327 \004\362\335\034\f\313\034\r\035\031\270\337Ns\344b2\344q\335\375M\304\266QM1W\357\321>\221U\021\005\246\306\367\356\367u3\262;\212\004\265\236\\\334}\351,\377\037;\217\223\301e\247\030\024\\\236\211\277\347\346sii\265\010\330\355\234\240\362\274\371[\202\361\366\302S\316\335o&~m\237r\355\377\303\230\365\352WNW\334\266_\373\273\237\347Q\315t?\263{\377?\006\271\337?\367\207\325\346]\371\376y\307_\234~d\3772\265\346\261}\323\317\373\315\352\377O\376\271/\305\377?X\253\324\303S\373\361\347\277\372^)\267\377\363\03460\331\311\\wW|\031\203\300@\207\325p\004i\2319\251\3064\266\203P\376702B\313\377\246\246\006&\243\371\237\036 $#\263X\001\210@\351@\301XO\201\227k\240]4\nF\301(\030\005\243\200\036\000\000\004\330t\023\000\f\000\000"
478
+ FILETIMES = Time.mktime(2004).to_i
479
+
480
+ TEST_CONTENTS = [
481
+ [ "data.tar.gz", 174, 0755 ],
482
+ [ "file3", 18, 0755 ],
483
+ ]
484
+
485
+ TEST_DATA_CONTENTS = [
486
+ [ "data", 0, 010644 ],
487
+ [ "data/file1", 16, 010644 ],
488
+ [ "data/file2", 16, 010644 ],
489
+ [ "data/__dir__", 0, 010644 ],
490
+ ]
491
+
492
+ def setup
493
+ FileUtils.mkdir_p("data__")
494
+ end
495
+
496
+ def teardown
497
+ FileUtils.rm_rf("data__")
498
+ end
499
+
500
+ def test_each_works
501
+ gzr = Zlib::GzipReader.new(StringIO.new(TEST_TGZ))
502
+ Input.open(gzr) do |is|
503
+ ii = 0
504
+ is.each_with_index do |entry, ii|
505
+ assert_kind_of(Reader::EntryStream, entry)
506
+ assert_equal(TEST_CONTENTS[ii][0], entry.name)
507
+ assert_equal(TEST_CONTENTS[ii][1], entry.size)
508
+ assert_equal(TEST_CONTENTS[ii][2], entry.mode)
509
+ assert_equal(FILETIMES, entry.mtime)
510
+
511
+ if 0 == ii
512
+ gzr2 = Zlib::GzipReader.new(StringIO.new(entry.read))
513
+ Input.open(gzr2) do |is2|
514
+ jj = 0
515
+ is2.each_with_index do |entry2, jj|
516
+ assert_kind_of(Reader::EntryStream, entry2)
517
+ assert_equal(TEST_DATA_CONTENTS[jj][0], entry2.name)
518
+ assert_equal(TEST_DATA_CONTENTS[jj][1], entry2.size)
519
+ assert_equal(TEST_DATA_CONTENTS[jj][2], entry2.mode)
520
+ assert_equal(FILETIMES, entry2.mtime)
521
+ end
522
+ assert_equal(3, jj)
523
+ end
524
+ end
525
+ end
526
+ assert_equal(1, ii)
527
+ end
528
+ end
529
+
530
+ def test_extract_entry_works
531
+ gzr = Zlib::GzipReader.new(StringIO.new(TEST_TGZ))
532
+ Input.open(gzr) do |is|
533
+ ii = 0
534
+ is.each_with_index do |entry, ii|
535
+ is.extract_entry("data__", entry)
536
+ name = File.join("data__", entry.name)
537
+
538
+ if entry.directory?
539
+ assert(File.directory?(name))
540
+ else
541
+ assert(File.file?(name))
542
+
543
+ assert_equal(TEST_CONTENTS[ii][1], File.stat(name).size)
544
+ end
545
+ assert_equal(TEST_CONTENTS[ii][2], File.stat(name).mode) unless RUBY_PLATFORM =~ /win32/
546
+
547
+ if 0 == ii
548
+ begin
549
+ ff = File.open(name, "rb")
550
+ gzr2 = Zlib::GzipReader.new(ff)
551
+ Input.open(gzr2) do |is2|
552
+ jj = 0
553
+ is2.each_with_index do |entry2, jj|
554
+ is2.extract_entry("data__", entry2)
555
+ name2 = File.join("data__", entry2.name)
556
+
557
+ if entry2.directory?
558
+ assert(File.directory?(name2))
559
+ else
560
+ assert(File.file?(name2))
561
+ assert_equal(TEST_DATA_CONTENTS[jj][1], File.stat(name2).size, name2)
562
+ end
563
+ assert_equal(TEST_DATA_CONTENTS[jj][2], File.stat(name2).mode, name2) unless RUBY_PLATFORM =~ /win32/
564
+ end
565
+ end
566
+ ensure
567
+ ff.close unless ff.closed?
568
+ end
569
+ end
570
+ end
571
+ assert_equal(1, ii)
572
+ end
573
+ end
574
+ end
575
+
576
+ class TC_Tar__Output < Test::Unit::TestCase
577
+ include Archive::Tar::Minitar
578
+ include TarTester
579
+
580
+ def setup
581
+ FileUtils.mkdir_p("data__")
582
+ %w(a b c).each do |filename|
583
+ name = File.join("data__", filename)
584
+ File.open(name, "wb") { |f| f.puts "#{name}: 123456789012345678901234567890" }
585
+ end
586
+ @tarfile = "data__/bla2.tar"
587
+ end
588
+
589
+ def teardown
590
+ FileUtils.rm_rf("data__")
591
+ end
592
+
593
+ def test_file_looks_good
594
+ Output.open(@tarfile) do |os|
595
+ Dir.chdir("data__") do
596
+ %w(a b c).each do |name|
597
+ stat = File.stat(name)
598
+ opts = { :size => stat.size, :mode => 0644 }
599
+ os.tar.add_file_simple(name, opts) do |ss|
600
+ File.open(name, "rb") { |ff| ss.write(ff.read(4096)) until ff.eof? }
601
+ end
602
+ end
603
+ end
604
+ end
605
+ ff = File.open(@tarfile, "rb")
606
+ Reader.open(ff) do |is|
607
+ ii = 0
608
+ is.each do |entry|
609
+ case ii
610
+ when 0
611
+ assert_equal("a", entry.name)
612
+ when 1
613
+ assert_equal("b", entry.name)
614
+ when 2
615
+ assert_equal("c", entry.name)
616
+ end
617
+ ii += 1
618
+ end
619
+ assert_equal(3, ii)
620
+ end
621
+ ensure
622
+ ff.close if ff
623
+ end
624
+ end