-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpconn_test.go
58 lines (56 loc) · 1.18 KB
/
pconn_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package plistener_test
import (
"github.com/cevatbarisyilmaz/plistener"
"golang.org/x/net/nettest"
"net"
"testing"
)
func TestPConn(t *testing.T) {
nettest.TestConn(t, func() (c1, c2 net.Conn, stop func(), err error) {
var listener *plistener.PListener
listener, err = getPListener()
if err != nil {
return
}
connChannel := make(chan net.Conn)
errChannel := make(chan error)
go func(connChannel chan net.Conn, errChannel chan error) {
conn, err := listener.Accept()
if err != nil {
errChannel <- err
return
}
connChannel <- conn
}(connChannel, errChannel)
go func(connChannel chan net.Conn, errChannel chan error) {
raddr := listener.Addr().(*net.TCPAddr)
conn, err := net.DialTCP("tcp", nil, raddr)
if err != nil {
errChannel <- err
return
}
connChannel <- conn
}(connChannel, errChannel)
for {
select {
case newConn := <-connChannel:
if c1 == nil {
c1 = newConn
} else {
c2 = newConn
stop = func() {
_ = c1.Close()
_ = c2.Close()
err = listener.Close()
if err != nil {
t.Error(err)
}
}
return
}
case err = <-errChannel:
return
}
}
})
}