re_enc_svr_client_test.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package test3
  2. import (
  3. "bytes"
  4. "context"
  5. "flag"
  6. "fmt"
  7. zmostp_go "git.swzry.com/zry/zmostp/zmostp-go"
  8. "math/rand"
  9. "net"
  10. "os"
  11. "sync"
  12. "testing"
  13. )
  14. type TestCase struct {
  15. Channel uint32
  16. Payload []byte
  17. }
  18. var flagHelp bool
  19. var flagServer string
  20. var flagBatchTestCount int
  21. var flagMaxRandomDataLength int
  22. var ENC *zmostp_go.Transmitter
  23. var DEC *zmostp_go.Receiver
  24. var INCH chan *zmostp_go.Message
  25. var OUTCH chan *zmostp_go.Message
  26. var LH *LogHandler
  27. func TestMain(m *testing.M) {
  28. fmt.Println("start.")
  29. flag.BoolVar(&flagHelp, "h", false, "print help")
  30. flag.StringVar(&flagServer, "s", "localhost:19810", "server address")
  31. flag.IntVar(&flagBatchTestCount, "b", 100, "batch test count")
  32. flag.IntVar(&flagMaxRandomDataLength, "l", 64, "max random data length")
  33. flag.Parse()
  34. if flagHelp {
  35. flag.PrintDefaults()
  36. return
  37. }
  38. addr, err := net.ResolveTCPAddr("tcp", flagServer)
  39. if err != nil {
  40. panic(fmt.Errorf("failed resolving tcp address: %v", err))
  41. }
  42. conn, err := net.DialTCP("tcp", nil, addr)
  43. if err != nil {
  44. panic(fmt.Errorf("failed dialing tcp: %v", err))
  45. }
  46. LH = &LogHandler{}
  47. ENC = zmostp_go.NewTransmitter(&zmostp_go.TransmitterConfig{
  48. Writer: conn,
  49. HumanFriendlySending: false,
  50. EnableCRC: true,
  51. })
  52. DEC = zmostp_go.NewReceiver(&zmostp_go.ReceiverConfig{
  53. ByteReader: zmostp_go.NewSimpleByteReader(conn),
  54. EnableCRC: true,
  55. DecodeFailureLog: LH,
  56. })
  57. INCH = ENC.GetMessageInChannel()
  58. OUTCH = DEC.GetMessageOutChannel()
  59. wg := sync.WaitGroup{}
  60. wg.Add(2)
  61. ctx, cncl := context.WithCancel(context.Background())
  62. go func() {
  63. err := ENC.Run(ctx)
  64. if err != nil {
  65. panic(err)
  66. }
  67. wg.Done()
  68. }()
  69. go func() {
  70. err := DEC.Run(ctx)
  71. if err != nil {
  72. panic(err)
  73. }
  74. wg.Done()
  75. }()
  76. fmt.Println("==== Init Ok ====")
  77. exitCode := m.Run()
  78. fmt.Println("==== Test End ====")
  79. cncl()
  80. _ = conn.Close()
  81. fmt.Println("==== Waiting for exit ====")
  82. wg.Wait()
  83. os.Exit(exitCode)
  84. }
  85. func TestFixedTestCase(t *testing.T) {
  86. testcases := []TestCase{
  87. {0, []byte("hello")},
  88. {114514, []byte("hello, gensoukyo")},
  89. {0xAA550101, []byte{0xAA, 0xA5, 0x5A, 0x01, 0x55, 0x00}},
  90. }
  91. for _, v := range testcases {
  92. testOneData(t, v.Channel, v.Payload, false)
  93. testOneData(t, v.Channel, v.Payload, true)
  94. }
  95. }
  96. func testOneData(t *testing.T, ch uint32, payload []byte, hf bool) {
  97. ENC.SetHumanFriendOutputOption(hf)
  98. INCH <- &zmostp_go.Message{
  99. Channel: ch,
  100. Payload: payload,
  101. }
  102. t.Logf("wait on ch %d", ch)
  103. rep := <-OUTCH
  104. if rep.Channel != ch {
  105. t.Fatalf("channel mismatch: got %d, want %d", rep.Channel, ch)
  106. }
  107. if !bytes.Equal(rep.Payload, payload) {
  108. t.Fatalf("payload mismatch: got %s, want %s", rep.Payload, payload)
  109. }
  110. t.Logf("test on ch %d ok", ch)
  111. }
  112. func pickRandom() *TestCase {
  113. ch := rand.Uint32()
  114. payloadLen := rand.Intn(flagMaxRandomDataLength)
  115. payload := make([]byte, payloadLen)
  116. rand.Read(payload)
  117. return &TestCase{
  118. Channel: ch,
  119. Payload: payload,
  120. }
  121. }
  122. func TestRandomTestCase(t *testing.T) {
  123. for i := 0; i < flagBatchTestCount; i++ {
  124. tc := pickRandom()
  125. testOneData(t, tc.Channel, tc.Payload, false)
  126. testOneData(t, tc.Channel, tc.Payload, true)
  127. }
  128. }