Skip to content

Commit

Permalink
Move stuff to the instance level
Browse files Browse the repository at this point in the history
I don't know why it was living at the class level. At first I thought it
would be to reuse some server instances between tests, but they seem to
be cleaned up after every test anyways, so I don't think any of it is
needed.
  • Loading branch information
deivid-rodriguez committed Apr 10, 2020
1 parent 7f5d3cf commit 04bee71
Showing 1 changed file with 135 additions and 139 deletions.
274 changes: 135 additions & 139 deletions test/rubygems/test_gem_remote_fetcher.rb
Expand Up @@ -100,12 +100,12 @@ def setup
@proxies.each {|k| ENV[k] = nil }

super
self.class.start_servers
self.class.enable_yaml = true
self.class.enable_zip = false
start_servers
self.enable_yaml = true
self.enable_zip = false

base_server_uri = "http://localhost:#{self.class.normal_server_port}"
@proxy_uri = "http://localhost:#{self.class.proxy_server_port}"
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"
Expand All @@ -126,7 +126,7 @@ def setup

def teardown
@fetcher.close_all
self.class.stop_servers
stop_servers
super
Gem.configuration[:http_proxy] = nil
@proxies.each_with_index {|k, i| ENV[k] = @old_proxies[i] }
Expand Down Expand Up @@ -878,23 +878,23 @@ def test_request_block

def test_yaml_error_on_size
use_ui @stub_ui do
self.class.enable_yaml = false
self.enable_yaml = false
fetcher = Gem::RemoteFetcher.new nil
@fetcher = fetcher
assert_error { fetcher.size }
end
end

def test_ssl_connection
ssl_server = self.class.start_ssl_server
ssl_server = start_ssl_server
temp_ca_cert = File.join(DIR, 'ca_cert.pem')
with_configured_fetcher(":ssl_ca_cert: #{temp_ca_cert}") do |fetcher|
fetcher.fetch_path("https://localhost:#{ssl_server.config[:Port]}/yaml")
end
end

