summaryrefslogtreecommitdiff
path: root/jni/ruby/test/rubygems/test_gem_package_tar_writer.rb
diff options
context:
space:
mode:
authorJari Vetoniemi <jari.vetoniemi@indooratlas.com>2020-03-16 18:49:26 +0900
committerJari Vetoniemi <jari.vetoniemi@indooratlas.com>2020-03-30 00:39:06 +0900
commitfcbf63e62c627deae76c1b8cb8c0876c536ed811 (patch)
tree64cb17de3f41a2b6fef2368028fbd00349946994 /jni/ruby/test/rubygems/test_gem_package_tar_writer.rb
Fresh start
Diffstat (limited to 'jni/ruby/test/rubygems/test_gem_package_tar_writer.rb')
-rw-r--r--jni/ruby/test/rubygems/test_gem_package_tar_writer.rb254
1 files changed, 254 insertions, 0 deletions
diff --git a/jni/ruby/test/rubygems/test_gem_package_tar_writer.rb b/jni/ruby/test/rubygems/test_gem_package_tar_writer.rb
new file mode 100644
index 0000000..f087df3
--- /dev/null
+++ b/jni/ruby/test/rubygems/test_gem_package_tar_writer.rb
@@ -0,0 +1,254 @@
+require 'rubygems/package/tar_test_case'
+require 'rubygems/package/tar_writer'
+require 'minitest/mock'
+
+class TestGemPackageTarWriter < Gem::Package::TarTestCase
+
+ def setup
+ super
+
+ @data = 'abcde12345'
+ @io = TempIO.new
+ @tar_writer = Gem::Package::TarWriter.new @io
+ end
+
+ def teardown
+ @tar_writer.close unless @tar_writer.closed?
+ @io.close!
+
+ super
+ end
+
+ def test_add_file
+ Time.stub :now, Time.at(1458518157) do
+ @tar_writer.add_file 'x', 0644 do |f| f.write 'a' * 10 end
+
+ assert_headers_equal(tar_file_header('x', '', 0644, 10, Time.now),
+ @io.string[0, 512])
+ end
+ assert_equal "aaaaaaaaaa#{"\0" * 502}", @io.string[512, 512]
+ assert_equal 1024, @io.pos
+ end
+
+ def test_add_file_digest
+ digest_algorithms = Digest::SHA1, Digest::SHA512
+
+ Time.stub :now, Time.at(1458518157) do
+ digests = @tar_writer.add_file_digest 'x', 0644, digest_algorithms do |io|
+ io.write 'a' * 10
+ end
+
+ assert_equal '3495ff69d34671d1e15b33a63c1379fdedd3a32a',
+ digests['SHA1'].hexdigest
+ assert_equal '4714870aff6c97ca09d135834fdb58a6389a50c1' \
+ '1fef8ec4afef466fb60a23ac6b7a9c92658f14df' \
+ '4993d6b40a4e4d8424196afc347e97640d68de61' \
+ 'e1cf14b0',
+ digests['SHA512'].hexdigest
+
+ assert_headers_equal(tar_file_header('x', '', 0644, 10, Time.now),
+ @io.string[0, 512])
+ end
+ assert_equal "aaaaaaaaaa#{"\0" * 502}", @io.string[512, 512]
+ assert_equal 1024, @io.pos
+ end
+
+ def test_add_file_digest_multiple
+ digest_algorithms = [Digest::SHA1, Digest::SHA512]
+
+ Time.stub :now, Time.at(1458518157) do
+ digests = @tar_writer.add_file_digest 'x', 0644, digest_algorithms do |io|
+ io.write 'a' * 10
+ end
+
+ assert_equal '3495ff69d34671d1e15b33a63c1379fdedd3a32a',
+ digests['SHA1'].hexdigest
+ assert_equal '4714870aff6c97ca09d135834fdb58a6389a50c1' \
+ '1fef8ec4afef466fb60a23ac6b7a9c92658f14df' \
+ '4993d6b40a4e4d8424196afc347e97640d68de61' \
+ 'e1cf14b0',
+ digests['SHA512'].hexdigest
+
+ assert_headers_equal(tar_file_header('x', '', 0644, 10, Time.now),
+ @io.string[0, 512])
+ end
+ assert_equal "aaaaaaaaaa#{"\0" * 502}", @io.string[512, 512]
+ assert_equal 1024, @io.pos
+ end
+
+ def test_add_file_signer
+ skip 'openssl is missing' unless defined?(OpenSSL::SSL)
+
+ signer = Gem::Security::Signer.new PRIVATE_KEY, [PUBLIC_CERT]
+
+ Time.stub :now, Time.at(1458518157) do
+ @tar_writer.add_file_signed 'x', 0644, signer do |io|
+ io.write 'a' * 10
+ end
+
+ assert_headers_equal(tar_file_header('x', '', 0644, 10, Time.now),
+ @io.string[0, 512])
+
+
+ assert_equal "aaaaaaaaaa#{"\0" * 502}", @io.string[512, 512]
+
+ digest = signer.digest_algorithm.new
+ digest.update 'a' * 10
+
+ signature = signer.sign digest.digest
+
+ assert_headers_equal(tar_file_header('x.sig', '', 0444, signature.length,
+ Time.now),
+ @io.string[1024, 512])
+ assert_equal "#{signature}#{"\0" * (512 - signature.length)}",
+ @io.string[1536, 512]
+
+ assert_equal 2048, @io.pos
+ end
+
+ end
+
+ def test_add_file_signer_empty
+ signer = Gem::Security::Signer.new nil, nil
+
+ Time.stub :now, Time.at(1458518157) do
+
+ @tar_writer.add_file_signed 'x', 0644, signer do |io|
+ io.write 'a' * 10
+ end
+
+ assert_headers_equal(tar_file_header('x', '', 0644, 10, Time.now),
+ @io.string[0, 512])
+ end
+ assert_equal "aaaaaaaaaa#{"\0" * 502}", @io.string[512, 512]
+
+ assert_equal 1024, @io.pos
+ end
+
+ def test_add_file_simple
+ Time.stub :now, Time.at(1458518157) do
+ @tar_writer.add_file_simple 'x', 0644, 10 do |io| io.write "a" * 10 end
+
+ assert_headers_equal(tar_file_header('x', '', 0644, 10, Time.now),
+ @io.string[0, 512])
+ end
+
+ assert_equal "aaaaaaaaaa#{"\0" * 502}", @io.string[512, 512]
+ assert_equal 1024, @io.pos
+ end
+
+ def test_add_file_simple_padding
+ Time.stub :now, Time.at(1458518157) do
+ @tar_writer.add_file_simple 'x', 0, 100
+
+ assert_headers_equal tar_file_header('x', '', 0, 100, Time.now),
+ @io.string[0, 512]
+ end
+
+ assert_equal "\0" * 512, @io.string[512, 512]
+ end
+
+ def test_add_file_simple_data
+ @tar_writer.add_file_simple("lib/foo/bar", 0, 10) { |f| f.write @data }
+ @tar_writer.flush
+
+ assert_equal @data + ("\0" * (512-@data.size)),
+ @io.string[512, 512]
+ end
+
+ def test_add_file_simple_size
+ assert_raises Gem::Package::TarWriter::FileOverflow do
+ @tar_writer.add_file_simple("lib/foo/bar", 0, 10) do |io|
+ io.write "1" * 11
+ end
+ end
+ end
+
+ def test_add_file_unseekable
+ assert_raises Gem::Package::NonSeekableIO do
+ Gem::Package::TarWriter.new(Object.new).add_file 'x', 0
+ end
+ end
+
+ def test_close
+ @tar_writer.close
+
+ assert_equal "\0" * 1024, @io.string
+
+ e = assert_raises IOError do
+ @tar_writer.close
+ end
+ assert_equal 'closed Gem::Package::TarWriter', e.message
+
+ e = assert_raises IOError do
+ @tar_writer.flush
+ end
+ assert_equal 'closed Gem::Package::TarWriter', e.message
+
+ e = assert_raises IOError do
+ @tar_writer.add_file 'x', 0
+ end
+ assert_equal 'closed Gem::Package::TarWriter', e.message
+
+ e = assert_raises IOError do
+ @tar_writer.add_file_simple 'x', 0, 0
+ end
+ assert_equal 'closed Gem::Package::TarWriter', e.message
+
+ e = assert_raises IOError do
+ @tar_writer.mkdir 'x', 0
+ end
+ assert_equal 'closed Gem::Package::TarWriter', e.message
+ end
+
+ def test_mkdir
+ Time.stub :now, Time.at(1458518157) do
+ @tar_writer.mkdir 'foo', 0644
+
+ assert_headers_equal tar_dir_header('foo', '', 0644, Time.now),
+ @io.string[0, 512]
+
+ assert_equal 512, @io.pos
+ end
+ end
+
+ def test_split_name
+ assert_equal ['b' * 100, 'a' * 155],
+ @tar_writer.split_name("#{'a' * 155}/#{'b' * 100}")
+
+ assert_equal ["#{'qwer/' * 19}bla", 'a' * 151],
+ @tar_writer.split_name("#{'a' * 151}/#{'qwer/' * 19}bla")
+ end
+
+ def test_split_name_too_long_name
+ name = File.join 'a', 'b' * 100
+ assert_equal ['b' * 100, 'a'], @tar_writer.split_name(name)
+
+ name = File.join 'a', 'b' * 101
+ exception = assert_raises Gem::Package::TooLongFileName do
+ @tar_writer.split_name name
+ end
+ assert_includes exception.message, name
+ end
+
+ def test_split_name_too_long_prefix
+ name = File.join 'a' * 155, 'b'
+ assert_equal ['b', 'a' * 155], @tar_writer.split_name(name)
+
+ name = File.join 'a' * 156, 'b'
+ exception = assert_raises Gem::Package::TooLongFileName do
+ @tar_writer.split_name name
+ end
+ assert_includes exception.message, name
+ end
+
+ def test_split_name_too_long_total
+ name = 'a' * 257
+ exception = assert_raises Gem::Package::TooLongFileName do
+ @tar_writer.split_name name
+ end
+ assert_includes exception.message, name
+ end
+
+end
+