Change soft-fail to use the config, rather than env
[rbx.git] / test / rubygems / gem_package_tar_test_case.rb
blob756b30ef27ab6219f4c9c7ebec92cfe596ce6dc4
1 require File.join(File.expand_path(File.dirname(__FILE__)), 'gemutilities')
2 require 'rubygems/package'
4 class File
6   # straight from setup.rb
7   def self.dir?(path)
8     # for corrupted windows stat()
9     File.directory?((path[-1,1] == '/') ? path : path + '/')
10   end
12   def self.read_b(name)
13     File.open(name, "rb") { |f| f.read }
14   end
16 end
18 class TarTestCase < RubyGemTestCase
20   def ASCIIZ(str, length)
21     str + "\0" * (length - str.length)
22   end
24   def SP(s)
25     s + " "
26   end
28   def SP_Z(s)
29     s + " \0"
30   end
32   def Z(s)
33     s + "\0"
34   end
36   def assert_headers_equal(expected, actual)
37     expected = expected.to_s unless String === expected
38     actual = actual.to_s unless String === actual
40     fields = %w[
41       name 100
42       mode 8
43       uid 8
44       gid 8
45       size 12
46       mtime 12
47       checksum 8
48       typeflag 1
49       linkname 100
50       magic 6
51       version 2
52       uname 32 
53       gname 32
54       devmajor 8
55       devminor 8
56       prefix 155
57     ]
59     offset = 0
61     until fields.empty? do
62       name = fields.shift
63       length = fields.shift.to_i
65       if name == "checksum" then
66         chksum_off = offset
67         offset += length
68         next
69       end
71       assert_equal expected[offset, length], actual[offset, length], 
72                    "Field #{name} of the tar header differs."
74       offset += length
75     end
77     assert_equal expected[chksum_off, 8], actual[chksum_off, 8]
78   end
80   def calc_checksum(header)
81     sum = header.unpack("C*").inject{|s,a| s + a}
82     SP(Z(to_oct(sum, 6)))
83   end
85   def header(type, fname, dname, length, mode, checksum = nil)
86     checksum ||= " " * 8
88     arr = [                  # struct tarfile_entry_posix
89       ASCIIZ(fname, 100),    # char name[100];     ASCII + (Z unless filled)
90       Z(to_oct(mode, 7)),    # char mode[8];       0 padded, octal null
91       Z(to_oct(0, 7)),       # char uid[8];        ditto
92       Z(to_oct(0, 7)),       # char gid[8];        ditto
93       Z(to_oct(length, 11)), # char size[12];      0 padded, octal, null
94       Z(to_oct(0, 11)),      # char mtime[12];     0 padded, octal, null
95       checksum,              # char checksum[8];   0 padded, octal, null, space
96       type,                  # char typeflag[1];   file: "0"  dir: "5"
97       "\0" * 100,            # char linkname[100]; ASCII + (Z unless filled)
98       "ustar\0",             # char magic[6];      "ustar\0"
99       "00",                  # char version[2];    "00"
100       ASCIIZ("wheel", 32),   # char uname[32];     ASCIIZ
101       ASCIIZ("wheel", 32),   # char gname[32];     ASCIIZ
102       Z(to_oct(0, 7)),       # char devmajor[8];   0 padded, octal, null
103       Z(to_oct(0, 7)),       # char devminor[8];   0 padded, octal, null
104       ASCIIZ(dname, 155)     # char prefix[155];   ASCII + (Z unless filled)
105     ]
107     format = "C100C8C8C8C12C12C8CC100C6C2C32C32C8C8C155"
108     h = if RUBY_VERSION >= "1.9" then
109           arr.join
110         else
111           arr = arr.join("").split(//).map{|x| x[0]}
112           arr.pack format
113         end
114     ret = h + "\0" * (512 - h.size)
115     assert_equal(512, ret.size)
116     ret
117   end
119   def tar_dir_header(name, prefix, mode)
120     h = header("5", name, prefix, 0, mode)
121     checksum = calc_checksum(h)
122     header("5", name, prefix, 0, mode, checksum)
123   end
125   def tar_file_header(fname, dname, mode, length)
126     h = header("0", fname, dname, length, mode)
127     checksum = calc_checksum(h)
128     header("0", fname, dname, length, mode, checksum)
129   end
131   def to_oct(n, pad_size)
132     "%0#{pad_size}o" % n
133   end
135   def util_entry(tar)
136     io = TempIO.new tar
137     header = Gem::Package::TarHeader.from io
138     entry = Gem::Package::TarReader::Entry.new header, io
139   end
141   def util_dir_entry
142     util_entry tar_dir_header("foo", "bar", 0)
143   end