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.
12 var tcpServerTests
= []struct {
13 snet
, saddr
string // server endpoint
14 tnet
, taddr
string // target endpoint for client
16 {snet
: "tcp", saddr
: ":0", tnet
: "tcp", taddr
: "127.0.0.1"},
17 {snet
: "tcp", saddr
: "0.0.0.0:0", tnet
: "tcp", taddr
: "127.0.0.1"},
18 {snet
: "tcp", saddr
: "[::ffff:0.0.0.0]:0", tnet
: "tcp", taddr
: "127.0.0.1"},
19 {snet
: "tcp", saddr
: "[::]:0", tnet
: "tcp", taddr
: "::1"},
21 {snet
: "tcp", saddr
: ":0", tnet
: "tcp", taddr
: "::1"},
22 {snet
: "tcp", saddr
: "0.0.0.0:0", tnet
: "tcp", taddr
: "::1"},
23 {snet
: "tcp", saddr
: "[::ffff:0.0.0.0]:0", tnet
: "tcp", taddr
: "::1"},
24 {snet
: "tcp", saddr
: "[::]:0", tnet
: "tcp", taddr
: "127.0.0.1"},
26 {snet
: "tcp", saddr
: ":0", tnet
: "tcp4", taddr
: "127.0.0.1"},
27 {snet
: "tcp", saddr
: "0.0.0.0:0", tnet
: "tcp4", taddr
: "127.0.0.1"},
28 {snet
: "tcp", saddr
: "[::ffff:0.0.0.0]:0", tnet
: "tcp4", taddr
: "127.0.0.1"},
29 {snet
: "tcp", saddr
: "[::]:0", tnet
: "tcp6", taddr
: "::1"},
31 {snet
: "tcp", saddr
: ":0", tnet
: "tcp6", taddr
: "::1"},
32 {snet
: "tcp", saddr
: "0.0.0.0:0", tnet
: "tcp6", taddr
: "::1"},
33 {snet
: "tcp", saddr
: "[::ffff:0.0.0.0]:0", tnet
: "tcp6", taddr
: "::1"},
34 {snet
: "tcp", saddr
: "[::]:0", tnet
: "tcp4", taddr
: "127.0.0.1"},
36 {snet
: "tcp", saddr
: "127.0.0.1:0", tnet
: "tcp", taddr
: "127.0.0.1"},
37 {snet
: "tcp", saddr
: "[::ffff:127.0.0.1]:0", tnet
: "tcp", taddr
: "127.0.0.1"},
38 {snet
: "tcp", saddr
: "[::1]:0", tnet
: "tcp", taddr
: "::1"},
40 {snet
: "tcp4", saddr
: ":0", tnet
: "tcp4", taddr
: "127.0.0.1"},
41 {snet
: "tcp4", saddr
: "0.0.0.0:0", tnet
: "tcp4", taddr
: "127.0.0.1"},
42 {snet
: "tcp4", saddr
: "[::ffff:0.0.0.0]:0", tnet
: "tcp4", taddr
: "127.0.0.1"},
44 {snet
: "tcp4", saddr
: "127.0.0.1:0", tnet
: "tcp4", taddr
: "127.0.0.1"},
46 {snet
: "tcp6", saddr
: ":0", tnet
: "tcp6", taddr
: "::1"},
47 {snet
: "tcp6", saddr
: "[::]:0", tnet
: "tcp6", taddr
: "::1"},
49 {snet
: "tcp6", saddr
: "[::1]:0", tnet
: "tcp6", taddr
: "::1"},
52 // TestTCPServer tests concurrent accept-read-write servers.
53 func TestTCPServer(t
*testing
.T
) {
56 for i
, tt
:= range tcpServerTests
{
57 if !testableListenArgs(tt
.snet
, tt
.saddr
, tt
.taddr
) {
58 t
.Logf("skipping %s test", tt
.snet
+" "+tt
.saddr
+"<-"+tt
.taddr
)
62 ln
, err
:= Listen(tt
.snet
, tt
.saddr
)
64 if perr
:= parseDialError(err
); perr
!= nil {
70 var lss
[]*localServer
71 var tpchs
[]chan error
73 for _
, ls
:= range lss
{
77 for i
:= 0; i
< N
; i
++ {
78 ls
, err
:= (&streamListener
{Listener
: ln
}).newLocalServer()
83 tpchs
= append(tpchs
, make(chan error
, 1))
85 for i
:= 0; i
< N
; i
++ {
87 handler
:= func(ls
*localServer
, ln Listener
) { transponder(ln
, ch
) }
88 if err
:= lss
[i
].buildup(handler
); err
!= nil {
93 var trchs
[]chan error
94 for i
:= 0; i
< N
; i
++ {
95 _
, port
, err
:= SplitHostPort(lss
[i
].Listener
.Addr().String())
99 d
:= Dialer
{Timeout
: someTimeout
}
100 c
, err
:= d
.Dial(tt
.tnet
, JoinHostPort(tt
.taddr
, port
))
102 if perr
:= parseDialError(err
); perr
!= nil {
108 trchs
= append(trchs
, make(chan error
, 1))
109 go transceiver(c
, []byte("TCP SERVER TEST"), trchs
[i
])
112 for _
, ch
:= range trchs
{
113 for err
:= range ch
{
114 t
.Errorf("#%d: %v", i
, err
)
117 for _
, ch
:= range tpchs
{
118 for err
:= range ch
{
119 t
.Errorf("#%d: %v", i
, err
)
125 var unixAndUnixpacketServerTests
= []struct {
126 network
, address
string
128 {"unix", testUnixAddr()},
129 {"unix", "@nettest/go/unix"},
131 {"unixpacket", testUnixAddr()},
132 {"unixpacket", "@nettest/go/unixpacket"},
135 // TestUnixAndUnixpacketServer tests concurrent accept-read-write
137 func TestUnixAndUnixpacketServer(t
*testing
.T
) {
140 for i
, tt
:= range unixAndUnixpacketServerTests
{
141 if !testableListenArgs(tt
.network
, tt
.address
, "") {
142 t
.Logf("skipping %s test", tt
.network
+" "+tt
.address
)
146 ln
, err
:= Listen(tt
.network
, tt
.address
)
148 if perr
:= parseDialError(err
); perr
!= nil {
154 var lss
[]*localServer
155 var tpchs
[]chan error
157 for _
, ls
:= range lss
{
161 for i
:= 0; i
< N
; i
++ {
162 ls
, err
:= (&streamListener
{Listener
: ln
}).newLocalServer()
166 lss
= append(lss
, ls
)
167 tpchs
= append(tpchs
, make(chan error
, 1))
169 for i
:= 0; i
< N
; i
++ {
171 handler
:= func(ls
*localServer
, ln Listener
) { transponder(ln
, ch
) }
172 if err
:= lss
[i
].buildup(handler
); err
!= nil {
177 var trchs
[]chan error
178 for i
:= 0; i
< N
; i
++ {
179 d
:= Dialer
{Timeout
: someTimeout
}
180 c
, err
:= d
.Dial(lss
[i
].Listener
.Addr().Network(), lss
[i
].Listener
.Addr().String())
182 if perr
:= parseDialError(err
); perr
!= nil {
187 defer os
.Remove(c
.LocalAddr().String())
189 trchs
= append(trchs
, make(chan error
, 1))
190 go transceiver(c
, []byte("UNIX AND UNIXPACKET SERVER TEST"), trchs
[i
])
193 for _
, ch
:= range trchs
{
194 for err
:= range ch
{
195 t
.Errorf("#%d: %v", i
, err
)
198 for _
, ch
:= range tpchs
{
199 for err
:= range ch
{
200 t
.Errorf("#%d: %v", i
, err
)
206 var udpServerTests
= []struct {
207 snet
, saddr
string // server endpoint
208 tnet
, taddr
string // target endpoint for client
209 dial
bool // test with Dial
211 {snet
: "udp", saddr
: ":0", tnet
: "udp", taddr
: "127.0.0.1"},
212 {snet
: "udp", saddr
: "0.0.0.0:0", tnet
: "udp", taddr
: "127.0.0.1"},
213 {snet
: "udp", saddr
: "[::ffff:0.0.0.0]:0", tnet
: "udp", taddr
: "127.0.0.1"},
214 {snet
: "udp", saddr
: "[::]:0", tnet
: "udp", taddr
: "::1"},
216 {snet
: "udp", saddr
: ":0", tnet
: "udp", taddr
: "::1"},
217 {snet
: "udp", saddr
: "0.0.0.0:0", tnet
: "udp", taddr
: "::1"},
218 {snet
: "udp", saddr
: "[::ffff:0.0.0.0]:0", tnet
: "udp", taddr
: "::1"},
219 {snet
: "udp", saddr
: "[::]:0", tnet
: "udp", taddr
: "127.0.0.1"},
221 {snet
: "udp", saddr
: ":0", tnet
: "udp4", taddr
: "127.0.0.1"},
222 {snet
: "udp", saddr
: "0.0.0.0:0", tnet
: "udp4", taddr
: "127.0.0.1"},
223 {snet
: "udp", saddr
: "[::ffff:0.0.0.0]:0", tnet
: "udp4", taddr
: "127.0.0.1"},
224 {snet
: "udp", saddr
: "[::]:0", tnet
: "udp6", taddr
: "::1"},
226 {snet
: "udp", saddr
: ":0", tnet
: "udp6", taddr
: "::1"},
227 {snet
: "udp", saddr
: "0.0.0.0:0", tnet
: "udp6", taddr
: "::1"},
228 {snet
: "udp", saddr
: "[::ffff:0.0.0.0]:0", tnet
: "udp6", taddr
: "::1"},
229 {snet
: "udp", saddr
: "[::]:0", tnet
: "udp4", taddr
: "127.0.0.1"},
231 {snet
: "udp", saddr
: "127.0.0.1:0", tnet
: "udp", taddr
: "127.0.0.1"},
232 {snet
: "udp", saddr
: "[::ffff:127.0.0.1]:0", tnet
: "udp", taddr
: "127.0.0.1"},
233 {snet
: "udp", saddr
: "[::1]:0", tnet
: "udp", taddr
: "::1"},
235 {snet
: "udp4", saddr
: ":0", tnet
: "udp4", taddr
: "127.0.0.1"},
236 {snet
: "udp4", saddr
: "0.0.0.0:0", tnet
: "udp4", taddr
: "127.0.0.1"},
237 {snet
: "udp4", saddr
: "[::ffff:0.0.0.0]:0", tnet
: "udp4", taddr
: "127.0.0.1"},
239 {snet
: "udp4", saddr
: "127.0.0.1:0", tnet
: "udp4", taddr
: "127.0.0.1"},
241 {snet
: "udp6", saddr
: ":0", tnet
: "udp6", taddr
: "::1"},
242 {snet
: "udp6", saddr
: "[::]:0", tnet
: "udp6", taddr
: "::1"},
244 {snet
: "udp6", saddr
: "[::1]:0", tnet
: "udp6", taddr
: "::1"},
246 {snet
: "udp", saddr
: "127.0.0.1:0", tnet
: "udp", taddr
: "127.0.0.1", dial
: true},
248 {snet
: "udp", saddr
: "[::1]:0", tnet
: "udp", taddr
: "::1", dial
: true},
251 func TestUDPServer(t
*testing
.T
) {
252 for i
, tt
:= range udpServerTests
{
253 if !testableListenArgs(tt
.snet
, tt
.saddr
, tt
.taddr
) {
254 t
.Logf("skipping %s test", tt
.snet
+" "+tt
.saddr
+"<-"+tt
.taddr
)
258 c1
, err
:= ListenPacket(tt
.snet
, tt
.saddr
)
260 if perr
:= parseDialError(err
); perr
!= nil {
266 ls
, err
:= (&packetListener
{PacketConn
: c1
}).newLocalServer()
271 tpch
:= make(chan error
, 1)
272 handler
:= func(ls
*localPacketServer
, c PacketConn
) { packetTransponder(c
, tpch
) }
273 if err
:= ls
.buildup(handler
); err
!= nil {
277 trch
:= make(chan error
, 1)
278 _
, port
, err
:= SplitHostPort(ls
.PacketConn
.LocalAddr().String())
283 d
:= Dialer
{Timeout
: someTimeout
}
284 c2
, err
:= d
.Dial(tt
.tnet
, JoinHostPort(tt
.taddr
, port
))
286 if perr
:= parseDialError(err
); perr
!= nil {
292 go transceiver(c2
, []byte("UDP SERVER TEST"), trch
)
294 c2
, err
:= ListenPacket(tt
.tnet
, JoinHostPort(tt
.taddr
, "0"))
296 if perr
:= parseDialError(err
); perr
!= nil {
302 dst
, err
:= ResolveUDPAddr(tt
.tnet
, JoinHostPort(tt
.taddr
, port
))
306 go packetTransceiver(c2
, []byte("UDP SERVER TEST"), dst
, trch
)
309 for err
:= range trch
{
310 t
.Errorf("#%d: %v", i
, err
)
312 for err
:= range tpch
{
313 t
.Errorf("#%d: %v", i
, err
)
318 var unixgramServerTests
= []struct {
319 saddr
string // server endpoint
320 caddr
string // client endpoint
321 dial
bool // test with Dial
323 {saddr
: testUnixAddr(), caddr
: testUnixAddr()},
324 {saddr
: testUnixAddr(), caddr
: testUnixAddr(), dial
: true},
326 {saddr
: "@nettest/go/unixgram/server", caddr
: "@nettest/go/unixgram/client"},
329 func TestUnixgramServer(t
*testing
.T
) {
330 for i
, tt
:= range unixgramServerTests
{
331 if !testableListenArgs("unixgram", tt
.saddr
, "") {
332 t
.Logf("skipping %s test", "unixgram "+tt
.saddr
+"<-"+tt
.caddr
)
336 c1
, err
:= ListenPacket("unixgram", tt
.saddr
)
338 if perr
:= parseDialError(err
); perr
!= nil {
344 ls
, err
:= (&packetListener
{PacketConn
: c1
}).newLocalServer()
349 tpch
:= make(chan error
, 1)
350 handler
:= func(ls
*localPacketServer
, c PacketConn
) { packetTransponder(c
, tpch
) }
351 if err
:= ls
.buildup(handler
); err
!= nil {
355 trch
:= make(chan error
, 1)
357 d
:= Dialer
{Timeout
: someTimeout
, LocalAddr
: &UnixAddr
{Net
: "unixgram", Name
: tt
.caddr
}}
358 c2
, err
:= d
.Dial("unixgram", ls
.PacketConn
.LocalAddr().String())
360 if perr
:= parseDialError(err
); perr
!= nil {
365 defer os
.Remove(c2
.LocalAddr().String())
367 go transceiver(c2
, []byte(c2
.LocalAddr().String()), trch
)
369 c2
, err
:= ListenPacket("unixgram", tt
.caddr
)
371 if perr
:= parseDialError(err
); perr
!= nil {
376 defer os
.Remove(c2
.LocalAddr().String())
378 go packetTransceiver(c2
, []byte("UNIXGRAM SERVER TEST"), ls
.PacketConn
.LocalAddr(), trch
)
381 for err
:= range trch
{
382 t
.Errorf("#%d: %v", i
, err
)
384 for err
:= range tpch
{
385 t
.Errorf("#%d: %v", i
, err
)