@@ -2,9 +2,12 @@ package pool_test
22
33import (
44 "context"
5+ "fmt"
56 "net"
67 "sync"
8+ "syscall"
79 "testing"
10+ "time"
811
912 . "github.com/onsi/ginkgo"
1013 . "github.com/onsi/gomega"
@@ -32,5 +35,87 @@ func perform(n int, cbs ...func(int)) {
3235}
3336
3437func dummyDialer (context.Context ) (net.Conn , error ) {
35- return & net.TCPConn {}, nil
38+ // return &net.TCPConn{}, nil
39+ return newDummyConn (), nil
40+ }
41+
42+ func newDummyConn () net.Conn {
43+ return & dummyConn {
44+ rawConn : & dummyRawConn {},
45+ }
46+ }
47+
48+ var _ net.Conn = (* dummyConn )(nil )
49+ var _ syscall.Conn = (* dummyConn )(nil )
50+
51+ type dummyConn struct {
52+ rawConn * dummyRawConn
53+ }
54+
55+ func (d * dummyConn ) SyscallConn () (syscall.RawConn , error ) {
56+ return d .rawConn , nil
57+ }
58+
59+ var errDummy = fmt .Errorf ("dummyConn err" )
60+
61+ func (d * dummyConn ) Read (b []byte ) (n int , err error ) {
62+ return 0 , errDummy
63+ }
64+
65+ func (d * dummyConn ) Write (b []byte ) (n int , err error ) {
66+ return 0 , errDummy
67+ }
68+
69+ func (d * dummyConn ) Close () error {
70+ d .rawConn .Close ()
71+ return nil
72+ }
73+
74+ func (d * dummyConn ) LocalAddr () net.Addr {
75+ return & net.TCPAddr {}
76+ }
77+
78+ func (d * dummyConn ) RemoteAddr () net.Addr {
79+ return & net.TCPAddr {}
80+ }
81+
82+ func (d * dummyConn ) SetDeadline (t time.Time ) error {
83+ return nil
84+ }
85+
86+ func (d * dummyConn ) SetReadDeadline (t time.Time ) error {
87+ return nil
88+ }
89+
90+ func (d * dummyConn ) SetWriteDeadline (t time.Time ) error {
91+ return nil
92+ }
93+
94+ var _ syscall.RawConn = (* dummyRawConn )(nil )
95+
96+ type dummyRawConn struct {
97+ closed bool
98+ mux sync.Mutex
99+ }
100+
101+ func (d * dummyRawConn ) Control (f func (fd uintptr )) error {
102+ return nil
103+ }
104+
105+ func (d * dummyRawConn ) Read (f func (fd uintptr ) (done bool )) error {
106+ d .mux .Lock ()
107+ defer d .mux .Unlock ()
108+ if d .closed {
109+ return fmt .Errorf ("dummyRawConn closed" )
110+ }
111+ return nil
112+ }
113+
114+ func (d * dummyRawConn ) Write (f func (fd uintptr ) (done bool )) error {
115+ return nil
116+ }
117+ func (d * dummyRawConn ) Close () {
118+ d .mux .Lock ()
119+ d .closed = true
120+ d .mux .Unlock ()
36121}
0 commit comments