diff options
Diffstat (limited to 'test/rubygems/test_gem_request.rb')
-rw-r--r-- | test/rubygems/test_gem_request.rb | 223 |
1 files changed, 111 insertions, 112 deletions
diff --git a/test/rubygems/test_gem_request.rb b/test/rubygems/test_gem_request.rb index 66477be7bc..5e9b264dac 100644 --- a/test/rubygems/test_gem_request.rb +++ b/test/rubygems/test_gem_request.rb @@ -1,25 +1,31 @@ # frozen_string_literal: true -require_relative 'helper' -require 'rubygems/request' -require 'ostruct' -require 'base64' + +require_relative "helper" +require "rubygems/request" +require "ostruct" unless Gem::HAVE_OPENSSL - warn 'Skipping Gem::Request tests. openssl not found.' + warn "Skipping Gem::Request tests. openssl not found." end class TestGemRequest < Gem::TestCase - CA_CERT_FILE = cert_path 'ca' - CHILD_CERT = load_cert 'child' - EXPIRED_CERT = load_cert 'expired' - PUBLIC_CERT = load_cert 'public' - PUBLIC_CERT_FILE = cert_path 'public' - SSL_CERT = load_cert 'ssl' + CA_CERT_FILE = cert_path "ca" + CHILD_CERT = load_cert "child" + EXPIRED_CERT = load_cert "expired" + PUBLIC_CERT = load_cert "public" + PUBLIC_CERT_FILE = cert_path "public" + SSL_CERT = load_cert "ssl" def make_request(uri, request_class, last_modified, proxy) Gem::Request.create_with_proxy uri, request_class, last_modified, proxy end + # This method is same code as Base64.encode64 + # We should not use Base64.encode64 because we need to avoid gem activation. + def base64_encode64(bin) + [bin].pack("m") + end + def setup @proxies = %w[http_proxy https_proxy HTTP_PROXY http_proxy_user HTTP_PROXY_USER http_proxy_pass HTTP_PROXY_PASS no_proxy NO_PROXY] @old_proxies = @proxies.map {|k| ENV[k] } @@ -28,7 +34,7 @@ class TestGemRequest < Gem::TestCase super @proxy_uri = "http://localhost:1234" - @uri = URI('http://example') + @uri = Gem::URI("http://example") @request = make_request @uri, nil, nil, nil end @@ -40,7 +46,7 @@ class TestGemRequest < Gem::TestCase end def test_initialize_proxy - proxy_uri = 'http://proxy.example.com' + proxy_uri = "http://proxy.example.com" request = make_request @uri, nil, nil, proxy_uri @@ -48,41 +54,41 @@ class TestGemRequest < Gem::TestCase end def test_initialize_proxy_URI - proxy_uri = 'http://proxy.example.com' + proxy_uri = "http://proxy.example.com" - request = make_request @uri, nil, nil, URI(proxy_uri) + request = make_request @uri, nil, nil, Gem::URI(proxy_uri) assert_equal proxy_uri, request.proxy_uri.to_s end def test_initialize_proxy_ENV - ENV['http_proxy'] = @proxy_uri - ENV['http_proxy_user'] = 'foo' - ENV['http_proxy_pass'] = 'bar' + ENV["http_proxy"] = @proxy_uri + ENV["http_proxy_user"] = "foo" + ENV["http_proxy_pass"] = "bar" request = make_request @uri, nil, nil, nil proxy = request.proxy_uri - assert_equal 'foo', proxy.user - assert_equal 'bar', proxy.password + assert_equal "foo", proxy.user + assert_equal "bar", proxy.password end def test_initialize_proxy_ENV_https - ENV['https_proxy'] = @proxy_uri + ENV["https_proxy"] = @proxy_uri - request = make_request URI('https://example'), nil, nil, nil + request = make_request Gem::URI("https://example"), nil, nil, nil proxy = request.proxy_uri - assert_equal URI(@proxy_uri), proxy + assert_equal Gem::URI(@proxy_uri), proxy end def test_proxy_ENV - ENV['http_proxy'] = "http://proxy" - ENV['https_proxy'] = "" + ENV["http_proxy"] = "http://proxy" + ENV["https_proxy"] = "" - request = make_request URI('https://example'), nil, nil, nil + request = make_request Gem::URI("https://example"), nil, nil, nil proxy = request.proxy_uri @@ -90,13 +96,13 @@ class TestGemRequest < Gem::TestCase end def test_configure_connection_for_https - connection = Net::HTTP.new 'localhost', 443 + connection = Gem::Net::HTTP.new "localhost", 443 request = Class.new(Gem::Request) do def self.get_cert_files [TestGemRequest::PUBLIC_CERT_FILE] end - end.create_with_proxy URI('https://example'), nil, nil, nil + end.create_with_proxy Gem::URI("https://example"), nil, nil, nil Gem::Request.configure_connection_for_https connection, request.cert_files @@ -106,16 +112,16 @@ class TestGemRequest < Gem::TestCase end def test_configure_connection_for_https_ssl_ca_cert - ssl_ca_cert, Gem.configuration.ssl_ca_cert = - Gem.configuration.ssl_ca_cert, CA_CERT_FILE + ssl_ca_cert = Gem.configuration.ssl_ca_cert + Gem.configuration.ssl_ca_cert = CA_CERT_FILE - connection = Net::HTTP.new 'localhost', 443 + connection = Gem::Net::HTTP.new "localhost", 443 request = Class.new(Gem::Request) do def self.get_cert_files [TestGemRequest::PUBLIC_CERT_FILE] end - end.create_with_proxy URI('https://example'), nil, nil, nil + end.create_with_proxy Gem::URI("https://example"), nil, nil, nil Gem::Request.configure_connection_for_https connection, request.cert_files @@ -128,66 +134,66 @@ class TestGemRequest < Gem::TestCase end def test_get_proxy_from_env_fallback - ENV['http_proxy'] = @proxy_uri + ENV["http_proxy"] = @proxy_uri request = make_request @uri, nil, nil, nil proxy = request.proxy_uri - assert_equal URI(@proxy_uri), proxy + assert_equal Gem::URI(@proxy_uri), proxy end def test_get_proxy_from_env_https - ENV['https_proxy'] = @proxy_uri - uri = URI('https://example') + ENV["https_proxy"] = @proxy_uri + uri = Gem::URI("https://example") request = make_request uri, nil, nil, nil proxy = request.proxy_uri - assert_equal URI(@proxy_uri), proxy + assert_equal Gem::URI(@proxy_uri), proxy end def test_get_proxy_from_env_domain - ENV['http_proxy'] = @proxy_uri - ENV['http_proxy_user'] = 'foo\user' - ENV['http_proxy_pass'] = 'my bar' + ENV["http_proxy"] = @proxy_uri + ENV["http_proxy_user"] = 'foo\user' + ENV["http_proxy_pass"] = "my bar" request = make_request @uri, nil, nil, nil proxy = request.proxy_uri assert_equal 'foo\user', Gem::UriFormatter.new(proxy.user).unescape - assert_equal 'my bar', Gem::UriFormatter.new(proxy.password).unescape + assert_equal "my bar", Gem::UriFormatter.new(proxy.password).unescape end def test_get_proxy_from_env_escape - ENV['http_proxy'] = @proxy_uri - ENV['http_proxy_user'] = 'foo@user' - ENV['http_proxy_pass'] = 'my@bar' + ENV["http_proxy"] = @proxy_uri + ENV["http_proxy_user"] = "foo@user" + ENV["http_proxy_pass"] = "my@bar" request = make_request @uri, nil, nil, nil proxy = request.proxy_uri - assert_equal 'foo%40user', proxy.user - assert_equal 'my%40bar', proxy.password + assert_equal "foo%40user", proxy.user + assert_equal "my%40bar", proxy.password end def test_get_proxy_from_env_normalize - ENV['HTTP_PROXY'] = 'fakeurl:12345' + ENV["HTTP_PROXY"] = "fakeurl:12345" request = make_request @uri, nil, nil, nil - assert_equal 'http://fakeurl:12345', request.proxy_uri.to_s + assert_equal "http://fakeurl:12345", request.proxy_uri.to_s end def test_get_proxy_from_env_empty - ENV['HTTP_PROXY'] = '' - ENV.delete 'http_proxy' + ENV["HTTP_PROXY"] = "" + ENV.delete "http_proxy" request = make_request @uri, nil, nil, nil assert_nil request.proxy_uri end def test_fetch - uri = Gem::Uri.new(URI.parse "#{@gem_repo}/specs.#{Gem.marshal_version}") - response = util_stub_net_http(:body => :junk, :code => 200) do - @request = make_request(uri, Net::HTTP::Get, nil, nil) + uri = Gem::Uri.new(Gem::URI.parse("#{@gem_repo}/specs.#{Gem.marshal_version}")) + response = util_stub_net_http(body: :junk, code: 200) do + @request = make_request(uri, Gem::Net::HTTP::Get, nil, nil) @request.fetch end @@ -198,79 +204,79 @@ class TestGemRequest < Gem::TestCase def test_fetch_basic_auth Gem.configuration.verbose = :really - uri = Gem::Uri.new(URI.parse "https://user:pass@example.rubygems/specs.#{Gem.marshal_version}") - conn = util_stub_net_http(:body => :junk, :code => 200) do |c| + uri = Gem::Uri.new(Gem::URI.parse("https://user:pass@example.rubygems/specs.#{Gem.marshal_version}")) + conn = util_stub_net_http(body: :junk, code: 200) do |c| use_ui @ui do - @request = make_request(uri, Net::HTTP::Get, nil, nil) + @request = make_request(uri, Gem::Net::HTTP::Get, nil, nil) @request.fetch end c end - auth_header = conn.payload['Authorization'] - assert_equal "Basic #{Base64.encode64('user:pass')}".strip, auth_header + auth_header = conn.payload["Authorization"] + assert_equal "Basic #{base64_encode64("user:pass")}".strip, auth_header assert_includes @ui.output, "GET https://user:REDACTED@example.rubygems/specs.#{Gem.marshal_version}" end def test_fetch_basic_auth_encoded Gem.configuration.verbose = :really - uri = Gem::Uri.new(URI.parse "https://user:%7BDEScede%7Dpass@example.rubygems/specs.#{Gem.marshal_version}") + uri = Gem::Uri.new(Gem::URI.parse("https://user:%7BDEScede%7Dpass@example.rubygems/specs.#{Gem.marshal_version}")) - conn = util_stub_net_http(:body => :junk, :code => 200) do |c| + conn = util_stub_net_http(body: :junk, code: 200) do |c| use_ui @ui do - @request = make_request(uri, Net::HTTP::Get, nil, nil) + @request = make_request(uri, Gem::Net::HTTP::Get, nil, nil) @request.fetch end c end - auth_header = conn.payload['Authorization'] - assert_equal "Basic #{Base64.encode64('user:{DEScede}pass')}".strip, auth_header + auth_header = conn.payload["Authorization"] + assert_equal "Basic #{base64_encode64("user:{DEScede}pass")}".strip, auth_header assert_includes @ui.output, "GET https://user:REDACTED@example.rubygems/specs.#{Gem.marshal_version}" end def test_fetch_basic_oauth_encoded Gem.configuration.verbose = :really - uri = Gem::Uri.new(URI.parse "https://%7BDEScede%7Dpass:x-oauth-basic@example.rubygems/specs.#{Gem.marshal_version}") + uri = Gem::Uri.new(Gem::URI.parse("https://%7BDEScede%7Dpass:x-oauth-basic@example.rubygems/specs.#{Gem.marshal_version}")) - conn = util_stub_net_http(:body => :junk, :code => 200) do |c| + conn = util_stub_net_http(body: :junk, code: 200) do |c| use_ui @ui do - @request = make_request(uri, Net::HTTP::Get, nil, nil) + @request = make_request(uri, Gem::Net::HTTP::Get, nil, nil) @request.fetch end c end - auth_header = conn.payload['Authorization'] - assert_equal "Basic #{Base64.encode64('{DEScede}pass:x-oauth-basic')}".strip, auth_header + auth_header = conn.payload["Authorization"] + assert_equal "Basic #{base64_encode64("{DEScede}pass:x-oauth-basic")}".strip, auth_header assert_includes @ui.output, "GET https://REDACTED:x-oauth-basic@example.rubygems/specs.#{Gem.marshal_version}" end def test_fetch_head - uri = Gem::Uri.new(URI.parse "#{@gem_repo}/specs.#{Gem.marshal_version}") - response = util_stub_net_http(:body => '', :code => 200) do |conn| - @request = make_request(uri, Net::HTTP::Get, nil, nil) + uri = Gem::Uri.new(Gem::URI.parse("#{@gem_repo}/specs.#{Gem.marshal_version}")) + response = util_stub_net_http(body: "", code: 200) do |_conn| + @request = make_request(uri, Gem::Net::HTTP::Get, nil, nil) @request.fetch end assert_equal 200, response.code - assert_equal '', response.body + assert_equal "", response.body end def test_fetch_unmodified - uri = Gem::Uri.new(URI.parse "#{@gem_repo}/specs.#{Gem.marshal_version}") + uri = Gem::Uri.new(Gem::URI.parse("#{@gem_repo}/specs.#{Gem.marshal_version}")) t = Time.utc(2013, 1, 2, 3, 4, 5) - conn, response = util_stub_net_http(:body => '', :code => 304) do |c| - @request = make_request(uri, Net::HTTP::Get, t, nil) + conn, response = util_stub_net_http(body: "", code: 304) do |c| + @request = make_request(uri, Gem::Net::HTTP::Get, t, nil) [c, @request.fetch] end assert_equal 304, response.code - assert_equal '', response.body + assert_equal "", response.body - modified_header = conn.payload['if-modified-since'] + modified_header = conn.payload["if-modified-since"] - assert_equal 'Wed, 02 Jan 2013 03:04:05 GMT', modified_header + assert_equal "Wed, 02 Jan 2013 03:04:05 GMT", modified_header end def test_user_agent @@ -280,18 +286,18 @@ class TestGemRequest < Gem::TestCase assert_match %r{RubyGems/#{Regexp.escape Gem::VERSION}}, ua assert_match %r{ #{Regexp.escape Gem::Platform.local.to_s} }, ua assert_match %r{Ruby/#{Regexp.escape RUBY_VERSION}}, ua - assert_match %r{\(#{Regexp.escape RUBY_RELEASE_DATE} }, ua + assert_match(/\(#{Regexp.escape RUBY_RELEASE_DATE} /, ua) end def test_user_agent_engine util_save_version Object.send :remove_const, :RUBY_ENGINE - Object.send :const_set, :RUBY_ENGINE, 'vroom' + Object.send :const_set, :RUBY_ENGINE, "vroom" ua = make_request(@uri, nil, nil, nil).user_agent - assert_match %r{\) vroom}, ua + assert_match(/\) vroom/, ua) ensure util_restore_version end @@ -300,11 +306,11 @@ class TestGemRequest < Gem::TestCase util_save_version Object.send :remove_const, :RUBY_ENGINE - Object.send :const_set, :RUBY_ENGINE, 'ruby' + Object.send :const_set, :RUBY_ENGINE, "ruby" ua = make_request(@uri, nil, nil, nil).user_agent - assert_match %r{\)}, ua + assert_match(/\)/, ua) ensure util_restore_version end @@ -327,7 +333,7 @@ class TestGemRequest < Gem::TestCase Object.send :remove_const, :RUBY_PATCHLEVEL Object.send :const_set, :RUBY_PATCHLEVEL, -1 - Object.send :remove_const, :RUBY_REVISION if defined?(RUBY_REVISION) + Object.send :remove_const, :RUBY_REVISION Object.send :const_set, :RUBY_REVISION, 6 ua = make_request(@uri, nil, nil, nil).user_agent @@ -338,46 +344,38 @@ class TestGemRequest < Gem::TestCase util_restore_version end - def test_user_agent_revision_missing - util_save_version - - Object.send :remove_const, :RUBY_PATCHLEVEL - Object.send :const_set, :RUBY_PATCHLEVEL, -1 - Object.send :remove_const, :RUBY_REVISION if defined?(RUBY_REVISION) - - ua = make_request(@uri, nil, nil, nil).user_agent - - assert_match %r{\(#{Regexp.escape RUBY_RELEASE_DATE}\)}, ua - ensure - util_restore_version - end - def test_verify_certificate pend if Gem.java_platform? + + error_number = OpenSSL::X509::V_ERR_OUT_OF_MEM + store = OpenSSL::X509::Store.new context = OpenSSL::X509::StoreContext.new store - context.error = OpenSSL::X509::V_ERR_OUT_OF_MEM + context.error = error_number use_ui @ui do Gem::Request.verify_certificate context end - assert_equal "ERROR: SSL verification error at depth 0: out of memory (17)\n", + assert_equal "ERROR: SSL verification error at depth 0: out of memory (#{error_number})\n", @ui.error end def test_verify_certificate_extra_message pend if Gem.java_platform? + + error_number = OpenSSL::X509::V_ERR_INVALID_CA + store = OpenSSL::X509::Store.new context = OpenSSL::X509::StoreContext.new store - context.error = OpenSSL::X509::V_ERR_INVALID_CA + context.error = error_number use_ui @ui do Gem::Request.verify_certificate context end expected = <<-ERROR -ERROR: SSL verification error at depth 0: invalid CA certificate (24) +ERROR: SSL verification error at depth 0: invalid CA certificate (#{error_number}) ERROR: Certificate is an invalid CA certificate ERROR @@ -486,21 +484,19 @@ ERROR: Certificate is an invalid CA certificate def util_restore_version Object.send :remove_const, :RUBY_ENGINE - Object.send :const_set, :RUBY_ENGINE, @orig_RUBY_ENGINE if - defined?(@orig_RUBY_ENGINE) + Object.send :const_set, :RUBY_ENGINE, @orig_ruby_engine Object.send :remove_const, :RUBY_PATCHLEVEL - Object.send :const_set, :RUBY_PATCHLEVEL, @orig_RUBY_PATCHLEVEL + Object.send :const_set, :RUBY_PATCHLEVEL, @orig_ruby_patchlevel - Object.send :remove_const, :RUBY_REVISION if defined?(RUBY_REVISION) - Object.send :const_set, :RUBY_REVISION, @orig_RUBY_REVISION if - defined?(@orig_RUBY_REVISION) + Object.send :remove_const, :RUBY_REVISION + Object.send :const_set, :RUBY_REVISION, @orig_ruby_revision end def util_save_version - @orig_RUBY_ENGINE = RUBY_ENGINE - @orig_RUBY_PATCHLEVEL = RUBY_PATCHLEVEL - @orig_RUBY_REVISION = RUBY_REVISION if defined? RUBY_REVISION + @orig_ruby_engine = RUBY_ENGINE + @orig_ruby_patchlevel = RUBY_PATCHLEVEL + @orig_ruby_revision = RUBY_REVISION end def util_stub_net_http(hash) @@ -515,7 +511,10 @@ ERROR: Certificate is an invalid CA certificate class Conn attr_accessor :payload - def new(*args); self; end + def new(*args) + self + end + def use_ssl=(bool); end def verify_callback=(setting); end def verify_mode=(setting); end |