def test_ssl_client_cert_auth_connection
ssl_server = self.class.start_ssl_server({
ssl_server = start_ssl_server({
:SSLVerifyClient =>
OpenSSL::SSL::VERIFY_PEER | OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT})

Expand All @@ -909,7 +909,7 @@ def test_ssl_client_cert_auth_connection
end

def test_do_not_allow_invalid_client_cert_auth_connection
ssl_server = self.class.start_ssl_server({
ssl_server = start_ssl_server({
:SSLVerifyClient =>
OpenSSL::SSL::VERIFY_PEER | OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT})

Expand All @@ -926,7 +926,7 @@ def test_do_not_allow_invalid_client_cert_auth_connection
end

def test_do_not_allow_insecure_ssl_connection_by_default
ssl_server = self.class.start_ssl_server
ssl_server = start_ssl_server
with_configured_fetcher do |fetcher|
assert_raises Gem::RemoteFetcher::FetchError do
fetcher.fetch_path("https://localhost:#{ssl_server.config[:Port]}/yaml")
Expand All @@ -935,14 +935,14 @@ def test_do_not_allow_insecure_ssl_connection_by_default
end

def test_ssl_connection_allow_verify_none
ssl_server = self.class.start_ssl_server
ssl_server = start_ssl_server
with_configured_fetcher(":ssl_verify_mode: 0") do |fetcher|
fetcher.fetch_path("https://localhost:#{ssl_server.config[:Port]}/yaml")
end
end

def test_do_not_follow_insecure_redirect
ssl_server = self.class.start_ssl_server
ssl_server = start_ssl_server
temp_ca_cert = File.join(DIR, 'ca_cert.pem')
expected_error_message =
"redirecting to non-https resource: #{@server_uri} (https://localhost:#{ssl_server.config[:Port]}/insecure_redirect?to=#{@server_uri})"
Expand All @@ -957,7 +957,7 @@ def test_do_not_follow_insecure_redirect
end

def test_nil_ca_cert
ssl_server = self.class.start_ssl_server
ssl_server = start_ssl_server
temp_ca_cert = nil

with_configured_fetcher(":ssl_ca_cert: #{temp_ca_cert}") do |fetcher|
Expand Down Expand Up @@ -1009,148 +1009,144 @@ def log(level, data) #Do nothing

end

class << self
private

attr_reader :normal_server, :proxy_server
attr_accessor :enable_zip, :enable_yaml
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
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
@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
utils = WEBrick::Utils # TimeoutHandler is since 1.9
utils::TimeoutHandler.terminate if defined?(utils::TimeoutHandler.terminate)
if @ssl_server_thread
@ssl_server_thread.kill.join
@ssl_server_thread = nil
end
utils = WEBrick::Utils # TimeoutHandler is since 1.9
utils::TimeoutHandler.terminate if defined?(utils::TimeoutHandler.terminate)
end

def normal_server_port
@normal_server[:server].config[:Port]
end
def normal_server_port
@normal_server[:server].config[:Port]
end

def proxy_server_port
@proxy_server[:server].config[:Port]
end
def proxy_server_port
@proxy_server[:server].config[:Port]
end

DIR = File.expand_path(File.dirname(__FILE__))
DIR = File.expand_path(File.dirname(__FILE__))

def start_ssl_server(config = {})
null_logger = NilLog.new
server = WEBrick::HTTPServer.new({
:Port => 0,
:Logger => null_logger,
:AccessLog => [],
:SSLEnable => true,
:SSLCACertificateFile => File.join(DIR, 'ca_cert.pem'),
:SSLCertificate => cert('ssl_cert.pem'),
:SSLPrivateKey => key('ssl_key.pem'),
:SSLVerifyClient => nil,
:SSLCertName => nil
}.merge(config))
server.mount_proc("/yaml") do |req, res|
res.body = "--- true\n"
end
server.mount_proc("/insecure_redirect") do |req, res|
res.set_redirect(WEBrick::HTTPStatus::MovedPermanently, req.query['to'])
def start_ssl_server(config = {})
null_logger = NilLog.new
server = WEBrick::HTTPServer.new({
:Port => 0,
:Logger => null_logger,
:AccessLog => [],
:SSLEnable => true,
:SSLCACertificateFile => File.join(DIR, 'ca_cert.pem'),
:SSLCertificate => cert('ssl_cert.pem'),
:SSLPrivateKey => key('ssl_key.pem'),
:SSLVerifyClient => nil,
:SSLCertName => nil
}.merge(config))
server.mount_proc("/yaml") do |req, res|
res.body = "--- true\n"
end
server.mount_proc("/insecure_redirect") do |req, res|
res.set_redirect(WEBrick::HTTPStatus::MovedPermanently, req.query['to'])
end
server.ssl_context.tmp_dh_callback = proc { TEST_KEY_DH2048 }
t = Thread.new do
begin
server.start
rescue Exception => ex
puts "ERROR during server thread: #{ex.message}"
raise
ensure
server.shutdown
end
server.ssl_context.tmp_dh_callback = proc { TEST_KEY_DH2048 }
t = Thread.new do
begin
server.start
rescue Exception => ex
puts "ERROR during server thread: #{ex.message}"
raise
ensure
server.shutdown
end
end
while server.status != :Running
sleep 0.1
unless t.alive?
t.join
raise
end
end
@ssl_server = server
@ssl_server_thread = t
server
end

private

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
while server.status != :Running
sleep 0.1
unless t.alive?
t.join
raise
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
@ssl_server = server
@ssl_server_thread = t
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
th = Thread.new do
begin
s.start
rescue Exception => ex
abort "ERROR during server thread: #{ex.message}"
ensure
s.shutdown
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
th[:server] = s
th
end

def cert(filename)
OpenSSL::X509::Certificate.new(File.read(File.join(DIR, filename)))
th = Thread.new do
begin
s.start
rescue Exception => ex
abort "ERROR during server thread: #{ex.message}"
ensure
s.shutdown
end
end
th[:server] = s
th
end

def key(filename)
OpenSSL::PKey::RSA.new(File.read(File.join(DIR, filename)))
end
def cert(filename)
OpenSSL::X509::Certificate.new(File.read(File.join(DIR, filename)))
end

def key(filename)
OpenSSL::PKey::RSA.new(File.read(File.join(DIR, filename)))
end

end if defined?(OpenSSL::SSL)

0 comments on commit 04bee71

Please sign in to comment.