nps/core/process/pb_app_test.go
2022-01-23 17:30:38 +08:00

114 lines
2.6 KiB
Go

package process
import (
"context"
"crypto/tls"
"ehang.io/nps/core/action"
"ehang.io/nps/lib/enet"
"ehang.io/nps/lib/pb"
"fmt"
"github.com/stretchr/testify/assert"
"net"
"net/http"
"testing"
"time"
)
func TestProtobufProcess(t *testing.T) {
sAddr, err := startHttps(t)
assert.NoError(t, err)
h := &PbAppProcessor{}
ac := &action.LocalAction{
DefaultAction: action.DefaultAction{},
TargetAddr: []string{sAddr},
}
ac.Init()
err = h.Init(ac)
assert.NoError(t, err)
ln, err := net.Listen("tcp", "127.0.0.1:0")
assert.NoError(t, err)
go func() {
for {
c, err := ln.Accept()
assert.NoError(t, err)
go func() {
_, _ = h.ProcessConn(enet.NewReaderConn(c))
_ = c.Close()
}()
}
}()
client := http.Client{Transport: &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
MaxIdleConns: 10000,
IdleConnTimeout: 30 * time.Second,
DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
conn, err := net.Dial("tcp", ln.Addr().String())
_, err = pb.WriteMessage(conn, &pb.AppInfo{AppAddr: sAddr})
return conn, err
},
}}
resp, err := client.Get(fmt.Sprintf("https://%s%s", ln.Addr().String(), "/now"))
assert.NoError(t, err)
assert.NotEmpty(t, resp)
}
func TestProtobufUdpProcess(t *testing.T) {
finish := make(chan struct{}, 0)
lAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:0")
assert.NoError(t, err)
udpServer, err := net.ListenUDP("udp", lAddr)
assert.NoError(t, err)
h := &PbAppProcessor{}
ac := &action.LocalAction{
DefaultAction: action.DefaultAction{},
TargetAddr: []string{udpServer.LocalAddr().String()},
}
ac.Init()
err = h.Init(ac)
assert.NoError(t, err)
ln, err := net.Listen("tcp", "127.0.0.1:0")
assert.NoError(t, err)
go func() {
for {
c, err := ln.Accept()
assert.NoError(t, err)
go func() {
_, _ = h.ProcessConn(enet.NewReaderConn(c))
_ = c.Close()
}()
}
}()
data := []byte{1, 2, 3, 4}
dataReturn := []byte{4, 5, 6, 7}
conn, err := net.Dial("tcp", ln.Addr().String())
_, err = pb.WriteMessage(conn, &pb.AppInfo{AppAddr: udpServer.LocalAddr().String(), ConnType: pb.ConnType_udp})
go func() {
b := make([]byte, 1024)
n, addr, err := udpServer.ReadFrom(b)
assert.NoError(t, err)
assert.Equal(t, b[:n], data)
_, err = udpServer.WriteTo(dataReturn, addr)
assert.NoError(t, err)
finish <- struct{}{}
}()
c := enet.NewTcpPacketConn(conn)
_, err = c.WriteTo(data, udpServer.LocalAddr())
assert.NoError(t, err)
<-finish
b := make([]byte, 1024)
n, addr, err := c.ReadFrom(b)
assert.NoError(t, err)
assert.Equal(t, dataReturn, b[:n])
assert.Equal(t, addr.String(), udpServer.LocalAddr().String())
}