Skip to content

Commit dbdefad

Browse files
tamirdodeke-em
authored andcommittedOct 9, 2020
ipv4: refactor multicast tests to use subtests
- Improve error discipline - Narrow test types from net.UDPAddr to net.IPAddr where possible Change-Id: I6c403ae69685ac3f35e427f56027fe4a29fde540 Reviewed-on: https://go-review.googlesource.com/c/net/+/260679 Reviewed-by: Ian Lance Taylor <iant@golang.org> Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com>
1 parent 59f7323 commit dbdefad

File tree

1 file changed

+149
-120
lines changed

1 file changed

+149
-120
lines changed
 

‎ipv4/multicast_test.go

+149-120
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ package ipv4_test
66

77
import (
88
"bytes"
9+
"fmt"
910
"net"
1011
"os"
1112
"runtime"
@@ -20,11 +21,11 @@ import (
2021

2122
var packetConnReadWriteMulticastUDPTests = []struct {
2223
addr string
23-
grp, src *net.UDPAddr
24+
grp, src *net.IPAddr
2425
}{
25-
{"224.0.0.0:0", &net.UDPAddr{IP: net.IPv4(224, 0, 0, 254)}, nil}, // see RFC 4727
26+
{"224.0.0.0:0", &net.IPAddr{IP: net.IPv4(224, 0, 0, 254)}, nil}, // see RFC 4727
2627

27-
{"232.0.1.0:0", &net.UDPAddr{IP: net.IPv4(232, 0, 1, 254)}, &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1)}}, // see RFC 5771
28+
{"232.0.1.0:0", &net.IPAddr{IP: net.IPv4(232, 0, 1, 254)}, &net.IPAddr{IP: net.IPv4(127, 0, 0, 1)}}, // see RFC 5771
2829
}
2930

3031
func TestPacketConnReadWriteMulticastUDP(t *testing.T) {
@@ -34,64 +35,78 @@ func TestPacketConnReadWriteMulticastUDP(t *testing.T) {
3435
}
3536
ifi, err := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagMulticast|net.FlagLoopback)
3637
if err != nil {
37-
t.Skipf("not available on %s", runtime.GOOS)
38+
t.Skip(err)
3839
}
3940

