[ruby/rinda] Handle situations where IPv4 multicast is not available
Fixes [Bug #13864] https://github.com/ruby/rinda/commit/3cd620f38c
This commit is contained in:
parent
cb12d7c71b
commit
89aa09afaf
@ -583,6 +583,22 @@ class TupleSpaceProxyTest < Test::Unit::TestCase
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
module RingIPv4
|
||||||
|
def ipv4_mc(rf)
|
||||||
|
begin
|
||||||
|
v4mc = rf.make_socket('239.0.0.1')
|
||||||
|
rescue Errno::ENETUNREACH, Errno::ENOBUFS, Errno::ENODEV
|
||||||
|
omit 'IPv4 multicast not available'
|
||||||
|
end
|
||||||
|
|
||||||
|
begin
|
||||||
|
yield v4mc
|
||||||
|
ensure
|
||||||
|
v4mc.close
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
module RingIPv6
|
module RingIPv6
|
||||||
def prepare_ipv6(r)
|
def prepare_ipv6(r)
|
||||||
begin
|
begin
|
||||||
@ -625,6 +641,7 @@ module RingIPv6
|
|||||||
end
|
end
|
||||||
|
|
||||||
class TestRingServer < Test::Unit::TestCase
|
class TestRingServer < Test::Unit::TestCase
|
||||||
|
include RingIPv4
|
||||||
|
|
||||||
def setup
|
def setup
|
||||||
@port = Rinda::Ring_PORT
|
@port = Rinda::Ring_PORT
|
||||||
@ -697,27 +714,23 @@ class TestRingServer < Test::Unit::TestCase
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_make_socket_ipv4_multicast
|
def test_make_socket_ipv4_multicast
|
||||||
begin
|
ipv4_mc(@rs) do |v4mc|
|
||||||
v4mc = @rs.make_socket('239.0.0.1')
|
begin
|
||||||
rescue Errno::ENOBUFS => e
|
if Socket.const_defined?(:SO_REUSEPORT) then
|
||||||
omit "Missing multicast support in OS: #{e.message}"
|
assert(v4mc.getsockopt(:SOCKET, :SO_REUSEPORT).bool)
|
||||||
end
|
else
|
||||||
|
assert(v4mc.getsockopt(:SOCKET, :SO_REUSEADDR).bool)
|
||||||
begin
|
end
|
||||||
if Socket.const_defined?(:SO_REUSEPORT) then
|
rescue TypeError
|
||||||
assert(v4mc.getsockopt(:SOCKET, :SO_REUSEPORT).bool)
|
if /aix/ =~ RUBY_PLATFORM
|
||||||
else
|
omit "Known bug in getsockopt(2) on AIX"
|
||||||
assert(v4mc.getsockopt(:SOCKET, :SO_REUSEADDR).bool)
|
end
|
||||||
|
raise $!
|
||||||
end
|
end
|
||||||
rescue TypeError
|
|
||||||
if /aix/ =~ RUBY_PLATFORM
|
|
||||||
omit "Known bug in getsockopt(2) on AIX"
|
|
||||||
end
|
|
||||||
raise $!
|
|
||||||
end
|
|
||||||
|
|
||||||
assert_equal('0.0.0.0', v4mc.local_address.ip_address)
|
assert_equal('0.0.0.0', v4mc.local_address.ip_address)
|
||||||
assert_equal(@port, v4mc.local_address.ip_port)
|
assert_equal(@port, v4mc.local_address.ip_port)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_make_socket_ipv6_multicast
|
def test_make_socket_ipv6_multicast
|
||||||
@ -746,7 +759,7 @@ class TestRingServer < Test::Unit::TestCase
|
|||||||
@rs.shutdown
|
@rs.shutdown
|
||||||
begin
|
begin
|
||||||
@rs = Rinda::RingServer.new(@ts, [['239.0.0.1', '0.0.0.0']], @port)
|
@rs = Rinda::RingServer.new(@ts, [['239.0.0.1', '0.0.0.0']], @port)
|
||||||
rescue Errno::ENOBUFS => e
|
rescue Errno::ENOBUFS, Errno::ENODEV => e
|
||||||
omit "Missing multicast support in OS: #{e.message}"
|
omit "Missing multicast support in OS: #{e.message}"
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -848,6 +861,7 @@ end
|
|||||||
|
|
||||||
class TestRingFinger < Test::Unit::TestCase
|
class TestRingFinger < Test::Unit::TestCase
|
||||||
include RingIPv6
|
include RingIPv6
|
||||||
|
include RingIPv4
|
||||||
|
|
||||||
def setup
|
def setup
|
||||||
@rf = Rinda::RingFinger.new
|
@rf = Rinda::RingFinger.new
|
||||||
@ -867,12 +881,10 @@ class TestRingFinger < Test::Unit::TestCase
|
|||||||
end
|
end
|
||||||
|
|
||||||
def test_make_socket_ipv4_multicast
|
def test_make_socket_ipv4_multicast
|
||||||
v4mc = @rf.make_socket('239.0.0.1')
|
ipv4_mc(@rf) do |v4mc|
|
||||||
|
assert_equal(1, v4mc.getsockopt(:IPPROTO_IP, :IP_MULTICAST_LOOP).ipv4_multicast_loop)
|
||||||
assert_equal(1, v4mc.getsockopt(:IPPROTO_IP, :IP_MULTICAST_LOOP).ipv4_multicast_loop)
|
assert_equal(1, v4mc.getsockopt(:IPPROTO_IP, :IP_MULTICAST_TTL).ipv4_multicast_ttl)
|
||||||
assert_equal(1, v4mc.getsockopt(:IPPROTO_IP, :IP_MULTICAST_TTL).ipv4_multicast_ttl)
|
end
|
||||||
ensure
|
|
||||||
v4mc.close if v4mc
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_make_socket_ipv6_multicast
|
def test_make_socket_ipv6_multicast
|
||||||
@ -884,10 +896,9 @@ class TestRingFinger < Test::Unit::TestCase
|
|||||||
|
|
||||||
def test_make_socket_ipv4_multicast_hops
|
def test_make_socket_ipv4_multicast_hops
|
||||||
@rf.multicast_hops = 2
|
@rf.multicast_hops = 2
|
||||||
v4mc = @rf.make_socket('239.0.0.1')
|
ipv4_mc(@rf) do |v4mc|
|
||||||
assert_equal(2, v4mc.getsockopt(:IPPROTO_IP, :IP_MULTICAST_TTL).ipv4_multicast_ttl)
|
assert_equal(2, v4mc.getsockopt(:IPPROTO_IP, :IP_MULTICAST_TTL).ipv4_multicast_ttl)
|
||||||
ensure
|
end
|
||||||
v4mc.close if v4mc
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_make_socket_ipv6_multicast_hops
|
def test_make_socket_ipv6_multicast_hops
|
||||||
|
Loading…
x
Reference in New Issue
Block a user