Extended maintenance of Ruby 1.9.3 ended on February 23, 2015. Read more

In Files

  • rubygems/package/tar_test_case.rb

Class/Module Index [+]

Quicksearch

Gem::Package::TarTestCase

A test case for Gem::Package::Tar* classes

Public Instance Methods

ASCIIZ(str, length) click to toggle source
 
               # File rubygems/package/tar_test_case.rb, line 9
def ASCIIZ(str, length)
  str + "\0" * (length - str.length)
end
            
SP(s) click to toggle source
 
               # File rubygems/package/tar_test_case.rb, line 13
def SP(s)
  s + " "
end
            
SP_Z(s) click to toggle source
 
               # File rubygems/package/tar_test_case.rb, line 17
def SP_Z(s)
  s + " \0"
end
            
Z(s) click to toggle source
 
               # File rubygems/package/tar_test_case.rb, line 21
def Z(s)
  s + "\0"
end
            
assert_headers_equal(expected, actual) click to toggle source
 
               # File rubygems/package/tar_test_case.rb, line 25
def assert_headers_equal(expected, actual)
  expected = expected.to_s unless String === expected
  actual = actual.to_s unless String === actual

  fields = %w[
    name 100
    mode 8
    uid 8
    gid 8
    size 12
    mtime 12
    checksum 8
    typeflag 1
    linkname 100
    magic 6
    version 2
    uname 32
    gname 32
    devmajor 8
    devminor 8
    prefix 155
  ]

  offset = 0

  until fields.empty? do
    name = fields.shift
    length = fields.shift.to_i

    if name == "checksum" then
      chksum_off = offset
      offset += length
      next
    end

    assert_equal expected[offset, length], actual[offset, length],
                 "Field #{name} of the tar header differs."

    offset += length
  end

  assert_equal expected[chksum_off, 8], actual[chksum_off, 8]
end
            
calc_checksum(header) click to toggle source
 
               # File rubygems/package/tar_test_case.rb, line 69
def calc_checksum(header)
  sum = header.unpack("C*").inject{|s,a| s + a}
  SP(Z(to_oct(sum, 6)))
end
            
header(type, fname, dname, length, mode, checksum = nil) click to toggle source
 
               # File rubygems/package/tar_test_case.rb, line 74
def header(type, fname, dname, length, mode, checksum = nil)
  checksum ||= " " * 8

  arr = [                  # struct tarfile_entry_posix
    ASCIIZ(fname, 100),    # char name[100];     ASCII + (Z unless filled)
    Z(to_oct(mode, 7)),    # char mode[8];       0 padded, octal null
    Z(to_oct(0, 7)),       # char uid[8];        ditto
    Z(to_oct(0, 7)),       # char gid[8];        ditto
    Z(to_oct(length, 11)), # char size[12];      0 padded, octal, null
    Z(to_oct(0, 11)),      # char mtime[12];     0 padded, octal, null
    checksum,              # char checksum[8];   0 padded, octal, null, space
    type,                  # char typeflag[1];   file: "0"  dir: "5"
    "\0" * 100,            # char linkname[100]; ASCII + (Z unless filled)
    "ustar\0",             # char magic[6];      "ustar\0"
    "00",                  # char version[2];    "00"
    ASCIIZ("wheel", 32),   # char uname[32];     ASCIIZ
    ASCIIZ("wheel", 32),   # char gname[32];     ASCIIZ
    Z(to_oct(0, 7)),       # char devmajor[8];   0 padded, octal, null
    Z(to_oct(0, 7)),       # char devminor[8];   0 padded, octal, null
    ASCIIZ(dname, 155)     # char prefix[155];   ASCII + (Z unless filled)
  ]

  format = "C100C8C8C8C12C12C8CC100C6C2C32C32C8C8C155"
  h = if RUBY_VERSION >= "1.9" then
        arr.join
      else
        arr = arr.join("").split(//).map{|x| x[0]}
        arr.pack format
      end
  ret = h + "\0" * (512 - h.size)
  assert_equal(512, ret.size)
  ret
end
            
tar_dir_header(name, prefix, mode) click to toggle source
 
               # File rubygems/package/tar_test_case.rb, line 108
def tar_dir_header(name, prefix, mode)
  h = header("5", name, prefix, 0, mode)
  checksum = calc_checksum(h)
  header("5", name, prefix, 0, mode, checksum)
end
            
tar_file_header(fname, dname, mode, length) click to toggle source
 
               # File rubygems/package/tar_test_case.rb, line 114
def tar_file_header(fname, dname, mode, length)
  h = header("0", fname, dname, length, mode)
  checksum = calc_checksum(h)
  header("0", fname, dname, length, mode, checksum)
end
            
to_oct(n, pad_size) click to toggle source
 
               # File rubygems/package/tar_test_case.rb, line 120
def to_oct(n, pad_size)
  "%0#{pad_size}o" % n
end
            
util_dir_entry() click to toggle source
 
               # File rubygems/package/tar_test_case.rb, line 132
def util_dir_entry
  util_entry tar_dir_header("foo", "bar", 0)
end
            
util_entry(tar) click to toggle source
 
               # File rubygems/package/tar_test_case.rb, line 124
def util_entry(tar)
  io = TempIO.new tar

  header = Gem::Package::TarHeader.from io

  Gem::Package::TarReader::Entry.new header, io
end
            

Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.