1+ # frozen_string_literal: true
2+ require_relative "package/tar_test_case"
3+
4+ class TestGemPackageTarHeaderRactor < Gem ::Package ::TarTestCase
5+ ASSERT_HEADERS_EQUAL = <<~RUBY
6+ def assert_headers_equal(expected, actual)
7+ expected = expected.to_s unless String === expected
8+ actual = actual.to_s unless String === actual
9+
10+ fields = %w[
11+ name 100
12+ mode 8
13+ uid 8
14+ gid 8
15+ size 12
16+ mtime 12
17+ checksum 8
18+ typeflag 1
19+ linkname 100
20+ magic 6
21+ version 2
22+ uname 32
23+ gname 32
24+ devmajor 8
25+ devminor 8
26+ prefix 155
27+ ]
28+
29+ offset = 0
30+
31+ until fields.empty? do
32+ name = fields.shift
33+ length = fields.shift.to_i
34+
35+ if name == "checksum"
36+ chksum_off = offset
37+ offset += length
38+ next
39+ end
40+
41+ assert_equal expected[offset, length], actual[offset, length]
42+
43+ offset += length
44+ end
45+
46+ assert_equal expected[chksum_off, 8], actual[chksum_off, 8]
47+ end
48+ RUBY
49+
50+ SETUP = <<~RUBY
51+ header = {
52+ name: "x",
53+ mode: 0o644,
54+ uid: 1000,
55+ gid: 10_000,
56+ size: 100,
57+ mtime: 12_345,
58+ typeflag: "0",
59+ linkname: "link",
60+ uname: "user",
61+ gname: "group",
62+ devmajor: 1,
63+ devminor: 2,
64+ prefix: "y",
65+ }
66+
67+ tar_header = Gem::Package::TarHeader.new header
68+ RUBY
69+
70+ def test_decode_in_ractor
71+ assert_ractor ( ASSERT_HEADERS_EQUAL + SETUP + <<~RUBY , require : [ "rubygems/package" , "stringio" ] )
72+ new_header = Ractor.new(tar_header.to_s) do |str|
73+ Gem::Package::TarHeader.from StringIO.new str
74+ end.value
75+
76+ assert_headers_equal tar_header, new_header
77+ RUBY
78+ end
79+
80+ def test_encode_in_ractor
81+ assert_ractor ( ASSERT_HEADERS_EQUAL + SETUP + <<~RUBY , require : [ "rubygems/package" , "stringio" ] )
82+ header_bytes = tar_header.to_s
83+
84+ new_header_bytes = Ractor.new(header_bytes) do |str|
85+ new_header = Gem::Package::TarHeader.from StringIO.new str
86+ new_header.to_s
87+ end.value
88+
89+ assert_headers_equal header_bytes, new_header_bytes
90+ RUBY
91+ end
92+ end
0 commit comments