@@ -6,6 +6,7 @@ package ipv4_test
6
6
7
7
import (
8
8
"bytes"
9
+ "fmt"
9
10
"net"
10
11
"os"
11
12
"runtime"
@@ -20,11 +21,11 @@ import (
20
21
21
22
var packetConnReadWriteMulticastUDPTests = []struct {
22
23
addr string
23
- grp , src * net.UDPAddr
24
+ grp , src * net.IPAddr
24
25
}{
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
26
27
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
28
29
}
29
30
30
31
func TestPacketConnReadWriteMulticastUDP (t * testing.T ) {
@@ -34,64 +35,78 @@ func TestPacketConnReadWriteMulticastUDP(t *testing.T) {
34
35
}
35
36
ifi , err := nettest .RoutedInterface ("ip4" , net .FlagUp | net .FlagMulticast | net .FlagLoopback )
36
37
if err != nil {
37
- t .Skipf ( "not available on %s" , runtime . GOOS )
38
+ t .Skip ( err )
38
39
}
39
40
40
41
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 {
53
45
t .Fatal (err )
54
46
}
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 )
63
51
}
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
+ }()
82
53
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 )
88
73
}
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 {
89
81
t .Fatal (err )
90
82
}
91
- if err := p .SetDeadline ( time . Now (). Add ( 200 * time . Millisecond ) ); err != nil {
83
+ if _ , err := p .MulticastInterface ( ); err != nil {
92
84
t .Fatal (err )
93
85
}
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
+ }
95
110
if n , err := p .WriteTo (wb , nil , & grp ); err != nil {
96
111
t .Fatal (err )
97
112
} else if n != len (wb ) {
@@ -103,7 +118,7 @@ func TestPacketConnReadWriteMulticastUDP(t *testing.T) {
103
118
} else if ! bytes .Equal (rb [:n ], wb ) {
104
119
t .Fatalf ("got %v; want %v" , rb [:n ], wb )
105
120
}
106
- }
121
+ })
107
122
}
108
123
}
109
124
@@ -125,96 +140,110 @@ func TestPacketConnReadWriteMulticastICMP(t *testing.T) {
125
140
}
126
141
ifi , err := nettest .RoutedInterface ("ip4" , net .FlagUp | net .FlagMulticast | net .FlagLoopback )
127
142
if err != nil {
128
- t .Skipf ( "not available on %s" , runtime . GOOS )
143
+ t .Skip ( err )
129
144
}
130
145
131
146
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 {
142
150
t .Fatal (err )
143
151
}
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 )
152
156
}
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
+ }()
174
158
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 )
190
162
}
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 {
191
184
t .Fatal (err )
192
185
}
193
- if err := p .SetDeadline ( time . Now (). Add ( 200 * time . Millisecond ) ); err != nil {
186
+ if _ , err := p .MulticastInterface ( ); err != nil {
194
187
t .Fatal (err )
195
188
}
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 {
198
190
t .Fatal (err )
199
- } else if n != len (wb ) {
200
- t .Fatalf ("got %v; want %v" , n , len (wb ))
201
191
}
202
- rb := make ([]byte , 128 )
203
- if n , _ , _ , err := p .ReadFrom (rb ); err != nil {
192
+ if _ , err := p .MulticastLoopback (); err != nil {
204
193
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 )
207
209
if err != nil {
208
210
t .Fatal (err )
209
211
}
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
+ }
215
244
}
216
245
}
217
- }
246
+ })
218
247
}
219
248
}
220
249
0 commit comments