From df1304ee03f41aed179545d1e8b4684cfd22bbdf Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 25 Jan 2012 20:56:26 +0000 Subject: libgo: Update to weekly.2012-01-15. From-SVN: r183539 --- libgo/go/net/multicast_test.go | 130 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 121 insertions(+), 9 deletions(-) (limited to 'libgo/go/net/multicast_test.go') diff --git a/libgo/go/net/multicast_test.go b/libgo/go/net/multicast_test.go index a66250c..183d5a8 100644 --- a/libgo/go/net/multicast_test.go +++ b/libgo/go/net/multicast_test.go @@ -13,7 +13,7 @@ import ( var multicast = flag.Bool("multicast", false, "enable multicast tests") -var joinAndLeaveGroupUDPTests = []struct { +var multicastUDPTests = []struct { net string laddr IP gaddr IP @@ -32,8 +32,8 @@ var joinAndLeaveGroupUDPTests = []struct { {"udp6", IPv6unspecified, ParseIP("ff0e::114"), (FlagUp | FlagLoopback), true}, } -func TestJoinAndLeaveGroupUDP(t *testing.T) { - if runtime.GOOS == "windows" { +func TestMulticastUDP(t *testing.T) { + if runtime.GOOS == "plan9" || runtime.GOOS == "windows" { return } if !*multicast { @@ -41,7 +41,7 @@ func TestJoinAndLeaveGroupUDP(t *testing.T) { return } - for _, tt := range joinAndLeaveGroupUDPTests { + for _, tt := range multicastUDPTests { var ( ifi *Interface found bool @@ -51,7 +51,7 @@ func TestJoinAndLeaveGroupUDP(t *testing.T) { } ift, err := Interfaces() if err != nil { - t.Fatalf("Interfaces() failed: %v", err) + t.Fatalf("Interfaces failed: %v", err) } for _, x := range ift { if x.Flags&tt.flags == tt.flags { @@ -65,15 +65,20 @@ func TestJoinAndLeaveGroupUDP(t *testing.T) { } c, err := ListenUDP(tt.net, &UDPAddr{IP: tt.laddr}) if err != nil { - t.Fatal(err) + t.Fatalf("ListenUDP failed: %v", err) } defer c.Close() if err := c.JoinGroup(ifi, tt.gaddr); err != nil { - t.Fatal(err) + t.Fatalf("JoinGroup failed: %v", err) + } + if !tt.ipv6 { + testIPv4MulticastSocketOptions(t, c.fd, ifi) + } else { + testIPv6MulticastSocketOptions(t, c.fd, ifi) } ifmat, err := ifi.MulticastAddrs() if err != nil { - t.Fatalf("MulticastAddrs() failed: %v", err) + t.Fatalf("MulticastAddrs failed: %v", err) } for _, ifma := range ifmat { if ifma.(*IPAddr).IP.Equal(tt.gaddr) { @@ -85,7 +90,114 @@ func TestJoinAndLeaveGroupUDP(t *testing.T) { t.Fatalf("%q not found in RIB", tt.gaddr.String()) } if err := c.LeaveGroup(ifi, tt.gaddr); err != nil { - t.Fatal(err) + t.Fatalf("LeaveGroup failed: %v", err) + } + } +} + +func TestSimpleMulticastUDP(t *testing.T) { + if runtime.GOOS == "plan9" { + return + } + if !*multicast { + t.Logf("test disabled; use --multicast to enable") + return + } + + for _, tt := range multicastUDPTests { + var ifi *Interface + if tt.ipv6 { + continue + } + tt.flags = FlagUp | FlagMulticast + ift, err := Interfaces() + if err != nil { + t.Fatalf("Interfaces failed: %v", err) + } + for _, x := range ift { + if x.Flags&tt.flags == tt.flags { + ifi = &x + break + } + } + if ifi == nil { + t.Logf("an appropriate multicast interface not found") + return + } + c, err := ListenUDP(tt.net, &UDPAddr{IP: tt.laddr}) + if err != nil { + t.Fatalf("ListenUDP failed: %v", err) + } + defer c.Close() + if err := c.JoinGroup(ifi, tt.gaddr); err != nil { + t.Fatalf("JoinGroup failed: %v", err) + } + if err := c.LeaveGroup(ifi, tt.gaddr); err != nil { + t.Fatalf("LeaveGroup failed: %v", err) } } } + +func testIPv4MulticastSocketOptions(t *testing.T, fd *netFD, ifi *Interface) { + ifmc, err := ipv4MulticastInterface(fd) + if err != nil { + t.Fatalf("ipv4MulticastInterface failed: %v", err) + } + t.Logf("IPv4 multicast interface: %v", ifmc) + err = setIPv4MulticastInterface(fd, ifi) + if err != nil { + t.Fatalf("setIPv4MulticastInterface failed: %v", err) + } + + ttl, err := ipv4MulticastTTL(fd) + if err != nil { + t.Fatalf("ipv4MulticastTTL failed: %v", err) + } + t.Logf("IPv4 multicast TTL: %v", ttl) + err = setIPv4MulticastTTL(fd, 1) + if err != nil { + t.Fatalf("setIPv4MulticastTTL failed: %v", err) + } + + loop, err := ipv4MulticastLoopback(fd) + if err != nil { + t.Fatalf("ipv4MulticastLoopback failed: %v", err) + } + t.Logf("IPv4 multicast loopback: %v", loop) + err = setIPv4MulticastLoopback(fd, false) + if err != nil { + t.Fatalf("setIPv4MulticastLoopback failed: %v", err) + } +} + +func testIPv6MulticastSocketOptions(t *testing.T, fd *netFD, ifi *Interface) { + ifmc, err := ipv6MulticastInterface(fd) + if err != nil { + t.Fatalf("ipv6MulticastInterface failed: %v", err) + } + t.Logf("IPv6 multicast interface: %v", ifmc) + err = setIPv6MulticastInterface(fd, ifi) + if err != nil { + t.Fatalf("setIPv6MulticastInterface failed: %v", err) + } + + hoplim, err := ipv6MulticastHopLimit(fd) + if err != nil { + t.Fatalf("ipv6MulticastHopLimit failed: %v", err) + } + t.Logf("IPv6 multicast hop limit: %v", hoplim) + err = setIPv6MulticastHopLimit(fd, 1) + if err != nil { + t.Fatalf("setIPv6MulticastHopLimit failed: %v", err) + } + + loop, err := ipv6MulticastLoopback(fd) + if err != nil { + t.Fatalf("ipv6MulticastLoopback failed: %v", err) + } + t.Logf("IPv6 multicast loopback: %v", loop) + err = setIPv6MulticastLoopback(fd, false) + if err != nil { + t.Fatalf("setIPv6MulticastLoopback failed: %v", err) + } +} -- cgit v1.1