mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
fbbc37dc1d
to try fixing the following error. http://rubyci.s3.amazonaws.com/opensuseleap/ruby-master/log/20210407T063004Z.log.html.gz ``` [ 605/21105] DRbTests::TestDRbSSLAry#test_06_next/home/chkbuild/chkbuild/tmp/build/20210407T063004Z/ruby/lib/drb/drb.rb:1138:in `method_missing': undefined method `regist' for [1, 2, "III", 4, "five", 6]:Array (NoMethodError) from /home/chkbuild/chkbuild/tmp/build/20210407T063004Z/ruby/lib/drb/extserv.rb:21:in `block in initialize' from /home/chkbuild/chkbuild/tmp/build/20210407T063004Z/ruby/.ext/common/monitor.rb:202:in `synchronize' from /home/chkbuild/chkbuild/tmp/build/20210407T063004Z/ruby/.ext/common/monitor.rb:202:in `mon_synchronize' from /home/chkbuild/chkbuild/tmp/build/20210407T063004Z/ruby/lib/drb/extserv.rb:20:in `initialize' from /home/chkbuild/chkbuild/tmp/build/20210407T063004Z/ruby/test/drb/ut_array_drbssl.rb:35:in `new' from /home/chkbuild/chkbuild/tmp/build/20210407T063004Z/ruby/test/drb/ut_array_drbssl.rb:35:in `<main>' = 100.05 s ``` Here is my analysis: The test of drb used both `druby://:0` and `druby://localhost:0` for DRbServer. However, the former listens on IPv4, and the latter does on IPv6, depending on environments. The port 0 is automatically assigned, but sometimes the same port is used to both because they are different protocols (IPv4 and IPv6). In this case, their URIs are resolved to the completely same one (`druby://localhost:port`), which confuses the method `DRb.here?` which determines the DRbObject is remote or local. This changeset uses `druby://localhost:0` consistently.
72 lines
1.4 KiB
Ruby
72 lines
1.4 KiB
Ruby
# frozen_string_literal: false
|
|
require_relative 'drbtest'
|
|
|
|
begin
|
|
require 'drb/ssl'
|
|
rescue LoadError
|
|
end
|
|
|
|
module DRbTests
|
|
|
|
if Object.const_defined?("OpenSSL")
|
|
|
|
|
|
class DRbSSLService < DRbService
|
|
%w(ut_drb_drbssl.rb ut_array_drbssl.rb).each do |nm|
|
|
add_service_command(nm)
|
|
end
|
|
|
|
def start
|
|
config = Hash.new
|
|
|
|
config[:SSLVerifyMode] = OpenSSL::SSL::VERIFY_PEER
|
|
config[:SSLVerifyCallback] = lambda{ |ok,x509_store|
|
|
true
|
|
}
|
|
begin
|
|
data = open("sample.key"){|io| io.read }
|
|
config[:SSLPrivateKey] = OpenSSL::PKey::RSA.new(data)
|
|
data = open("sample.crt"){|io| io.read }
|
|
config[:SSLCertificate] = OpenSSL::X509::Certificate.new(data)
|
|
rescue
|
|
# $stderr.puts "Switching to use self-signed certificate"
|
|
config[:SSLCertName] =
|
|
[ ["C","JP"], ["O","Foo.DRuby.Org"], ["CN", "Sample"] ]
|
|
end
|
|
|
|
@server = DRb::DRbServer.new('drbssl://localhost:0', manager, config)
|
|
end
|
|
end
|
|
|
|
class TestDRbSSLCore < Test::Unit::TestCase
|
|
include DRbCore
|
|
def setup
|
|
@drb_service = DRbSSLService.new
|
|
super
|
|
setup_service 'ut_drb_drbssl.rb'
|
|
end
|
|
|
|
def test_02_unknown
|
|
end
|
|
|
|
def test_01_02_loop
|
|
end
|
|
|
|
def test_05_eq
|
|
end
|
|
end
|
|
|
|
class TestDRbSSLAry < Test::Unit::TestCase
|
|
include DRbAry
|
|
def setup
|
|
LeakChecker.skip if defined?(LeakChecker)
|
|
@drb_service = DRbSSLService.new
|
|
super
|
|
setup_service 'ut_array_drbssl.rb'
|
|
end
|
|
end
|
|
|
|
|
|
end
|
|
|
|
end
|