summaryrefslogtreecommitdiff
path: root/test/rubygems/test_gem_package_tar_header.rb
blob: da4f5506e91a08db379af8627d3c5dd6024884c1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
# frozen_string_literal: true
require 'rubygems/package/tar_test_case'
require 'rubygems/package'

class TestGemPackageTarHeader < Gem::Package::TarTestCase
  def setup
    super

    header = {
      :name     => 'x',
      :mode     => 0644,
      :uid      => 1000,
      :gid      => 10000,
      :size     => 100,
      :mtime    => 12345,
      :typeflag => '0',
      :linkname => 'link',
      :uname    => 'user',
      :gname    => 'group',
      :devmajor => 1,
      :devminor => 2,
      :prefix   => 'y',
    }

    @tar_header = Gem::Package::TarHeader.new header
  end

  def test_self_from
    io = TempIO.new @tar_header.to_s

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

    assert_headers_equal @tar_header, new_header
  ensure
    io.close!
  end

  def test_initialize
    assert_equal '',      @tar_header.checksum, 'checksum'
    assert_equal 1,       @tar_header.devmajor, 'devmajor'
    assert_equal 2,       @tar_header.devminor, 'devminor'
    assert_equal 10000,   @tar_header.gid,      'gid'
    assert_equal 'group', @tar_header.gname,    'gname'
    assert_equal 'link',  @tar_header.linkname, 'linkname'
    assert_equal 'ustar', @tar_header.magic,    'magic'
    assert_equal 0644,    @tar_header.mode,     'mode'
    assert_equal 12345,   @tar_header.mtime,    'mtime'
    assert_equal 'x',     @tar_header.name,     'name'
    assert_equal 'y',     @tar_header.prefix,   'prefix'
    assert_equal 100,     @tar_header.size,     'size'
    assert_equal '0',     @tar_header.typeflag, 'typeflag'
    assert_equal 1000,    @tar_header.uid,      'uid'
    assert_equal 'user',  @tar_header.uname,    'uname'
    assert_equal '00',    @tar_header.version,  'version'

    refute_empty @tar_header, 'empty'
  end

  def test_initialize_bad
    assert_raises ArgumentError do
      Gem::Package::TarHeader.new :name => '', :size => '', :mode => ''
    end

    assert_raises ArgumentError do
      Gem::Package::TarHeader.new :name => '', :size => '', :prefix => ''
    end

    assert_raises ArgumentError do
      Gem::Package::TarHeader.new :name => '', :prefix => '', :mode => ''
    end

    assert_raises ArgumentError do
      Gem::Package::TarHeader.new :prefix => '', :size => '', :mode => ''
    end
  end

  def test_initialize_typeflag
    header = {
      :mode     => '',
      :name     => '',
      :prefix   => '',
      :size     => '',
      :typeflag => '',
    }

    tar_header = Gem::Package::TarHeader.new header

    assert_equal '0', tar_header.typeflag
  end

  def test_empty_eh
    refute_empty @tar_header

    @tar_header = Gem::Package::TarHeader.new :name => 'x', :prefix => '',
                                              :mode => 0, :size => 0,
                                              :empty => true

    assert_empty @tar_header
  end

  def test_equals2
    assert_equal @tar_header, @tar_header
    assert_equal @tar_header, @tar_header.dup
  end

  def test_to_s
    expected = <<-EOF.split("\n").join
x\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\000\000\000\0000000644\0000001750\0000023420\00000000000144\00000000030071
\000012467\000 0link\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000ustar\00000user\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
group\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000\000\0000000001\0000000002\000y\000\000\000\000
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000\000\000\000
    EOF

    assert_headers_equal expected, @tar_header
  end

  def test_update_checksum
    assert_equal '', @tar_header.checksum

    @tar_header.update_checksum

    assert_equal '012467', @tar_header.checksum
  end

  def test_from_bad_octal
    test_cases = [
      "00000006,44\000", # bogus character
      "00000006789\000", # non-octal digit
      "+0000001234\000", # positive sign
      "-0000001000\000", # negative sign
      "0x000123abc\000", # radix prefix
    ]

    test_cases.each do |val|
      header_s = @tar_header.to_s
      # overwrite the size field
      header_s[124, 12] = val
      io = TempIO.new header_s
      assert_raises ArgumentError do
        Gem::Package::TarHeader.from io
      end
      io.close!
    end
  end

  def test_big_uid_gid
    stream = StringIO.new(
      <<-EOF.dup.force_encoding('binary').split("\n").join
GeoIP2-City_20190528/
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000000755\x00\x80\x00
\x00\x00v\xB2Z\x9E\x80\x00\x00\x00v\xB2Z\x9E00000000000\x0013473270100\x00015424
\x00 5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00ustar  \x00
tjmather\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00tjmather\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00
      EOF
    )

    tar_header = Gem::Package::TarHeader.from stream

    assert_equal 1991400094, tar_header.uid
    assert_equal 1991400094, tar_header.gid

    assert_equal 'GeoIP2-City_20190528/', tar_header.name
    assert_equal 0755, tar_header.mode
    assert_equal 0, tar_header.size
    assert_equal 1559064640, tar_header.mtime
    assert_equal 6932, tar_header.checksum
  end

  def test_spaces_in_headers
    stream = StringIO.new(
      <<-EOF.dup.force_encoding('binary').split("\n").join
Access_Points_09202018.csv
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00
\x00\x00100777 \x00     0 \x00     0 \x00       4357 13545040367  104501
\x000
      EOF
    )

    tar_header = Gem::Package::TarHeader.from stream

    assert_equal 0, tar_header.uid
    assert_equal 0, tar_header.gid
  end
end