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