File: test_pax_header.rb

package info (click to toggle)
ruby-minitar 1.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 364 kB
  • sloc: ruby: 2,602; makefile: 11
file content (104 lines) | stat: -rw-r--r-- 3,787 bytes parent folder | download
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
require "minitest_helper"

class TestPaxHeader < Minitest::Test
  def test_from_stream_with_size_attribute
    pax_content = "19 size=8614356715\n28 mtime=1749098832.3200000\n"
    pax_header = create_pax_header_from_stream(pax_content)

    assert_equal 8614356715, pax_header.size
    assert_equal "1749098832.3200000", pax_header.attributes["mtime"]
  end

  def test_from_stream_without_size_attribute
    pax_content = "28 mtime=1749098832.3200000\n27 path=some/long/path.txt\n"
    pax_header = create_pax_header_from_stream(pax_content)

    assert_nil pax_header.size
    assert_equal "some/long/path.txt", pax_header.path
    assert_equal 1749098832.32, pax_header.mtime
  end

  def test_parse_multiline_values
    pax_content = "22 foo=one\ntwo\nthree\n\n12 bar=four\n"
    pax_header = Minitar::PaxHeader.from_data(pax_content)
    assert_equal "one\ntwo\nthree\n", pax_header.attributes["foo"]
    assert_equal "four", pax_header.attributes["bar"]
  end

  def test_from_stream_with_invalid_header
    header_data = build_tar_file_header("regular_file.txt", "", 0o644, 100)
    io = StringIO.new(header_data)

    posix_header = Minitar::PosixHeader.from_stream(io)
    refute posix_header.pax_header?

    assert_raises(ArgumentError, "Header must be a PAX header") do
      Minitar::PaxHeader.from_stream(io, posix_header)
    end
  end

  def test_parse_content_with_multiple_attributes
    pax_content = "19 size=8614356715\n28 mtime=1749098832.3200000\n27 path=some/long/path.txt\n"

    pax_header = Minitar::PaxHeader.from_data(pax_content)

    assert_equal 8614356715, pax_header.size
    assert_equal "some/long/path.txt", pax_header.path
    assert_equal 1749098832.32, pax_header.mtime

    # Check raw attributes
    assert_equal "8614356715", pax_header.attributes["size"]
    assert_equal "1749098832.3200000", pax_header.attributes["mtime"]
    assert_equal "some/long/path.txt", pax_header.attributes["path"]
  end

  def test_parse_content_with_invalid_length_format
    assert_raises(ArgumentError) do
      Minitar::PaxHeader.from_data("19 size=8614356715\ninvalid line\n23 path=valid/path.txt\n")
    end
  end

  def test_parse_content_with_oversized_record
    assert_raises(ArgumentError) do
      Minitar::PaxHeader.from_data("19 size=8614356715\n999 toolong=value\n")
    end
  end

  def test_from_stream_strips_padding
    pax_content = "19 size=8614356715\n"
    pax_header = create_pax_header_from_stream(pax_content)

    # Should parse only the actual content, ignoring padding
    assert_equal 8614356715, pax_header.size
    assert_equal 1, pax_header.attributes.size  # Only one attribute parsed

    # Should have parsed content correctly
    assert_equal 1, pax_header.attributes.size
    assert_equal "8614356715", pax_header.attributes["size"]
  end

  def test_attributes_accessor
    pax_content = "19 size=8614356715\n23 custom=custom_value\n"
    pax_header = Minitar::PaxHeader.from_data(pax_content)

    assert_equal "8614356715", pax_header.attributes["size"]
    assert_equal "custom_value", pax_header.attributes["custom"]
    assert_nil pax_header.attributes["nonexistent"]
  end

  def test_pax_header_to_s
    pax_header = Minitar::PaxHeader.new(size: "8614356715", mtime: "1749098832.3200000")
    assert_equal "19 size=8614356715\n28 mtime=1749098832.3200000\n", pax_header.to_s
  end

  private

  def create_pax_header_from_stream(pax_content, name = "./PaxHeaders.X/test_file")
    pax_header_data = build_tar_pax_header(name, "", pax_content.bytesize)
    padded_content = pax_content.ljust((pax_content.bytesize / 512.0).ceil * 512, "\0")
    io = StringIO.new(pax_header_data + padded_content)

    posix_header = Minitar::PosixHeader.from_stream(io)
    Minitar::PaxHeader.from_stream(io, posix_header)
  end
end