diff options
Diffstat (limited to 'test/rubygems/test_gem_package_tar_reader.rb')
-rw-r--r-- | test/rubygems/test_gem_package_tar_reader.rb | 81 |
1 files changed, 72 insertions, 9 deletions
diff --git a/test/rubygems/test_gem_package_tar_reader.rb b/test/rubygems/test_gem_package_tar_reader.rb index 277b552f1b..b2f7cc2d5c 100644 --- a/test/rubygems/test_gem_package_tar_reader.rb +++ b/test/rubygems/test_gem_package_tar_reader.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true -require_relative 'package/tar_test_case' -require 'rubygems/package' + +require_relative "package/tar_test_case" +require "rubygems/package" class TestGemPackageTarReader < Gem::Package::TarTestCase def test_each_entry @@ -24,12 +25,27 @@ class TestGemPackageTarReader < Gem::Package::TarTestCase io.close! end + def test_each_with_not_a_tar + text = "Hello, world!!?\n" * 256 # 4 KiB + io = TempIO.new text + + Gem::Package::TarReader.new io do |tar| + assert_raise Gem::Package::TarInvalidError do + tar.each do + flunk "TarInvalidError was expected to occur, but an entry was found" + end + end + end + ensure + io.close! + end + def test_rewind - content = ('a'..'z').to_a.join(" ") + content = ("a".."z").to_a.join(" ") str = - tar_file_header("lib/foo", "", 010644, content.size, Time.now) + - content + "\0" * (512 - content.size) + tar_file_header("lib/foo", "", 0o10644, content.size, Time.now) + + content + "\0" * (512 - content.size) str << "\0" * 1024 io = TempIO.new(str) @@ -56,12 +72,14 @@ class TestGemPackageTarReader < Gem::Package::TarTestCase io = TempIO.new tar Gem::Package::TarReader.new io do |tar_reader| - tar_reader.seek 'baz/bar' do |entry| + retval = tar_reader.seek "baz/bar" do |entry| assert_kind_of Gem::Package::TarReader::Entry, entry - assert_equal 'baz/bar', entry.full_name + assert_equal "baz/bar", entry.full_name + entry.read end + assert_equal "", retval assert_equal 0, io.pos end ensure @@ -75,8 +93,8 @@ class TestGemPackageTarReader < Gem::Package::TarTestCase io = TempIO.new tar Gem::Package::TarReader.new io do |tar_reader| - tar_reader.seek 'nonexistent' do |entry| - flunk 'entry missing but entry-found block was run' + tar_reader.seek "nonexistent" do |_entry| + flunk "entry missing but entry-found block was run" end assert_equal 0, io.pos @@ -84,4 +102,49 @@ class TestGemPackageTarReader < Gem::Package::TarTestCase ensure io.close! end + + def test_read_in_gem_data + gem_tar = util_gem_data_tar do |tar| + tar.add_file "lib/code.rb", 0o444 do |io| + io.write "# lib/code.rb" + end + end + + count = 0 + Gem::Package::TarReader.new(gem_tar).each do |entry| + next unless entry.full_name == "data.tar.gz" + + Zlib::GzipReader.wrap entry do |gzio| + Gem::Package::TarReader.new(gzio).each do |contents_entry| + assert_equal "# lib/code.rb", contents_entry.read + count += 1 + end + end + end + + assert_equal 1, count, "should have found one file" + end + + def test_seek_in_gem_data + gem_tar = util_gem_data_tar do |tar| + tar.add_file "lib/code.rb", 0o444 do |io| + io.write "# lib/code.rb" + end + tar.add_file "lib/foo.rb", 0o444 do |io| + io.write "# lib/foo.rb" + end + end + + count = 0 + Gem::Package::TarReader.new(gem_tar).seek("data.tar.gz") do |entry| + Zlib::GzipReader.wrap entry do |gzio| + Gem::Package::TarReader.new(gzio).seek("lib/foo.rb") do |contents_entry| + assert_equal "# lib/foo.rb", contents_entry.read + count += 1 + end + end + end + + assert_equal 1, count, "should have found one file" + end end |