diff options
| -rw-r--r-- | test/rubygems/test_gem_remote_fetcher_local_server.rb | 57 | ||||
| -rw-r--r-- | test/rubygems/test_gem_remote_fetcher_local_ssl_server.rb | 195 |
2 files changed, 36 insertions, 216 deletions
diff --git a/test/rubygems/test_gem_remote_fetcher_local_server.rb b/test/rubygems/test_gem_remote_fetcher_local_server.rb index d315b520de..324cf89244 100644 --- a/test/rubygems/test_gem_remote_fetcher_local_server.rb +++ b/test/rubygems/test_gem_remote_fetcher_local_server.rb @@ -73,12 +73,14 @@ gems: @proxies.each {|k| ENV[k] = nil } super - start_servers + + @normal_server ||= start_server(SERVER_DATA) + @proxy_server ||= start_server(PROXY_DATA) self.enable_yaml = true self.enable_zip = false - base_server_uri = "http://localhost:#{normal_server_port}" - @proxy_uri = "http://localhost:#{proxy_server_port}" + base_server_uri = "http://localhost:#{@normal_server[:server].config[:Port]}" + @proxy_uri = "http://localhost:#{@proxy_server[:server].config[:Port]}" @server_uri = base_server_uri + "/yaml" @server_z_uri = base_server_uri + "/yaml.Z" @@ -99,7 +101,17 @@ gems: def teardown @fetcher.close_all - stop_servers + + if @normal_server + @normal_server.kill.join + @normal_server = nil + end + if @proxy_server + @proxy_server.kill.join + @proxy_server = nil + end + WEBrick::Utils::TimeoutHandler.terminate + super Gem.configuration[:http_proxy] = nil @proxies.each_with_index {|k, i| ENV[k] = @old_proxies[i] } @@ -176,6 +188,11 @@ gems: end end + private + + attr_reader :normal_server, :proxy_server + attr_accessor :enable_zip, :enable_yaml + def assert_data_from_server(data) assert_match(/0\.4\.11/, data, "Data is not from server") end @@ -189,38 +206,6 @@ gems: end end - private - - attr_reader :normal_server, :proxy_server - attr_accessor :enable_zip, :enable_yaml - - def start_servers - @normal_server ||= start_server(SERVER_DATA) - @proxy_server ||= start_server(PROXY_DATA) - @enable_yaml = true - @enable_zip = false - end - - def stop_servers - if @normal_server - @normal_server.kill.join - @normal_server = nil - end - if @proxy_server - @proxy_server.kill.join - @proxy_server = nil - end - WEBrick::Utils::TimeoutHandler.terminate - end - - def normal_server_port - @normal_server[:server].config[:Port] - end - - def proxy_server_port - @proxy_server[:server].config[:Port] - end - def start_server(data) null_logger = NilLog.new s = WEBrick::HTTPServer.new( diff --git a/test/rubygems/test_gem_remote_fetcher_local_ssl_server.rb b/test/rubygems/test_gem_remote_fetcher_local_ssl_server.rb index e3021cebb5..5054f3c742 100644 --- a/test/rubygems/test_gem_remote_fetcher_local_ssl_server.rb +++ b/test/rubygems/test_gem_remote_fetcher_local_ssl_server.rb @@ -2,7 +2,6 @@ require_relative "helper" -require "webrick" require "webrick/https" if Gem::HAVE_OPENSSL unless Gem::HAVE_OPENSSL @@ -12,66 +11,9 @@ end require "rubygems/remote_fetcher" require "rubygems/package" -# = Testing Proxy Settings -# -# These tests check the proper proxy server settings by running two -# web servers. The web server at http://localhost:#{SERVER_PORT} -# represents the normal gem server and returns a gemspec with a rake -# version of 0.4.11. The web server at http://localhost:#{PROXY_PORT} -# represents the proxy server and returns a different dataset where -# rake has version 0.4.2. This allows us to detect which server is -# returning the data. -# -# Note that the proxy server is not a *real* proxy server. But our -# software doesn't really care, as long as we hit the proxy URL when a -# proxy is configured. - class TestGemRemoteFetcherLocalSSLServer < Gem::TestCase include Gem::DefaultUserInteraction - SERVER_DATA = <<-EOY ---- !ruby/object:Gem::Cache -gems: - rake-0.4.11: !ruby/object:Gem::Specification - rubygems_version: "0.7" - specification_version: 1 - name: rake - version: !ruby/object:Gem::Version - version: 0.4.11 - date: 2004-11-12 - summary: Ruby based make-like utility. - require_paths: - - lib - author: Jim Weirich - email: jim@weirichhouse.org - homepage: http://rake.rubyforge.org - description: Rake is a Make-like program implemented in Ruby. Tasks and dependencies are specified in standard Ruby syntax. - autorequire: - bindir: bin - has_rdoc: true - required_ruby_version: !ruby/object:Gem::Version::Requirement - requirements: - - - - ">" - - !ruby/object:Gem::Version - version: 0.0.0 - version: - platform: ruby - files: - - README - test_files: [] - library_stubs: - rdoc_options: - extra_rdoc_files: - executables: - - rake - extensions: [] - requirements: [] - dependencies: [] - EOY - - PROXY_DATA = SERVER_DATA.gsub(/0.4.11/, "0.4.2") - # Generated via: # x = OpenSSL::PKey::DH.new(2048) # wait a while... # x.to_s => pem @@ -87,41 +29,24 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg== _END_OF_PEM_ def setup - @proxies = %w[https_proxy http_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] } - @proxies.each {|k| ENV[k] = nil } - super - start_servers - self.enable_yaml = true - self.enable_zip = false - - base_server_uri = "http://localhost:#{normal_server_port}" - @proxy_uri = "http://localhost:#{proxy_server_port}" - - @server_uri = base_server_uri + "/yaml" - @server_z_uri = base_server_uri + "/yaml.Z" - - @cache_dir = File.join @gemhome, "cache" - - # TODO: why does the remote fetcher need it written to disk? - @a1, @a1_gem = util_gem "a", "1" do |s| - s.executables << "a_bin" - end - @a1.loaded_from = File.join(@gemhome, "specifications", @a1.full_name) - - Gem::RemoteFetcher.fetcher = nil - @stub_ui = Gem::MockGemUi.new - @fetcher = Gem::RemoteFetcher.fetcher + @ssl_server = nil + @ssl_server_thread = nil end def teardown - @fetcher.close_all - stop_servers + if @ssl_server + @ssl_server.stop + @ssl_server = nil + end + if @ssl_server_thread + @ssl_server_thread.kill.join + @ssl_server_thread = nil + end + WEBrick::Utils::TimeoutHandler.terminate + super - Gem.configuration[:http_proxy] = nil - @proxies.each_with_index {|k, i| ENV[k] = @old_proxies[i] } end def test_ssl_connection @@ -183,6 +108,7 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg== end def test_do_not_follow_insecure_redirect + @server_uri = "http://example.com" ssl_server = start_ssl_server temp_ca_cert = File.join(__dir__, "ca_cert.pem") expected_error_message = @@ -208,6 +134,8 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg== end end + private + def with_configured_fetcher(config_str = nil, &block) if config_str temp_conf = File.join @tempdir, ".gemrc" @@ -223,61 +151,11 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg== Gem.configuration = nil end - def assert_data_from_server(data) - assert_match(/0\.4\.11/, data, "Data is not from server") - end - - def assert_data_from_proxy(data) - assert_match(/0\.4\.2/, data, "Data is not from proxy") - end - class NilLog < WEBrick::Log def log(level, data) # Do nothing end end - private - - attr_reader :normal_server, :proxy_server - attr_accessor :enable_zip, :enable_yaml - - def start_servers - @normal_server ||= start_server(SERVER_DATA) - @proxy_server ||= start_server(PROXY_DATA) - @enable_yaml = true - @enable_zip = false - @ssl_server = nil - @ssl_server_thread = nil - end - - def stop_servers - if @normal_server - @normal_server.kill.join - @normal_server = nil - end - if @proxy_server - @proxy_server.kill.join - @proxy_server = nil - end - if @ssl_server - @ssl_server.stop - @ssl_server = nil - end - if @ssl_server_thread - @ssl_server_thread.kill.join - @ssl_server_thread = nil - end - WEBrick::Utils::TimeoutHandler.terminate - end - - def normal_server_port - @normal_server[:server].config[:Port] - end - - def proxy_server_port - @proxy_server[:server].config[:Port] - end - def start_ssl_server(config = {}) pend "starting this test server fails randomly on jruby" if Gem.java_platform? @@ -320,49 +198,6 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg== server end - def start_server(data) - null_logger = NilLog.new - s = WEBrick::HTTPServer.new( - Port: 0, - DocumentRoot: nil, - Logger: null_logger, - AccessLog: null_logger - ) - s.mount_proc("/kill") {|_req, _res| s.shutdown } - s.mount_proc("/yaml") do |req, res| - if req["X-Captain"] - res.body = req["X-Captain"] - elsif @enable_yaml - res.body = data - res["Content-Type"] = "text/plain" - res["content-length"] = data.size - else - res.status = "404" - res.body = "<h1>NOT FOUND</h1>" - res["Content-Type"] = "text/html" - end - end - s.mount_proc("/yaml.Z") do |_req, res| - if @enable_zip - res.body = Zlib::Deflate.deflate(data) - res["Content-Type"] = "text/plain" - else - res.status = "404" - res.body = "<h1>NOT FOUND</h1>" - res["Content-Type"] = "text/html" - end - end - th = Thread.new do - s.start - rescue StandardError => ex - abort "ERROR during server thread: #{ex.message}" - ensure - s.shutdown - end - th[:server] = s - th - end - def cert(filename) OpenSSL::X509::Certificate.new(File.read(File.join(__dir__, filename))) end |
