minitar 0.5.3

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

Potentially problematic release.


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

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