4041
for _, tt := range packetConnReadWriteMulticastUDPTests {
41-
c, err := net.ListenPacket("udp4", tt.addr)
42-
if err != nil {
43-
t.Fatal(err)
44-
}
45-
defer c.Close()
46-
47-
grp := *tt.grp
48-
grp.Port = c.LocalAddr().(*net.UDPAddr).Port
49-
p := ipv4.NewPacketConn(c)
50-
defer p.Close()
51-
if tt.src == nil {
52-
if err := p.JoinGroup(ifi, &grp); err != nil {
42+
t.Run(fmt.Sprintf("addr=%s/grp=%s/src=%s", tt.addr, tt.grp, tt.src), func(t *testing.T) {
43+
c, err := net.ListenPacket("udp4", tt.addr)
44+
if err != nil {
5345
t.Fatal(err)
5446
}
55-
defer p.LeaveGroup(ifi, &grp)
56-
} else {
57-
if err := p.JoinSourceSpecificGroup(ifi, &grp, tt.src); err != nil {
58-
switch runtime.GOOS {
59-
case "freebsd", "linux":
60-
default: // platforms that don't support IGMPv2/3 fail here
61-
t.Logf("not supported on %s", runtime.GOOS)
62-
continue
47+
p := ipv4.NewPacketConn(c)
48+
defer func() {
49+
if err := p.Close(); err != nil {
50+
t.Error(err)
6351
}
64-
t.Fatal(err)
65-
}
66-
defer p.LeaveSourceSpecificGroup(ifi, &grp, tt.src)
67-
}
68-
if err := p.SetMulticastInterface(ifi); err != nil {
69-
t.Fatal(err)
70-
}
71-
if _, err := p.MulticastInterface(); err != nil {
72-
t.Fatal(err)
73-
}
74-
if err := p.SetMulticastLoopback(true); err != nil {
75-
t.Fatal(err)
76-
}
77-
if _, err := p.MulticastLoopback(); err != nil {
78-
t.Fatal(err)
79-
}
80-
cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface
81-
wb := []byte("HELLO-R-U-THERE")
52+
}()
8253

83-
for i, toggle := range []bool{true, false, true} {
84-
if err := p.SetControlMessage(cf, toggle); err != nil {
85-
if protocolNotSupported(err) {
86-
t.Logf("not supported on %s", runtime.GOOS)
87-
continue
54+
grp := *p.LocalAddr().(*net.UDPAddr)
55+
grp.IP = tt.grp.IP
56+
if tt.src == nil {
57+
if err := p.JoinGroup(ifi, &grp); err != nil {
58+
t.Fatal(err)
59+
}
60+
defer func() {
61+
if err := p.LeaveGroup(ifi, &grp); err != nil {
62+
t.Error(err)
63+
}
64+
}()
65+
} else {
66+
if err := p.JoinSourceSpecificGroup(ifi, &grp, tt.src); err != nil {
67+
switch runtime.GOOS {
68+
case "freebsd", "linux":
69+
default: // platforms that don't support IGMPv2/3 fail here
70+
t.Skipf("not supported on %s", runtime.GOOS)
71+
}
72+
t.Fatal(err)
8873
}
74+
defer func() {
75+
if err := p.LeaveSourceSpecificGroup(ifi, &grp, tt.src); err != nil {
76+
t.Error(err)
77+
}
78+
}()
79+
}
80+
if err := p.SetMulticastInterface(ifi); err != nil {
8981
t.Fatal(err)
9082
}
91-
if err := p.SetDeadline(time.Now().Add(200 * time.Millisecond)); err != nil {
83+
if _, err := p.MulticastInterface(); err != nil {
9284
t.Fatal(err)
9385
}
94-
p.SetMulticastTTL(i + 1)
86+
if err := p.SetMulticastLoopback(true); err != nil {
87+
t.Fatal(err)
88+
}
89+
if _, err := p.MulticastLoopback(); err != nil {
90+
t.Fatal(err)
91+
}
92+
cf := ipv4.FlagTTL | ipv4.FlagDst | ipv4.FlagInterface
93+
wb := []byte("HELLO-R-U-THERE")
94+
95+
for i, toggle := range []bool{true, false, true} {
96+
if err := p.SetControlMessage(cf, toggle); err != nil {
97+
if protocolNotSupported(err) {
98+
t.Logf("not supported on %s", runtime.GOOS)
99+
continue
100+
}
101+
t.Fatal(err)
102+
}
103+
if err := p.SetDeadline(time.Now().Add(200 * time.Millisecond)); err != nil {
104+
t.Fatal(err)
105+
}
106+
if err := p.SetMulticastTTL(i + 1); err != nil {
107+
t.Fatal(err)
108+
}
109+
}
95110
if n, err := p.WriteTo(wb, nil, &grp); err != nil {
96111
t.Fatal(err)
97112
} else if n != len(wb) {
@@ -103,7 +118,7 @@ func TestPacketConnReadWriteMulticastUDP(t *testing.T) {
103118
} else if !bytes.Equal(rb[:n], wb) {
104119
t.Fatalf("got %v; want %v", rb[:n], wb)
105120
}
106-
}
121+
})
107122
}
108123
}
109124

@@ -125,96 +140,110 @@ func TestPacketConnReadWriteMulticastICMP(t *testing.T) {
125140
}
126141
ifi, err := nettest.RoutedInterface("ip4", net.FlagUp|net.FlagMulticast|net.FlagLoopback)
127142
if err != nil {
128-
t.Skipf("not available on %s", runtime.GOOS)
143+
t.Skip(err)
129144
}
130145

131146
for _, tt := range packetConnReadWriteMulticastICMPTests {
132-
c, err := net.ListenPacket("ip4:icmp", "0.0.0.0")
133-
if err != nil {
134-
t.Fatal(err)
135-
}
136-
defer c.Close()
137-
138-
p := ipv4.NewPacketConn(c)
139-
defer p.Close()
140-
if tt.src == nil {
141-
if err := p.JoinGroup(ifi, tt.grp); err != nil {
147+
t.Run(fmt.Sprintf("grp=%s/src=%s", tt.grp, tt.src), func(t *testing.T) {
148+
c, err := net.ListenPacket("ip4:icmp", "0.0.0.0")
149+
if err != nil {
142150
t.Fatal(err)
143151
}
144-
defer p.LeaveGroup(ifi, tt.grp)
145-
} else {
146-
if err := p.JoinSourceSpecificGroup(ifi, tt.grp, tt.src); err != nil {
147-
switch runtime.GOOS {
148-
case "freebsd", "linux":
149-
default: // platforms that don't support IGMPv2/3 fail here
150-
t.Logf("not supported on %s", runtime.GOOS)
151-
continue
152+
p := ipv4.NewPacketConn(c)
153+
defer func() {
154+
if err := p.Close(); err != nil {
155+
t.Error(err)
152156
}
153-
t.Fatal(err)
154-
}
155-
defer p.LeaveSourceSpecificGroup(ifi, tt.grp, tt.src)
156-
}
157-
if err := p.SetMulticastInterface(ifi); err != nil {
158-
t.Fatal(err)
159-
}
160-
if _, err := p.MulticastInterface(); err != nil {
161-
t.Fatal(err)
162-
}
163-
if err := p.SetMulticastLoopback(true); err != nil {
164-
t.Fatal(err)
165-
}
166-
if _, err := p.MulticastLoopback(); err != nil {
167-
t.Fatal(err)
168-
}
169-
cf := ipv4.FlagDst | ipv4.FlagInterface
170-
if runtime.GOOS != "illumos" && runtime.GOOS != "solaris" {
171-
// Illumos and Solaris never allow modification of ICMP properties.
172-
cf |= ipv4.FlagTTL
173-
}
157+
}()
174158

175-
for i, toggle := range []bool{true, false, true} {
176-
wb, err := (&icmp.Message{
177-
Type: ipv4.ICMPTypeEcho, Code: 0,
178-
Body: &icmp.Echo{
179-
ID: os.Getpid() & 0xffff, Seq: i + 1,
180-
Data: []byte("HELLO-R-U-THERE"),
181-
},
182-
}).Marshal(nil)
183-
if err != nil {
184-
t.Fatal(err)
185-
}
186-
if err := p.SetControlMessage(cf, toggle); err != nil {
187-
if protocolNotSupported(err) {
188-
t.Logf("not supported on %s", runtime.GOOS)
189-
continue
159+
if tt.src == nil {
160+
if err := p.JoinGroup(ifi, tt.grp); err != nil {
161+
t.Fatal(err)
190162
}
163+
defer func() {
164+
if err := p.LeaveGroup(ifi, tt.grp); err != nil {
165+
t.Error(err)
166+
}
167+
}()
168+
} else {
169+
if err := p.JoinSourceSpecificGroup(ifi, tt.grp, tt.src); err != nil {
170+
switch runtime.GOOS {
171+
case "freebsd", "linux":
172+
default: // platforms that don't support IGMPv2/3 fail here
173+
t.Skipf("not supported on %s", runtime.GOOS)
174+
}
175+
t.Fatal(err)
176+
}
177+
defer func() {
178+
if err := p.LeaveSourceSpecificGroup(ifi, tt.grp, tt.src); err != nil {
179+
t.Error(err)
180+
}
181+
}()
182+
}
183+
if err := p.SetMulticastInterface(ifi); err != nil {
191184
t.Fatal(err)
192185
}
193-
if err := p.SetDeadline(time.Now().Add(200 * time.Millisecond)); err != nil {
186+
if _, err := p.MulticastInterface(); err != nil {
194187
t.Fatal(err)
195188
}
196-
p.SetMulticastTTL(i + 1)
197-
if n, err := p.WriteTo(wb, nil, tt.grp); err != nil {
189+
if err := p.SetMulticastLoopback(true); err != nil {
198190
t.Fatal(err)
199-
} else if n != len(wb) {
200-
t.Fatalf("got %v; want %v", n, len(wb))
201191
}
202-
rb := make([]byte, 128)
203-
if n, _, _, err := p.ReadFrom(rb); err != nil {
192+
if _, err := p.MulticastLoopback(); err != nil {
204193
t.Fatal(err)
205-
} else {
206-
m, err := icmp.ParseMessage(iana.ProtocolICMP, rb[:n])
194+
}
195+
cf := ipv4.FlagDst | ipv4.FlagInterface
196+
if runtime.GOOS != "illumos" && runtime.GOOS != "solaris" {
197+
// Illumos and Solaris never allow modification of ICMP properties.
198+
cf |= ipv4.FlagTTL
199+
}
200+
201+
for i, toggle := range []bool{true, false, true} {
202+
wb, err := (&icmp.Message{
203+
Type: ipv4.ICMPTypeEcho, Code: 0,
204+
Body: &icmp.Echo{
205+
ID: os.Getpid() & 0xffff, Seq: i + 1,
206+
Data: []byte("HELLO-R-U-THERE"),
207+
},
208+
}).Marshal(nil)
207209
if err != nil {
208210
t.Fatal(err)
209211
}
210-
switch {
211-
case m.Type == ipv4.ICMPTypeEchoReply && m.Code == 0: // net.inet.icmp.bmcastecho=1
212-
case m.Type == ipv4.ICMPTypeEcho && m.Code == 0: // net.inet.icmp.bmcastecho=0
213-
default:
214-
t.Fatalf("got type=%v, code=%v; want type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0)
212+
if err := p.SetControlMessage(cf, toggle); err != nil {
213+
if protocolNotSupported(err) {
214+
t.Logf("not supported on %s", runtime.GOOS)
215+
continue
216+
}
217+
t.Fatal(err)
218+
}
219+
if err := p.SetDeadline(time.Now().Add(200 * time.Millisecond)); err != nil {
220+
t.Fatal(err)
221+
}
222+
if err := p.SetMulticastTTL(i + 1); err != nil {
223+
t.Fatal(err)
224+
}
225+
if n, err := p.WriteTo(wb, nil, tt.grp); err != nil {
226+
t.Fatal(err)
227+
} else if n != len(wb) {
228+
t.Fatalf("got %v; want %v", n, len(wb))
229+
}
230+
rb := make([]byte, 128)
231+
if n, _, _, err := p.ReadFrom(rb); err != nil {
232+
t.Fatal(err)
233+
} else {
234+
m, err := icmp.ParseMessage(iana.ProtocolICMP, rb[:n])
235+
if err != nil {
236+
t.Fatal(err)
237+
}
238+
switch {
239+
case m.Type == ipv4.ICMPTypeEchoReply && m.Code == 0: // net.inet.icmp.bmcastecho=1
240+
case m.Type == ipv4.ICMPTypeEcho && m.Code == 0: // net.inet.icmp.bmcastecho=0
241+
default:
242+
t.Fatalf("got type=%v, code=%v; want type=%v, code=%v", m.Type, m.Code, ipv4.ICMPTypeEchoReply, 0)
243+
}
215244
}
216245
}
217-
}
246+
})
218247
}
219248
}
220249

0 commit comments

Comments
 (0)
Please sign in to comment.