pb_app_test.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package process
  2. import (
  3. "context"
  4. "crypto/tls"
  5. "ehang.io/nps/core/action"
  6. "ehang.io/nps/lib/enet"
  7. "ehang.io/nps/lib/pb"
  8. "fmt"
  9. "github.com/stretchr/testify/assert"
  10. "net"
  11. "net/http"
  12. "testing"
  13. "time"
  14. )
  15. func TestProtobufProcess(t *testing.T) {
  16. sAddr, err := startHttps(t)
  17. assert.NoError(t, err)
  18. h := &PbAppProcessor{}
  19. ac := &action.LocalAction{
  20. DefaultAction: action.DefaultAction{},
  21. TargetAddr: []string{sAddr},
  22. }
  23. ac.Init()
  24. err = h.Init(ac)
  25. assert.NoError(t, err)
  26. ln, err := net.Listen("tcp", "127.0.0.1:0")
  27. assert.NoError(t, err)
  28. go func() {
  29. for {
  30. c, err := ln.Accept()
  31. assert.NoError(t, err)
  32. go func() {
  33. _, _ = h.ProcessConn(enet.NewReaderConn(c))
  34. _ = c.Close()
  35. }()
  36. }
  37. }()
  38. client := http.Client{Transport: &http.Transport{
  39. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  40. MaxIdleConns: 10000,
  41. IdleConnTimeout: 30 * time.Second,
  42. DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) {
  43. conn, err := net.Dial("tcp", ln.Addr().String())
  44. _, err = pb.WriteMessage(conn, &pb.AppInfo{AppAddr: sAddr})
  45. return conn, err
  46. },
  47. }}
  48. resp, err := client.Get(fmt.Sprintf("https://%s%s", ln.Addr().String(), "/now"))
  49. assert.NoError(t, err)
  50. assert.NotEmpty(t, resp)
  51. }
  52. func TestProtobufUdpProcess(t *testing.T) {
  53. finish := make(chan struct{}, 0)
  54. lAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:0")
  55. assert.NoError(t, err)
  56. udpServer, err := net.ListenUDP("udp", lAddr)
  57. assert.NoError(t, err)
  58. h := &PbAppProcessor{}
  59. ac := &action.LocalAction{
  60. DefaultAction: action.DefaultAction{},
  61. TargetAddr: []string{udpServer.LocalAddr().String()},
  62. }
  63. ac.Init()
  64. err = h.Init(ac)
  65. assert.NoError(t, err)
  66. ln, err := net.Listen("tcp", "127.0.0.1:0")
  67. assert.NoError(t, err)
  68. go func() {
  69. for {
  70. c, err := ln.Accept()
  71. assert.NoError(t, err)
  72. go func() {
  73. _, _ = h.ProcessConn(enet.NewReaderConn(c))
  74. _ = c.Close()
  75. }()
  76. }
  77. }()
  78. data := []byte{1, 2, 3, 4}
  79. dataReturn := []byte{4, 5, 6, 7}
  80. conn, err := net.Dial("tcp", ln.Addr().String())
  81. _, err = pb.WriteMessage(conn, &pb.AppInfo{AppAddr: udpServer.LocalAddr().String(), ConnType: pb.ConnType_udp})
  82. go func() {
  83. b := make([]byte, 1024)
  84. n, addr, err := udpServer.ReadFrom(b)
  85. assert.NoError(t, err)
  86. assert.Equal(t, b[:n], data)
  87. _, err = udpServer.WriteTo(dataReturn, addr)
  88. assert.NoError(t, err)
  89. finish <- struct{}{}
  90. }()
  91. c := enet.NewTcpPacketConn(conn)
  92. _, err = c.WriteTo(data, udpServer.LocalAddr())
  93. assert.NoError(t, err)
  94. <-finish
  95. b := make([]byte, 1024)
  96. n, addr, err := c.ReadFrom(b)
  97. assert.NoError(t, err)
  98. assert.Equal(t, dataReturn, b[:n])
  99. assert.Equal(t, addr.String(), udpServer.LocalAddr().String())
  100. }