1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
14 var tcpServerTests
= []struct {
15 snet
, saddr
string // server endpoint
16 tnet
, taddr
string // target endpoint for client
18 {snet
: "tcp", saddr
: ":0", tnet
: "tcp", taddr
: "127.0.0.1"},
19 {snet
: "tcp", saddr
: "0.0.0.0:0", tnet
: "tcp", taddr
: "127.0.0.1"},
20 {snet
: "tcp", saddr
: "[::ffff:0.0.0.0]:0", tnet
: "tcp", taddr
: "127.0.0.1"},
21 {snet
: "tcp", saddr
: "[::]:0", tnet
: "tcp", taddr
: "::1"},
23 {snet
: "tcp", saddr
: ":0", tnet
: "tcp", taddr
: "::1"},
24 {snet
: "tcp", saddr
: "0.0.0.0:0", tnet
: "tcp", taddr
: "::1"},
25 {snet
: "tcp", saddr
: "[::ffff:0.0.0.0]:0", tnet
: "tcp", taddr
: "::1"},
26 {snet
: "tcp", saddr
: "[::]:0", tnet
: "tcp", taddr
: "127.0.0.1"},
28 {snet
: "tcp", saddr
: ":0", tnet
: "tcp4", taddr
: "127.0.0.1"},
29 {snet
: "tcp", saddr
: "0.0.0.0:0", tnet
: "tcp4", taddr
: "127.0.0.1"},
30 {snet
: "tcp", saddr
: "[::ffff:0.0.0.0]:0", tnet
: "tcp4", taddr
: "127.0.0.1"},
31 {snet
: "tcp", saddr
: "[::]:0", tnet
: "tcp6", taddr
: "::1"},
33 {snet
: "tcp", saddr
: ":0", tnet
: "tcp6", taddr
: "::1"},
34 {snet
: "tcp", saddr
: "0.0.0.0:0", tnet
: "tcp6", taddr
: "::1"},
35 {snet
: "tcp", saddr
: "[::ffff:0.0.0.0]:0", tnet
: "tcp6", taddr
: "::1"},
36 {snet
: "tcp", saddr
: "[::]:0", tnet
: "tcp4", taddr
: "127.0.0.1"},
38 {snet
: "tcp", saddr
: "127.0.0.1:0", tnet
: "tcp", taddr
: "127.0.0.1"},
39 {snet
: "tcp", saddr
: "[::ffff:127.0.0.1]:0", tnet
: "tcp", taddr
: "127.0.0.1"},
40 {snet
: "tcp", saddr
: "[::1]:0", tnet
: "tcp", taddr
: "::1"},
42 {snet
: "tcp4", saddr
: ":0", tnet
: "tcp4", taddr
: "127.0.0.1"},
43 {snet
: "tcp4", saddr
: "0.0.0.0:0", tnet
: "tcp4", taddr
: "127.0.0.1"},
44 {snet
: "tcp4", saddr
: "[::ffff:0.0.0.0]:0", tnet
: "tcp4", taddr
: "127.0.0.1"},
46 {snet
: "tcp4", saddr
: "127.0.0.1:0", tnet
: "tcp4", taddr
: "127.0.0.1"},
48 {snet
: "tcp6", saddr
: ":0", tnet
: "tcp6", taddr
: "::1"},
49 {snet
: "tcp6", saddr
: "[::]:0", tnet
: "tcp6", taddr
: "::1"},
51 {snet
: "tcp6", saddr
: "[::1]:0", tnet
: "tcp6", taddr
: "::1"},
54 // TestTCPServer tests concurrent accept-read-write servers.
55 func TestTCPServer(t
*testing
.T
) {
58 for i
, tt
:= range tcpServerTests
{
59 if !testableListenArgs(tt
.snet
, tt
.saddr
, tt
.taddr
) {
60 t
.Logf("skipping %s test", tt
.snet
+" "+tt
.saddr
+"<-"+tt
.taddr
)
64 ln
, err
:= Listen(tt
.snet
, tt
.saddr
)
66 if perr
:= parseDialError(err
); perr
!= nil {
72 var lss
[]*localServer
73 var tpchs
[]chan error
75 for _
, ls
:= range lss
{
79 for i
:= 0; i
< N
; i
++ {
80 ls
, err
:= (&streamListener
{Listener
: ln
}).newLocalServer()
85 tpchs
= append(tpchs
, make(chan error
, 1))
87 for i
:= 0; i
< N
; i
++ {
89 handler
:= func(ls
*localServer
, ln Listener
) { transponder(ln
, ch
) }
90 if err
:= lss
[i
].buildup(handler
); err
!= nil {
95 var trchs
[]chan error
96 for i
:= 0; i
< N
; i
++ {
97 _
, port
, err
:= SplitHostPort(lss
[i
].Listener
.Addr().String())
101 d
:= Dialer
{Timeout
: someTimeout
}
102 c
, err
:= d
.Dial(tt
.tnet
, JoinHostPort(tt
.taddr
, port
))
104 if perr
:= parseDialError(err
); perr
!= nil {
110 trchs
= append(trchs
, make(chan error
, 1))
111 go transceiver(c
, []byte("TCP SERVER TEST"), trchs
[i
])
114 for _
, ch
:= range trchs
{
115 for err
:= range ch
{
116 t
.Errorf("#%d: %v", i
, err
)
119 for _
, ch
:= range tpchs
{
120 for err
:= range ch
{
121 t
.Errorf("#%d: %v", i
, err
)
127 var unixAndUnixpacketServerTests
= []struct {
128 network
, address
string
130 {"unix", testUnixAddr()},
131 {"unix", "@nettest/go/unix"},
133 {"unixpacket", testUnixAddr()},
134 {"unixpacket", "@nettest/go/unixpacket"},
137 // TestUnixAndUnixpacketServer tests concurrent accept-read-write
139 func TestUnixAndUnixpacketServer(t
*testing
.T
) {
142 for i
, tt
:= range unixAndUnixpacketServerTests
{
143 if !testableListenArgs(tt
.network
, tt
.address
, "") {
144 t
.Logf("skipping %s test", tt
.network
+" "+tt
.address
)
148 ln
, err
:= Listen(tt
.network
, tt
.address
)
150 if perr
:= parseDialError(err
); perr
!= nil {
156 var lss
[]*localServer
157 var tpchs
[]chan error
159 for _
, ls
:= range lss
{
163 for i
:= 0; i
< N
; i
++ {
164 ls
, err
:= (&streamListener
{Listener
: ln
}).newLocalServer()
168 lss
= append(lss
, ls
)
169 tpchs
= append(tpchs
, make(chan error
, 1))
171 for i
:= 0; i
< N
; i
++ {
173 handler
:= func(ls
*localServer
, ln Listener
) { transponder(ln
, ch
) }
174 if err
:= lss
[i
].buildup(handler
); err
!= nil {
179 var trchs
[]chan error
180 for i
:= 0; i
< N
; i
++ {
181 d
:= Dialer
{Timeout
: someTimeout
}
182 c
, err
:= d
.Dial(lss
[i
].Listener
.Addr().Network(), lss
[i
].Listener
.Addr().String())
184 if perr
:= parseDialError(err
); perr
!= nil {
189 defer os
.Remove(c
.LocalAddr().String())
191 trchs
= append(trchs
, make(chan error
, 1))
192 go transceiver(c
, []byte("UNIX AND UNIXPACKET SERVER TEST"), trchs
[i
])
195 for _
, ch
:= range trchs
{
196 for err
:= range ch
{
197 t
.Errorf("#%d: %v", i
, err
)
200 for _
, ch
:= range tpchs
{
201 for err
:= range ch
{
202 t
.Errorf("#%d: %v", i
, err
)
208 var udpServerTests
= []struct {
209 snet
, saddr
string // server endpoint
210 tnet
, taddr
string // target endpoint for client
211 dial
bool // test with Dial
213 {snet
: "udp", saddr
: ":0", tnet
: "udp", taddr
: "127.0.0.1"},
214 {snet
: "udp", saddr
: "0.0.0.0:0", tnet
: "udp", taddr
: "127.0.0.1"},
215 {snet
: "udp", saddr
: "[::ffff:0.0.0.0]:0", tnet
: "udp", taddr
: "127.0.0.1"},
216 {snet
: "udp", saddr
: "[::]:0", tnet
: "udp", taddr
: "::1"},
218 {snet
: "udp", saddr
: ":0", tnet
: "udp", taddr
: "::1"},
219 {snet
: "udp", saddr
: "0.0.0.0:0", tnet
: "udp", taddr
: "::1"},
220 {snet
: "udp", saddr
: "[::ffff:0.0.0.0]:0", tnet
: "udp", taddr
: "::1"},
221 {snet
: "udp", saddr
: "[::]:0", tnet
: "udp", taddr
: "127.0.0.1"},
223 {snet
: "udp", saddr
: ":0", tnet
: "udp4", taddr
: "127.0.0.1"},
224 {snet
: "udp", saddr
: "0.0.0.0:0", tnet
: "udp4", taddr
: "127.0.0.1"},
225 {snet
: "udp", saddr
: "[::ffff:0.0.0.0]:0", tnet
: "udp4", taddr
: "127.0.0.1"},
226 {snet
: "udp", saddr
: "[::]:0", tnet
: "udp6", taddr
: "::1"},
228 {snet
: "udp", saddr
: ":0", tnet
: "udp6", taddr
: "::1"},
229 {snet
: "udp", saddr
: "0.0.0.0:0", tnet
: "udp6", taddr
: "::1"},
230 {snet
: "udp", saddr
: "[::ffff:0.0.0.0]:0", tnet
: "udp6", taddr
: "::1"},
231 {snet
: "udp", saddr
: "[::]:0", tnet
: "udp4", taddr
: "127.0.0.1"},
233 {snet
: "udp", saddr
: "127.0.0.1:0", tnet
: "udp", taddr
: "127.0.0.1"},
234 {snet
: "udp", saddr
: "[::ffff:127.0.0.1]:0", tnet
: "udp", taddr
: "127.0.0.1"},
235 {snet
: "udp", saddr
: "[::1]:0", tnet
: "udp", taddr
: "::1"},
237 {snet
: "udp4", saddr
: ":0", tnet
: "udp4", taddr
: "127.0.0.1"},
238 {snet
: "udp4", saddr
: "0.0.0.0:0", tnet
: "udp4", taddr
: "127.0.0.1"},
239 {snet
: "udp4", saddr
: "[::ffff:0.0.0.0]:0", tnet
: "udp4", taddr
: "127.0.0.1"},
241 {snet
: "udp4", saddr
: "127.0.0.1:0", tnet
: "udp4", taddr
: "127.0.0.1"},
243 {snet
: "udp6", saddr
: ":0", tnet
: "udp6", taddr
: "::1"},
244 {snet
: "udp6", saddr
: "[::]:0", tnet
: "udp6", taddr
: "::1"},
246 {snet
: "udp6", saddr
: "[::1]:0", tnet
: "udp6", taddr
: "::1"},
248 {snet
: "udp", saddr
: "127.0.0.1:0", tnet
: "udp", taddr
: "127.0.0.1", dial
: true},
250 {snet
: "udp", saddr
: "[::1]:0", tnet
: "udp", taddr
: "::1", dial
: true},
253 func TestUDPServer(t
*testing
.T
) {
254 for i
, tt
:= range udpServerTests
{
255 if !testableListenArgs(tt
.snet
, tt
.saddr
, tt
.taddr
) {
256 t
.Logf("skipping %s test", tt
.snet
+" "+tt
.saddr
+"<-"+tt
.taddr
)
260 c1
, err
:= ListenPacket(tt
.snet
, tt
.saddr
)
262 if perr
:= parseDialError(err
); perr
!= nil {
268 ls
, err
:= (&packetListener
{PacketConn
: c1
}).newLocalServer()
273 tpch
:= make(chan error
, 1)
274 handler
:= func(ls
*localPacketServer
, c PacketConn
) { packetTransponder(c
, tpch
) }
275 if err
:= ls
.buildup(handler
); err
!= nil {
279 trch
:= make(chan error
, 1)
280 _
, port
, err
:= SplitHostPort(ls
.PacketConn
.LocalAddr().String())
285 d
:= Dialer
{Timeout
: someTimeout
}
286 c2
, err
:= d
.Dial(tt
.tnet
, JoinHostPort(tt
.taddr
, port
))
288 if perr
:= parseDialError(err
); perr
!= nil {
294 go transceiver(c2
, []byte("UDP SERVER TEST"), trch
)
296 c2
, err
:= ListenPacket(tt
.tnet
, JoinHostPort(tt
.taddr
, "0"))
298 if perr
:= parseDialError(err
); perr
!= nil {
304 dst
, err
:= ResolveUDPAddr(tt
.tnet
, JoinHostPort(tt
.taddr
, port
))
308 go packetTransceiver(c2
, []byte("UDP SERVER TEST"), dst
, trch
)
311 for err
:= range trch
{
312 t
.Errorf("#%d: %v", i
, err
)
314 for err
:= range tpch
{
315 t
.Errorf("#%d: %v", i
, err
)
320 var unixgramServerTests
= []struct {
321 saddr
string // server endpoint
322 caddr
string // client endpoint
323 dial
bool // test with Dial
325 {saddr
: testUnixAddr(), caddr
: testUnixAddr()},
326 {saddr
: testUnixAddr(), caddr
: testUnixAddr(), dial
: true},
328 {saddr
: "@nettest/go/unixgram/server", caddr
: "@nettest/go/unixgram/client"},
331 func TestUnixgramServer(t
*testing
.T
) {
332 for i
, tt
:= range unixgramServerTests
{
333 if !testableListenArgs("unixgram", tt
.saddr
, "") {
334 t
.Logf("skipping %s test", "unixgram "+tt
.saddr
+"<-"+tt
.caddr
)
338 c1
, err
:= ListenPacket("unixgram", tt
.saddr
)
340 if perr
:= parseDialError(err
); perr
!= nil {
346 ls
, err
:= (&packetListener
{PacketConn
: c1
}).newLocalServer()
351 tpch
:= make(chan error
, 1)
352 handler
:= func(ls
*localPacketServer
, c PacketConn
) { packetTransponder(c
, tpch
) }
353 if err
:= ls
.buildup(handler
); err
!= nil {
357 trch
:= make(chan error
, 1)
359 d
:= Dialer
{Timeout
: someTimeout
, LocalAddr
: &UnixAddr
{Net
: "unixgram", Name
: tt
.caddr
}}
360 c2
, err
:= d
.Dial("unixgram", ls
.PacketConn
.LocalAddr().String())
362 if perr
:= parseDialError(err
); perr
!= nil {
367 defer os
.Remove(c2
.LocalAddr().String())
369 go transceiver(c2
, []byte(c2
.LocalAddr().String()), trch
)
371 c2
, err
:= ListenPacket("unixgram", tt
.caddr
)
373 if perr
:= parseDialError(err
); perr
!= nil {
378 defer os
.Remove(c2
.LocalAddr().String())
380 go packetTransceiver(c2
, []byte("UNIXGRAM SERVER TEST"), ls
.PacketConn
.LocalAddr(), trch
)
383 for err
:= range trch
{
384 t
.Errorf("#%d: %v", i
, err
)
386 for err
:= range tpch
{
387 t
.Errorf("#%d: %v", i
, err
)