summaryrefslogtreecommitdiff
path: root/test/rubygems/test_gem_package_tar_output.rb
blob: 01b4a0fa3a29a8c62efa03469b9290e3f8c63412 (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
######################################################################
# This file is imported from the rubygems project.
# DO NOT make modifications in this repo. They _will_ be reverted!
# File a patch instead and assign it to Ryan Davis or Eric Hodel.
######################################################################

require 'rubygems/package/tar_test_case'
require 'rubygems/package/tar_output'
require 'rubygems/security'

class TestGemPackageTarOutput < Gem::Package::TarTestCase

  def setup
    super

    @file = File.join @tempdir, 'bla2.tar'
  end

  def test_self_open
    open @file, 'wb' do |tar_io|
      Gem::Package::TarOutput.open tar_io do |tar_writer|
        tar_writer.add_file_simple 'README', 0, 17 do |io|
          io.write "This is a README\n"
        end

        tar_writer.metadata = "This is some metadata\n"
      end
    end

    files = util_extract

    name, data = files.shift
    assert_equal 'data.tar.gz', name

    gz = Zlib::GzipReader.new StringIO.new(data)

    Gem::Package::TarReader.new gz do |tar_reader|
      tar_reader.each do |entry|
        assert_equal 'README', entry.full_name
        assert_equal "This is a README\n", entry.read
      end
    end

    gz.close

    name, data = files.shift
    assert_equal 'metadata.gz', name

    gz = Zlib::GzipReader.new StringIO.new(data)
    assert_equal "This is some metadata\n", gz.read

    assert_empty files
  ensure
    gz.close if gz
  end

  if defined? OpenSSL then
    def test_self_open_signed
      @private_key = File.expand_path('test/rubygems/private_key.pem', @@project_dir)
      @public_cert = File.expand_path('test/rubygems/public_cert.pem', @@project_dir)

      signer = Gem::Security::Signer.new @private_key, [@public_cert]

      open @file, 'wb' do |tar_io|
        Gem::Package::TarOutput.open tar_io, signer do |tar_writer|
          tar_writer.add_file_simple 'README', 0, 17 do |io|
            io.write "This is a README\n"
          end

          tar_writer.metadata = "This is some metadata\n"
        end
      end

      files = util_extract

      name, data = files.shift
      assert_equal 'data.tar.gz', name

      name, data = files.shift
      assert_equal 'metadata.gz', name

      name, data = files.shift
      assert_equal 'data.tar.gz.sig', name

      name, data = files.shift
      assert_equal 'metadata.gz.sig', name

      assert_empty files
    end
  end

  def util_extract
    files = []

    open @file, 'rb' do |io|
      Gem::Package::TarReader.new io do |tar_reader|
        tar_reader.each do |entry|
          files << [entry.full_name, entry.read]
        end
      end
    end

    files
  end

end