summaryrefslogtreecommitdiff
path: root/test/rubygems/test_gem_request.rb
diff options
context:
space:
mode:
Diffstat (limited to 'test/rubygems/test_gem_request.rb')
-rw-r--r--test/rubygems/test_gem_request.rb245
1 files changed, 135 insertions, 110 deletions
diff --git a/test/rubygems/test_gem_request.rb b/test/rubygems/test_gem_request.rb
index 47e5f97074..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 'rubygems/test_case'
-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 = 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
@@ -197,54 +203,80 @@ class TestGemRequest < Gem::TestCase
end
def test_fetch_basic_auth
- uri = URI.parse "https://user:pass@example.rubygems/specs.#{Gem.marshal_version}"
- conn = util_stub_net_http(:body => :junk, :code => 200) do |c|
- @request = make_request(uri, Net::HTTP::Get, nil, nil)
- @request.fetch
+ Gem.configuration.verbose = :really
+ 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, 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
- uri = URI.parse "https://user:%7BDEScede%7Dpass@example.rubygems/specs.#{Gem.marshal_version}"
- conn = util_stub_net_http(:body => :junk, :code => 200) do |c|
- @request = make_request(uri, Net::HTTP::Get, nil, nil)
- @request.fetch
+ Gem.configuration.verbose = :really
+ 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|
+ use_ui @ui do
+ @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(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|
+ use_ui @ui do
+ @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
+ assert_includes @ui.output, "GET https://REDACTED:x-oauth-basic@example.rubygems/specs.#{Gem.marshal_version}"
end
def test_fetch_head
- uri = 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 = 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
@@ -254,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
@@ -274,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
@@ -301,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
@@ -312,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)
+ def test_verify_certificate
+ pend if Gem.java_platform?
- ua = make_request(@uri, nil, nil, nil).user_agent
+ error_number = OpenSSL::X509::V_ERR_OUT_OF_MEM
- assert_match %r{\(#{Regexp.escape RUBY_RELEASE_DATE}\)}, ua
- ensure
- util_restore_version
- end
-
- def test_verify_certificate
- skip if Gem.java_platform?
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
- skip if Gem.java_platform?
+ 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
@@ -460,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)
@@ -489,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