| Class | Gem::Package::TarTestCase |
| In: |
lib/rubygems/package/tar_test_case.rb
|
| Parent: | Gem::TestCase |
A test case for Gem::Package::Tar* classes
# File lib/rubygems/package/tar_test_case.rb, line 9
9: def ASCIIZ(str, length)
10: str + "\0" * (length - str.length)
11: end
# File lib/rubygems/package/tar_test_case.rb, line 25
25: def assert_headers_equal(expected, actual)
26: expected = expected.to_s unless String === expected
27: actual = actual.to_s unless String === actual
28:
29: fields = %w[
30: name 100
31: mode 8
32: uid 8
33: gid 8
34: size 12
35: mtime 12
36: checksum 8
37: typeflag 1
38: linkname 100
39: magic 6
40: version 2
41: uname 32
42: gname 32
43: devmajor 8
44: devminor 8
45: prefix 155
46: ]
47:
48: offset = 0
49:
50: until fields.empty? do
51: name = fields.shift
52: length = fields.shift.to_i
53:
54: if name == "checksum" then
55: chksum_off = offset
56: offset += length
57: next
58: end
59:
60: assert_equal expected[offset, length], actual[offset, length],
61: "Field #{name} of the tar header differs."
62:
63: offset += length
64: end
65:
66: assert_equal expected[chksum_off, 8], actual[chksum_off, 8]
67: end
# File lib/rubygems/package/tar_test_case.rb, line 69
69: def calc_checksum(header)
70: sum = header.unpack("C*").inject{|s,a| s + a}
71: SP(Z(to_oct(sum, 6)))
72: end
# File lib/rubygems/package/tar_test_case.rb, line 74
74: def header(type, fname, dname, length, mode, checksum = nil)
75: checksum ||= " " * 8
76:
77: arr = [ # struct tarfile_entry_posix
78: ASCIIZ(fname, 100), # char name[100]; ASCII + (Z unless filled)
79: Z(to_oct(mode, 7)), # char mode[8]; 0 padded, octal null
80: Z(to_oct(0, 7)), # char uid[8]; ditto
81: Z(to_oct(0, 7)), # char gid[8]; ditto
82: Z(to_oct(length, 11)), # char size[12]; 0 padded, octal, null
83: Z(to_oct(0, 11)), # char mtime[12]; 0 padded, octal, null
84: checksum, # char checksum[8]; 0 padded, octal, null, space
85: type, # char typeflag[1]; file: "0" dir: "5"
86: "\0" * 100, # char linkname[100]; ASCII + (Z unless filled)
87: "ustar\0", # char magic[6]; "ustar\0"
88: "00", # char version[2]; "00"
89: ASCIIZ("wheel", 32), # char uname[32]; ASCIIZ
90: ASCIIZ("wheel", 32), # char gname[32]; ASCIIZ
91: Z(to_oct(0, 7)), # char devmajor[8]; 0 padded, octal, null
92: Z(to_oct(0, 7)), # char devminor[8]; 0 padded, octal, null
93: ASCIIZ(dname, 155) # char prefix[155]; ASCII + (Z unless filled)
94: ]
95:
96: format = "C100C8C8C8C12C12C8CC100C6C2C32C32C8C8C155"
97: h = if RUBY_VERSION >= "1.9" then
98: arr.join
99: else
100: arr = arr.join("").split(//).map{|x| x[0]}
101: arr.pack format
102: end
103: ret = h + "\0" * (512 - h.size)
104: assert_equal(512, ret.size)
105: ret
106: end
# File lib/rubygems/package/tar_test_case.rb, line 108
108: def tar_dir_header(name, prefix, mode)
109: h = header("5", name, prefix, 0, mode)
110: checksum = calc_checksum(h)
111: header("5", name, prefix, 0, mode, checksum)
112: end
# File lib/rubygems/package/tar_test_case.rb, line 114
114: def tar_file_header(fname, dname, mode, length)
115: h = header("0", fname, dname, length, mode)
116: checksum = calc_checksum(h)
117: header("0", fname, dname, length, mode, checksum)
118: end
# File lib/rubygems/package/tar_test_case.rb, line 120
120: def to_oct(n, pad_size)
121: "%0#{pad_size}o" % n
122: end
# File lib/rubygems/package/tar_test_case.rb, line 132
132: def util_dir_entry
133: util_entry tar_dir_header("foo", "bar", 0)
134: end