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

  def test_verify_duplicate_file
    FileUtils.mkdir_p 'lib'
    FileUtils.touch 'lib/code.rb'

    build = Gem::Package.new @gem
    build.spec = @spec
    build.setup_signer
    open @gem, 'wb' do |gem_io|
      Gem::Package::TarWriter.new gem_io do |gem|
        build.add_metadata gem
        build.add_contents gem

        gem.add_file_simple 'a.sig', 0444, 0
        gem.add_file_simple 'a.sig', 0444, 0
      end
    end

    package = Gem::Package.new @gem

    e = assert_raises Gem::Security::Exception do
      package.verify
    end

    assert_equal 'duplicate files in the package: ("a.sig")', e.message
  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

