archive-tar-minitar 0.5.1

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.
@@ -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