Skip to content

Commit 3cd620f

Browse files
committed
Handle situations where IPv4 multicast is not available
Fixes [Bug #13864]
1 parent 97b8c5a commit 3cd620f

File tree

1 file changed

+41
-30
lines changed

1 file changed

+41
-30
lines changed

test/rinda/test_rinda.rb

Lines changed: 41 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -583,6 +583,22 @@ def test_take_bug_8215
583583
end
584584
end
585585

586+
module RingIPv4
587+
def ipv4_mc(rf)
588+
begin
589+
v4mc = rf.make_socket('239.0.0.1')
590+
rescue Errno::ENETUNREACH, Errno::ENOBUFS, Errno::ENODEV
591+
omit 'IPv4 multicast not available'
592+
end
593+
594+
begin
595+
yield v4mc
596+
ensure
597+
v4mc.close
598+
end
599+
end
600+
end
601+
586602
module RingIPv6
587603
def prepare_ipv6(r)
588604
begin
@@ -625,6 +641,7 @@ def ipv6_mc(rf, hops = nil)
625641
end
626642

627643
class TestRingServer < Test::Unit::TestCase
644+
include RingIPv4
628645

629646
def setup
630647
@port = Rinda::Ring_PORT
@@ -697,27 +714,23 @@ def test_make_socket_unicast
697714
end
698715

699716
def test_make_socket_ipv4_multicast
700-
begin
701-
v4mc = @rs.make_socket('239.0.0.1')
702-
rescue Errno::ENOBUFS => e
703-
omit "Missing multicast support in OS: #{e.message}"
704-
end
705-
706-
begin
707-
if Socket.const_defined?(:SO_REUSEPORT) then
708-
assert(v4mc.getsockopt(:SOCKET, :SO_REUSEPORT).bool)
709-
else
710-
assert(v4mc.getsockopt(:SOCKET, :SO_REUSEADDR).bool)
711-
end
712-
rescue TypeError
713-
if /aix/ =~ RUBY_PLATFORM
714-
omit "Known bug in getsockopt(2) on AIX"
717+
ipv4_mc(@rs) do |v4mc|
718+
begin
719+
if Socket.const_defined?(:SO_REUSEPORT) then
720+
assert(v4mc.getsockopt(:SOCKET, :SO_REUSEPORT).bool)
721+
else
722+
assert(v4mc.getsockopt(:SOCKET, :SO_REUSEADDR).bool)
723+
end
724+
rescue TypeError
725+
if /aix/ =~ RUBY_PLATFORM
726+
omit "Known bug in getsockopt(2) on AIX"
727+
end
728+
raise $!
715729
end
716-
raise $!
717-
end
718730

719-
assert_equal('0.0.0.0', v4mc.local_address.ip_address)
720-
assert_equal(@port, v4mc.local_address.ip_port)
731+
assert_equal('0.0.0.0', v4mc.local_address.ip_address)
732+
assert_equal(@port, v4mc.local_address.ip_port)
733+
end
721734
end
722735

723736
def test_make_socket_ipv6_multicast
@@ -746,7 +759,7 @@ def test_ring_server_ipv4_multicast
746759
@rs.shutdown
747760
begin
748761
@rs = Rinda::RingServer.new(@ts, [['239.0.0.1', '0.0.0.0']], @port)
749-
rescue Errno::ENOBUFS => e
762+
rescue Errno::ENOBUFS, Errno::ENODEV => e
750763
omit "Missing multicast support in OS: #{e.message}"
751764
end
752765

@@ -848,6 +861,7 @@ def wait_for(n)
848861

849862
class TestRingFinger < Test::Unit::TestCase
850863
include RingIPv6
864+
include RingIPv4
851865

852866
def setup
853867
@rf = Rinda::RingFinger.new
@@ -867,12 +881,10 @@ def test_make_socket_unicast
867881
end
868882

869883
def test_make_socket_ipv4_multicast
870-
v4mc = @rf.make_socket('239.0.0.1')
871-
872-
assert_equal(1, v4mc.getsockopt(:IPPROTO_IP, :IP_MULTICAST_LOOP).ipv4_multicast_loop)
873-
assert_equal(1, v4mc.getsockopt(:IPPROTO_IP, :IP_MULTICAST_TTL).ipv4_multicast_ttl)
874-
ensure
875-
v4mc.close if v4mc
884+
ipv4_mc(@rf) do |v4mc|
885+
assert_equal(1, v4mc.getsockopt(:IPPROTO_IP, :IP_MULTICAST_LOOP).ipv4_multicast_loop)
886+
assert_equal(1, v4mc.getsockopt(:IPPROTO_IP, :IP_MULTICAST_TTL).ipv4_multicast_ttl)
887+
end
876888
end
877889

878890
def test_make_socket_ipv6_multicast
@@ -884,10 +896,9 @@ def test_make_socket_ipv6_multicast
884896

885897
def test_make_socket_ipv4_multicast_hops
886898
@rf.multicast_hops = 2
887-
v4mc = @rf.make_socket('239.0.0.1')
888-
assert_equal(2, v4mc.getsockopt(:IPPROTO_IP, :IP_MULTICAST_TTL).ipv4_multicast_ttl)
889-
ensure
890-
v4mc.close if v4mc
899+
ipv4_mc(@rf) do |v4mc|
900+
assert_equal(2, v4mc.getsockopt(:IPPROTO_IP, :IP_MULTICAST_TTL).ipv4_multicast_ttl)
901+
end
891902
end
892903

893904
def test_make_socket_ipv6_multicast_hops

0 commit comments

Comments
 (0)