Skip to content

Commit d43bee7

Browse files
authored
Merge pull request #27 from IceFireDB/feat_support_unittest
feat(unittest):support unittest
2 parents b71dc36 + 40bd471 commit d43bee7

File tree

3 files changed

+140
-2
lines changed

3 files changed

+140
-2
lines changed

go.mod

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,19 @@ module github.com/IceFireDB/redhub
22

33
go 1.24.0
44

5-
require github.com/panjf2000/gnet v1.6.7
5+
require (
6+
github.com/panjf2000/gnet v1.6.7
7+
github.com/stretchr/testify v1.8.4
8+
)
69

710
require (
11+
github.com/davecgh/go-spew v1.1.1 // indirect
812
github.com/panjf2000/ants/v2 v2.9.0 // indirect
9-
github.com/stretchr/testify v1.8.4 // indirect
13+
github.com/pmezard/go-difflib v1.0.0 // indirect
1014
github.com/valyala/bytebufferpool v1.0.0 // indirect
1115
go.uber.org/multierr v1.11.0 // indirect
1216
go.uber.org/zap v1.27.0 // indirect
1317
golang.org/x/sys v0.26.0 // indirect
1418
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
19+
gopkg.in/yaml.v3 v3.0.1 // indirect
1520
)

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@ github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZx
33
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
44
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
55
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
6+
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
67
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
78
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
89
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
10+
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
11+
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
912
github.com/panjf2000/ants/v2 v2.4.7/go.mod h1:f6F0NZVFsGCp5A7QW/Zj/m92atWwOkY0OIhFxRNFr4A=
1013
github.com/panjf2000/ants/v2 v2.9.0 h1:SztCLkVxBRigbg+vt0S5QvF5vxAbxbKt09/YfAJ0tEo=
1114
github.com/panjf2000/ants/v2 v2.9.0/go.mod h1:7ZxyxsqE4vvW0M7LSD8aI3cKwgFhBHbxnlN8mDqHa1I=
@@ -70,6 +73,7 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
7073
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
7174
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
7275
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
76+
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
7377
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
7478
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
7579
gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=

redhub_test.go

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
package redhub
2+
3+
import (
4+
"net"
5+
"testing"
6+
7+
"github.com/IceFireDB/redhub/pkg/resp"
8+
"github.com/panjf2000/gnet"
9+
"github.com/stretchr/testify/assert"
10+
)
11+
12+
type mockConn struct {
13+
gnet.Conn
14+
id string
15+
closed bool
16+
written []byte
17+
}
18+
19+
func (m *mockConn) Write(buf []byte) error {
20+
m.written = append(m.written, buf...)
21+
return nil
22+
}
23+
24+
func (m *mockConn) Close() error {
25+
m.closed = true
26+
return nil
27+
}
28+
29+
func (m *mockConn) Context() interface{} { return nil }
30+
func (m *mockConn) SetContext(interface{}) {}
31+
func (m *mockConn) RemoteAddr() net.Addr {
32+
return &net.TCPAddr{
33+
IP: net.ParseIP("127.0.0.1"),
34+
Port: 6379,
35+
Zone: "",
36+
}
37+
}
38+
39+
func TestNewRedHub(t *testing.T) {
40+
onOpened := func(c *Conn) ([]byte, Action) { return nil, None }
41+
onClosed := func(c *Conn, err error) Action { return None }
42+
handler := func(cmd resp.Command, out []byte) ([]byte, Action) { return out, None }
43+
44+
rh := NewRedHub(onOpened, onClosed, handler)
45+
assert.NotNil(t, rh)
46+
assert.NotNil(t, rh.redHubBufMap)
47+
assert.NotNil(t, rh.connSync)
48+
}
49+
50+
func TestOnOpened(t *testing.T) {
51+
onOpened := func(c *Conn) ([]byte, Action) {
52+
return []byte("WELCOME"), None
53+
}
54+
rh := NewRedHub(onOpened, nil, nil)
55+
56+
mock := &mockConn{id: "test1"}
57+
out, action := rh.OnOpened(mock)
58+
assert.Equal(t, "WELCOME", string(out))
59+
assert.Equal(t, gnet.None, action)
60+
61+
rh.connSync.RLock()
62+
_, ok := rh.redHubBufMap[mock]
63+
rh.connSync.RUnlock()
64+
assert.True(t, ok)
65+
}
66+
67+
func TestOnClosed(t *testing.T) {
68+
onClosed := func(c *Conn, err error) Action {
69+
return Close
70+
}
71+
rh := NewRedHub(nil, onClosed, nil)
72+
73+
mock := &mockConn{id: "test1"}
74+
rh.connSync.Lock()
75+
rh.redHubBufMap[mock] = &connBuffer{}
76+
rh.connSync.Unlock()
77+
78+
action := rh.OnClosed(mock, nil)
79+
assert.Equal(t, gnet.Close, action)
80+
81+
rh.connSync.RLock()
82+
_, ok := rh.redHubBufMap[mock]
83+
rh.connSync.RUnlock()
84+
assert.False(t, ok)
85+
}
86+
87+
func TestReact_InvalidCommand(t *testing.T) {
88+
handler := func(cmd resp.Command, out []byte) ([]byte, Action) {
89+
return out, None
90+
}
91+
rh := NewRedHub(nil, nil, handler)
92+
93+
mock := &mockConn{id: "test1"}
94+
out, action := rh.React([]byte("invalid command"), mock)
95+
assert.Contains(t, string(out), "ERR")
96+
assert.Equal(t, gnet.None, action)
97+
}
98+
99+
func TestReact_ValidCommand(t *testing.T) {
100+
handler := func(cmd resp.Command, out []byte) ([]byte, Action) {
101+
return append(out, []byte("OK")...), None
102+
}
103+
rh := NewRedHub(nil, nil, handler)
104+
105+
mock := &mockConn{id: "test1"}
106+
rh.connSync.Lock()
107+
rh.redHubBufMap[mock] = &connBuffer{}
108+
rh.connSync.Unlock()
109+
110+
// Test a simple PING command
111+
out, action := rh.React([]byte("*1\r\n$4\r\nPING\r\n"), mock)
112+
assert.Equal(t, "OK", string(out))
113+
assert.Equal(t, gnet.None, action)
114+
}
115+
116+
func TestReact_CloseAction(t *testing.T) {
117+
handler := func(cmd resp.Command, out []byte) ([]byte, Action) {
118+
return out, Close
119+
}
120+
rh := NewRedHub(nil, nil, handler)
121+
122+
mock := &mockConn{id: "test1"}
123+
rh.connSync.Lock()
124+
rh.redHubBufMap[mock] = &connBuffer{}
125+
rh.connSync.Unlock()
126+
127+
_, action := rh.React([]byte("*1\r\n$4\r\nQUIT\r\n"), mock)
128+
assert.Equal(t, gnet.Close, action)
129+
}

0 commit comments

Comments
 (0)