-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsession_test.go
112 lines (96 loc) · 2.64 KB
/
session_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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package tunnel_test
import (
"net"
"testing"
"github.com/forbearing/golib/bootstrap"
"github.com/forbearing/golib/tunnel"
"github.com/forbearing/golib/types/consts"
"github.com/stretchr/testify/assert"
)
var (
addr = "0.0.0.0:12345"
doneCh = make(chan struct{}, 1)
Bye = tunnel.NewCmd("bye", 1000)
Hello = tunnel.NewCmd("hello", 1001)
)
type ByePaylod struct {
Field1 string
Field2 uint64
}
type HelloPaylod struct {
Field3 string
Field4 float64
}
var (
byePayload1 = ByePaylod{Field1: "bye1", Field2: 123}
byePayload2 = ByePaylod{Field1: "bye2", Field2: 456}
helloPayload1 = HelloPaylod{Field3: "hello1", Field4: 3.14}
helloPayload2 = HelloPaylod{Field3: "hello2", Field4: 3.14}
)
func TestSession(t *testing.T) {
assert.NoError(t, bootstrap.Bootstrap())
go server(t)
client(t)
<-doneCh
}
func server(t *testing.T) {
l, err := net.Listen("tcp", addr)
assert.NoError(t, err)
defer l.Close()
doneCh <- struct{}{}
conn, err := l.Accept()
assert.NoError(t, err)
defer conn.Close()
session, _ := tunnel.NewSession(conn, consts.Server)
for {
event, err := session.Read()
assert.NoError(t, err)
switch event.Cmd {
case tunnel.Ping:
t.Log("client ping")
session.Write(&tunnel.Event{Cmd: tunnel.Pong})
case Hello:
payload := new(HelloPaylod)
assert.NoError(t, tunnel.DecodePayload(event.Payload, payload))
assert.Equal(t, helloPayload1, *payload)
t.Logf("client hello: %+v\n", *payload)
session.Write(&tunnel.Event{Cmd: Hello, Payload: helloPayload2})
case Bye:
payload := new(ByePaylod)
assert.NoError(t, tunnel.DecodePayload(event.Payload, payload))
assert.Equal(t, byePayload1, *payload)
t.Logf("client bye: %+v\n", *payload)
session.Write(&tunnel.Event{Cmd: Bye, Payload: byePayload2})
}
}
}
func client(t *testing.T) {
<-doneCh
conn, err := net.Dial("tcp", addr)
assert.NoError(t, err)
defer conn.Close()
session, _ := tunnel.NewSession(conn, consts.Client)
session.Write(&tunnel.Event{Cmd: tunnel.Ping})
for {
event, err := session.Read()
assert.NoError(t, err)
switch event.Cmd {
case tunnel.Pong:
t.Log("server pong")
session.Write(&tunnel.Event{Cmd: Hello, Payload: helloPayload1})
case Hello:
payload := new(HelloPaylod)
assert.NoError(t, tunnel.DecodePayload(event.Payload, payload))
assert.Equal(t, helloPayload2, *payload)
t.Logf("server hello: %+v\n", *payload)
session.Write(&tunnel.Event{Cmd: Bye, Payload: byePayload1})
case Bye:
payload := new(ByePaylod)
assert.NoError(t, tunnel.DecodePayload(event.Payload, payload))
assert.Equal(t, byePayload2, *payload)
t.Logf("server bye: %+v\n", *payload)
doneCh <- struct{}{}
return
}
}
}