2015-12-16 08:07:31 +03:00
|
|
|
# frozen_string_literal: false
|
2010-02-02 16:58:56 +03:00
|
|
|
require_relative 'drbtest'
|
2004-01-09 07:26:05 +03:00
|
|
|
|
|
|
|
begin
|
|
|
|
require 'drb/ssl'
|
|
|
|
rescue LoadError
|
|
|
|
end
|
|
|
|
|
2014-06-01 07:07:58 +04:00
|
|
|
module DRbTests
|
|
|
|
|
2007-11-19 21:30:18 +03:00
|
|
|
if Object.const_defined?("OpenSSL")
|
2004-01-09 07:26:05 +03:00
|
|
|
|
2003-10-20 19:24:00 +04:00
|
|
|
|
2003-10-21 18:42:15 +04:00
|
|
|
class DRbSSLService < DRbService
|
|
|
|
%w(ut_drb_drbssl.rb ut_array_drbssl.rb).each do |nm|
|
2004-03-19 10:13:01 +03:00
|
|
|
add_service_command(nm)
|
2003-10-21 18:42:15 +04:00
|
|
|
end
|
|
|
|
|
2018-10-20 16:14:02 +03:00
|
|
|
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
|
|
|
|
|
test/drb/test_drb.rb: Specify the host of DRbServer
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.
2021-04-07 10:34:19 +03:00
|
|
|
@server = DRb::DRbServer.new('drbssl://localhost:0', manager, config)
|
2018-10-20 16:14:02 +03:00
|
|
|
end
|
2003-10-20 19:24:00 +04:00
|
|
|
end
|
|
|
|
|
2003-10-21 18:42:15 +04:00
|
|
|
class TestDRbSSLCore < Test::Unit::TestCase
|
|
|
|
include DRbCore
|
2003-10-20 19:24:00 +04:00
|
|
|
def setup
|
2022-12-02 21:48:50 +03:00
|
|
|
if RUBY_PLATFORM.match?(/mswin|mingw/)
|
2022-08-25 21:36:04 +03:00
|
|
|
@omitted = true
|
2022-12-02 21:48:50 +03:00
|
|
|
omit 'This test seems to randomly hang on Windows'
|
2022-08-25 21:36:04 +03:00
|
|
|
end
|
2018-10-20 16:14:02 +03:00
|
|
|
@drb_service = DRbSSLService.new
|
2014-06-02 15:34:50 +04:00
|
|
|
super
|
2018-10-20 16:14:02 +03:00
|
|
|
setup_service 'ut_drb_drbssl.rb'
|
2014-06-02 15:34:50 +04:00
|
|
|
end
|
|
|
|
|
2003-10-20 19:24:00 +04:00
|
|
|
def test_02_unknown
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_01_02_loop
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_05_eq
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2003-10-21 18:42:15 +04:00
|
|
|
class TestDRbSSLAry < Test::Unit::TestCase
|
|
|
|
include DRbAry
|
2003-10-20 19:24:00 +04:00
|
|
|
def setup
|
2022-12-02 21:48:50 +03:00
|
|
|
if RUBY_PLATFORM.match?(/mswin|mingw/)
|
2022-11-20 08:13:05 +03:00
|
|
|
@omitted = true
|
2022-12-02 21:48:50 +03:00
|
|
|
omit 'This test seems to randomly hang on Windows'
|
2022-11-20 08:13:05 +03:00
|
|
|
end
|
test/drb/test_drbssl.rb: skip LeakChecker as openssl keeps /dev/random
and /dev/urandom intentionally. OpenSSL::PKey::RSA.new opens the two
random generators and keeps the file descriptors.
https://github.com/openssl/openssl/blob/93f99b681ab5a1cf7062053323e09b0cad5ff854/crypto/rand/rand_unix.c#L674
They are detected by the LeakChecker as fd leak, but it is intentional.
http://rubyci.s3.amazonaws.com/graviton2/ruby-master/log/20200526T160005Z.log.html.gz
```
[ 597/20199] DRbTests::TestDRbSSLAry#test_01 = 0.29 s
Leaked file descriptor: DRbTests::TestDRbSSLAry#test_01: 8 #<File::Stat dev=0x6, ino=11, mode=020666, nlink=1, uid=0, gid=0, rdev=0x109, size=0, blksize=4096, blocks=0, atime=2020-05-23 14:45:13.751999995 +0000, mtime=2020-05-23 14:45:13.751999995 +0000, ctime=2020-05-23 14:45:13.751999995 +0000>
Leaked file descriptor: DRbTests::TestDRbSSLAry#test_01: 9 #<File::Stat dev=0x6, ino=10, mode=020666, nlink=1, uid=0, gid=0, rdev=0x108, size=0, blksize=4096, blocks=0, atime=2020-05-23 14:45:13.755999995 +0000, mtime=2020-05-23 14:45:13.755999995 +0000, ctime=2020-05-23 14:45:13.755999995 +0000>
```
2020-05-26 20:07:38 +03:00
|
|
|
LeakChecker.skip if defined?(LeakChecker)
|
2018-10-20 16:14:02 +03:00
|
|
|
@drb_service = DRbSSLService.new
|
2014-06-02 15:34:50 +04:00
|
|
|
super
|
2018-10-20 16:14:02 +03:00
|
|
|
setup_service 'ut_array_drbssl.rb'
|
2014-06-02 15:34:50 +04:00
|
|
|
end
|
2003-10-20 19:24:00 +04:00
|
|
|
end
|
2004-01-09 07:26:05 +03:00
|
|
|
|
|
|
|
|
2014-06-01 07:07:58 +04:00
|
|
|
end
|
|
|
|
|
2004-01-09 07:26:05 +03:00
|
|
|
end
|