1require 'rubygems/package/tar_test_case'
2require 'rubygems/package'
3
4class TestGemPackageTarReader < Gem::Package::TarTestCase
5
6  def test_each_entry
7    tar = tar_dir_header "foo", "bar", 0
8    tar << tar_file_header("bar", "baz", 0, 0)
9
10    io = TempIO.new tar
11
12    entries = 0
13
14    Gem::Package::TarReader.new io do |tar_reader|
15      tar_reader.each_entry do |entry|
16        assert_kind_of Gem::Package::TarReader::Entry, entry
17
18        entries += 1
19      end
20    end
21
22    assert_equal 2, entries
23  end
24
25  def test_rewind
26    content = ('a'..'z').to_a.join(" ")
27
28    str = tar_file_header("lib/foo", "", 010644, content.size) + content +
29            "\0" * (512 - content.size)
30    str << "\0" * 1024
31
32    Gem::Package::TarReader.new(TempIO.new(str)) do |tar_reader|
33      3.times do
34        tar_reader.rewind
35        i = 0
36        tar_reader.each_entry do |entry|
37          assert_equal(content, entry.read)
38          i += 1
39        end
40        assert_equal(1, i)
41      end
42    end
43  end
44
45  def test_seek
46    tar = tar_dir_header "foo", "bar", 0
47    tar << tar_file_header("bar", "baz", 0, 0)
48
49    io = TempIO.new tar
50
51    Gem::Package::TarReader.new io do |tar_reader|
52      tar_reader.seek 'baz/bar' do |entry|
53        assert_kind_of Gem::Package::TarReader::Entry, entry
54
55        assert_equal 'baz/bar', entry.full_name
56      end
57
58      assert_equal 0, io.pos
59    end
60  end
61
62  def test_seek_missing
63    tar = tar_dir_header "foo", "bar", 0
64    tar << tar_file_header("bar", "baz", 0, 0)
65
66    io = TempIO.new tar
67
68    Gem::Package::TarReader.new io do |tar_reader|
69      tar_reader.seek 'nonexistent' do |entry|
70        flunk 'entry missing but entry-found block was run'
71      end
72
73      assert_equal 0, io.pos
74    end
75  end
76
77end
78
79