Skip to content

Commit 625674b

Browse files
committed
feat: add tests
1 parent 487a4f7 commit 625674b

File tree

1 file changed

+167
-0
lines changed

1 file changed

+167
-0
lines changed

connstate/conn_test.go

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,170 @@
1313
// limitations under the License.
1414

1515
package connstate
16+
17+
import (
18+
"errors"
19+
"net"
20+
"syscall"
21+
"testing"
22+
"time"
23+
24+
"github.com/stretchr/testify/assert"
25+
)
26+
27+
func TestListenConnState(t *testing.T) {
28+
ln, err := net.Listen("tcp", "localhost:0")
29+
if err != nil {
30+
panic(err)
31+
}
32+
go func() {
33+
for {
34+
conn, err := ln.Accept()
35+
assert.Nil(t, err)
36+
go func() {
37+
buf := make([]byte, 11)
38+
_, err := conn.Read(buf)
39+
assert.Nil(t, err)
40+
conn.Close()
41+
}()
42+
}
43+
}()
44+
conn, err := net.Dial("tcp", ln.Addr().String())
45+
assert.Nil(t, err)
46+
stater, err := ListenConnState(conn)
47+
assert.Nil(t, err)
48+
assert.Equal(t, StateOK, stater.State())
49+
_, err = conn.Write([]byte("hello world"))
50+
assert.Nil(t, err)
51+
time.Sleep(100 * time.Millisecond)
52+
assert.Equal(t, StateRemoteClosed, stater.State())
53+
assert.Nil(t, stater.Close())
54+
assert.Nil(t, conn.Close())
55+
assert.Equal(t, StateClosed, stater.State())
56+
}
57+
58+
type mockPoller struct {
59+
controlFunc func(fd *fdOperator, op op) error
60+
}
61+
62+
func (m *mockPoller) wait() error {
63+
return nil
64+
}
65+
66+
func (m *mockPoller) control(fd *fdOperator, op op) error {
67+
return m.controlFunc(fd, op)
68+
}
69+
70+
type mockConn struct {
71+
net.Conn
72+
controlFunc func(f func(fd uintptr)) error
73+
}
74+
75+
func (c *mockConn) SyscallConn() (syscall.RawConn, error) {
76+
return &mockRawConn{
77+
controlFunc: c.controlFunc,
78+
}, nil
79+
}
80+
81+
type mockRawConn struct {
82+
syscall.RawConn
83+
controlFunc func(f func(fd uintptr)) error
84+
}
85+
86+
func (r *mockRawConn) Control(f func(fd uintptr)) error {
87+
return r.controlFunc(f)
88+
}
89+
90+
func TestListenConnState_Err(t *testing.T) {
91+
var expectDetach bool
92+
pollInitOnce.Do(func() {})
93+
cases := []struct {
94+
name string
95+
connControlFunc func(f func(fd uintptr)) error
96+
pollControlFunc func(fd *fdOperator, op op) error
97+
expectErr error
98+
}{
99+
{
100+
name: "err conn control",
101+
connControlFunc: func(f func(fd uintptr)) error {
102+
return errors.New("err conn control")
103+
},
104+
expectErr: errors.New("err conn control"),
105+
},
106+
{
107+
name: "err poll control",
108+
connControlFunc: func(f func(fd uintptr)) error {
109+
f(1)
110+
return nil
111+
},
112+
pollControlFunc: func(fd *fdOperator, op op) error {
113+
assert.Equal(t, fd.fd, 1)
114+
return errors.New("err poll control")
115+
},
116+
expectErr: errors.New("err poll control"),
117+
},
118+
{
119+
name: "err conn control after poll add",
120+
connControlFunc: func(f func(fd uintptr)) error {
121+
f(1)
122+
return errors.New("err conn control after poll add")
123+
},
124+
pollControlFunc: func(fd *fdOperator, op op) error {
125+
if op == opDel {
126+
expectDetach = true
127+
}
128+
assert.Equal(t, fd.fd, 1)
129+
return nil
130+
},
131+
expectErr: errors.New("err conn control after poll add"),
132+
},
133+
}
134+
for _, c := range cases {
135+
t.Run(c.name, func(t *testing.T) {
136+
poll = &mockPoller{
137+
controlFunc: c.pollControlFunc,
138+
}
139+
conn := &mockConn{
140+
controlFunc: c.connControlFunc,
141+
}
142+
_, err := ListenConnState(conn)
143+
assert.Equal(t, c.expectErr, err)
144+
})
145+
}
146+
assert.True(t, expectDetach)
147+
}
148+
149+
func BenchmarkListenConnState(b *testing.B) {
150+
ln, err := net.Listen("tcp", "localhost:0")
151+
if err != nil {
152+
panic(err)
153+
}
154+
go func() {
155+
for {
156+
conn, err := ln.Accept()
157+
assert.Nil(b, err)
158+
go func() {
159+
buf := make([]byte, 11)
160+
_, err := conn.Read(buf)
161+
assert.Nil(b, err)
162+
conn.Close()
163+
}()
164+
}
165+
}()
166+
b.RunParallel(func(pb *testing.PB) {
167+
for pb.Next() {
168+
conn, err := net.Dial("tcp", ln.Addr().String())
169+
assert.Nil(b, err)
170+
stater, err := ListenConnState(conn)
171+
assert.Nil(b, err)
172+
assert.Equal(b, StateOK, stater.State())
173+
_, err = conn.Write([]byte("hello world"))
174+
assert.Nil(b, err)
175+
time.Sleep(20 * time.Millisecond)
176+
assert.Equal(b, StateRemoteClosed, stater.State())
177+
assert.Nil(b, stater.Close())
178+
assert.Nil(b, conn.Close())
179+
assert.Equal(b, StateClosed, stater.State())
180+
}
181+
})
182+
}

0 commit comments

Comments
 (0)