1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/test/drb/test_drb.rb

371 lines
7.3 KiB
Ruby
Raw Normal View History

# frozen_string_literal: false
require_relative 'drbtest'
module DRbTests
class TestDRbCore < Test::Unit::TestCase
include DRbCore
def setup
super
setup_service 'ut_drb.rb'
end
end
module DRbYield
include DRbBase
def test_01_one
@there.echo_yield_1([]) {|one|
assert_equal([], one)
}
@there.echo_yield_1(1) {|one|
assert_equal(1, one)
}
@there.echo_yield_1(nil) {|one|
assert_equal(nil, one)
}
end
def test_02_two
@there.echo_yield_2([], []) {|one, two|
assert_equal([], one)
assert_equal([], two)
}
@there.echo_yield_2(1, 2) {|one, two|
assert_equal(1, one)
assert_equal(2, two)
}
@there.echo_yield_2(3, nil) {|one, two|
assert_equal(3, one)
assert_equal(nil, two)
}
@there.echo_yield_1([:key, :value]) {|one, two|
assert_equal(:key, one)
assert_equal(:value, two)
}
end
def test_03_many
@there.echo_yield_0 {|*s|
assert_equal([], s)
}
@there.echo_yield(nil) {|*s|
assert_equal([nil], s)
}
@there.echo_yield(1) {|*s|
assert_equal([1], s)
}
@there.echo_yield(1, 2) {|*s|
assert_equal([1, 2], s)
}
@there.echo_yield(1, 2, 3) {|*s|
assert_equal([1, 2, 3], s)
}
@there.echo_yield([], []) {|*s|
assert_equal([[], []], s)
}
@there.echo_yield([]) {|*s|
assert_equal([[]], s) # !
}
end
def test_04_many_to_one
@there.echo_yield_0 {|*s|
assert_equal([], s)
}
@there.echo_yield(nil) {|*s|
assert_equal([nil], s)
}
@there.echo_yield(1) {|*s|
assert_equal([1], s)
}
@there.echo_yield(1, 2) {|*s|
assert_equal([1, 2], s)
}
@there.echo_yield(1, 2, 3) {|*s|
assert_equal([1, 2, 3], s)
}
@there.echo_yield([], []) {|*s|
assert_equal([[], []], s)
}
@there.echo_yield([]) {|*s|
assert_equal([[]], s)
}
end
def test_05_array_subclass
@there.xarray_each {|x| assert_kind_of(XArray, x)}
@there.xarray_each {|*x| assert_kind_of(XArray, x[0])}
end
end
class TestDRbYield < Test::Unit::TestCase
include DRbYield
def setup
super
setup_service 'ut_drb.rb'
end
end
class TestDRbRubyYield < Test::Unit::TestCase
include DRbYield
def setup
@there = self
super
end
def echo_yield(*arg)
yield(*arg)
end
def echo_yield_0
yield
end
def echo_yield_1(a)
yield(a)
end
def echo_yield_2(a, b)
yield(a, b)
end
def xarray_each
xary = [XArray.new([0])]
xary.each do |x|
yield(x)
end
end
end
class TestDRbRuby18Yield < Test::Unit::TestCase
include DRbYield
class YieldTest18
def echo_yield(*arg, &proc)
proc.call(*arg)
end
def echo_yield_0(&proc)
proc.call
end
def echo_yield_1(a, &proc)
proc.call(a)
end
def echo_yield_2(a, b, &proc)
proc.call(a, b)
end
def xarray_each(&proc)
xary = [XArray.new([0])]
xary.each(&proc)
end
end
def setup
@there = YieldTest18.new
super
end
end
class TestDRbAry < Test::Unit::TestCase
include DRbAry
def setup
super
setup_service 'ut_array.rb'
end
end
class TestDRbMServer < Test::Unit::TestCase
include DRbBase
def setup
super
setup_service 'ut_drb.rb'
@server = (1..3).collect do |n|
DRb::DRbServer.new("druby://localhost:0", Onecky.new(n.to_s))
end
end
def teardown
@server.each do |s|
s.stop_service
end
super
end
def test_01
assert_equal(6, @there.sample(@server[0].front, @server[1].front, @server[2].front))
end
end
class TestDRbSafe1 < Test::Unit::TestCase
include DRbAry
def setup
super
setup_service 'ut_safe1.rb'
end
end
class TestDRbLarge < Test::Unit::TestCase
include DRbBase
def setup
super
setup_service 'ut_large.rb'
end
def test_01_large_ary
ary = [2] * 10240
assert_equal(10240, @there.size(ary))
assert_equal(20480, @there.sum(ary))
assert_equal(2 ** 10240, @there.multiply(ary))
assert_equal(2, @there.avg(ary))
assert_equal(2, @there.median(ary))
end
def test_02_large_ary
ary = ["Hello, World"] * 10240
assert_equal(10240, @there.size(ary))
assert_equal(ary[0..ary.length].inject(:+), @there.sum(ary))
assert_raise(TypeError) {@there.multiply(ary)}
assert_raise(TypeError) {@there.avg(ary)}
assert_raise(TypeError) {@there.median(ary)}
end
def test_03_large_ary
ary = [Thread.current] * 10240
assert_equal(10240, @there.size(ary))
end
def test_04_many_arg
assert_raise(DRb::DRbConnError) {
@there.arg_test(1, 2, 3, 4, 5, 6, 7, 8, 9, 0)
}
end
def test_05_too_large_ary
ary = ["Hello, World"] * 102400
exception = nil
begin
@there.size(ary)
rescue StandardError
exception = $!
end
assert_kind_of(StandardError, exception)
end
def test_06_array_operations
ary = [1,50,3,844,7,45,23]
assert_equal(7, @there.size(ary))
assert_equal(973, @there.sum(ary))
assert_equal(917217000, @there.multiply(ary))
assert_equal(139.0, @there.avg(ary))
assert_equal(23.0, @there.median(ary))
ary2 = [1,2,3,4]
assert_equal(4, @there.size(ary2))
assert_equal(10, @there.sum(ary2))
assert_equal(24, @there.multiply(ary2))
assert_equal(2.5, @there.avg(ary2))
assert_equal(2.5, @there.median(ary2))
end
def test_07_one_element_array
ary = [50]
assert_equal(1, @there.size(ary))
assert_equal(50, @there.sum(ary))
assert_equal(50, @there.multiply(ary))
assert_equal(50.0, @there.avg(ary))
assert_equal(50.0, @there.median(ary))
end
def test_08_empty_array
ary = []
assert_equal(0, @there.size(ary))
assert_equal(nil, @there.sum(ary))
assert_equal(nil, @there.multiply(ary))
assert_equal(nil, @there.avg(ary))
assert_equal(nil, @there.median(ary))
end
end
class TestBug4409 < Test::Unit::TestCase
include DRbBase
def setup
super
setup_service 'ut_eq.rb'
end
def test_bug4409
foo = @there.foo
assert_operator(@there, :foo?, foo)
end
end
class TestDRbAnyToS < Test::Unit::TestCase
class BO < BasicObject
end
def test_any_to_s
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 03:34:19 -04:00
server = DRb::DRbServer.new('druby://localhost:0')
server.singleton_class.send(:public, :any_to_s)
assert_equal("foo:String", server.any_to_s("foo"))
assert_match(/\A#<DRbTests::TestDRbAnyToS::BO:0x[0-9a-f]+>\z/, server.any_to_s(BO.new))
server.stop_service
server.thread.join
DRb::DRbConn.stop_pool
end
end
class TestDRbTCP < Test::Unit::TestCase
def test_immediate_close
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 03:34:19 -04:00
server = DRb::DRbServer.new('druby://localhost:0')
host, port, = DRb::DRbTCPSocket.send(:parse_uri, server.uri)
socket = TCPSocket.open host, port
socket.shutdown
socket.close
client = DRb::DRbTCPSocket.new(server.uri, socket)
assert client
ensure
client&.close
socket&.close
server.stop_service
server.thread.join
DRb::DRbConn.stop_pool
end
end
class TestBug16634 < Test::Unit::TestCase
include DRbBase
def setup
super
setup_service 'ut_drb.rb'
end
def test_bug16634
assert_equal(42, @there.keyword_test1(a: 42))
assert_equal("default", @there.keyword_test2)
assert_equal(42, @there.keyword_test2(b: 42))
assert_equal({:a=>42, :b=>42}, @there.keyword_test3(a: 42, b: 42))
end
end
end