123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- package test3
- import (
- "bytes"
- "context"
- "flag"
- "fmt"
- zmostp_go "git.swzry.com/zry/zmostp/zmostp-go"
- "math/rand"
- "net"
- "os"
- "sync"
- "testing"
- )
- type TestCase struct {
- Channel uint32
- Payload []byte
- }
- var flagHelp bool
- var flagServer string
- var flagBatchTestCount int
- var flagMaxRandomDataLength int
- var ENC *zmostp_go.Transmitter
- var DEC *zmostp_go.Receiver
- var INCH chan *zmostp_go.Message
- var OUTCH chan *zmostp_go.Message
- var LH *LogHandler
- func TestMain(m *testing.M) {
- fmt.Println("start.")
- flag.BoolVar(&flagHelp, "h", false, "print help")
- flag.StringVar(&flagServer, "s", "localhost:19810", "server address")
- flag.IntVar(&flagBatchTestCount, "b", 100, "batch test count")
- flag.IntVar(&flagMaxRandomDataLength, "l", 64, "max random data length")
- flag.Parse()
- if flagHelp {
- flag.PrintDefaults()
- return
- }
- addr, err := net.ResolveTCPAddr("tcp", flagServer)
- if err != nil {
- panic(fmt.Errorf("failed resolving tcp address: %v", err))
- }
- conn, err := net.DialTCP("tcp", nil, addr)
- if err != nil {
- panic(fmt.Errorf("failed dialing tcp: %v", err))
- }
- LH = &LogHandler{}
- ENC = zmostp_go.NewTransmitter(&zmostp_go.TransmitterConfig{
- Writer: conn,
- HumanFriendlySending: false,
- EnableCRC: true,
- })
- DEC = zmostp_go.NewReceiver(&zmostp_go.ReceiverConfig{
- ByteReader: zmostp_go.NewSimpleByteReader(conn),
- EnableCRC: true,
- DecodeFailureLog: LH,
- })
- INCH = ENC.GetMessageInChannel()
- OUTCH = DEC.GetMessageOutChannel()
- wg := sync.WaitGroup{}
- wg.Add(2)
- ctx, cncl := context.WithCancel(context.Background())
- go func() {
- err := ENC.Run(ctx)
- if err != nil {
- panic(err)
- }
- wg.Done()
- }()
- go func() {
- err := DEC.Run(ctx)
- if err != nil {
- panic(err)
- }
- wg.Done()
- }()
- fmt.Println("==== Init Ok ====")
- exitCode := m.Run()
- fmt.Println("==== Test End ====")
- cncl()
- _ = conn.Close()
- fmt.Println("==== Waiting for exit ====")
- wg.Wait()
- os.Exit(exitCode)
- }
- func TestFixedTestCase(t *testing.T) {
- testcases := []TestCase{
- {0, []byte("hello")},
- {114514, []byte("hello, gensoukyo")},
- {0xAA550101, []byte{0xAA, 0xA5, 0x5A, 0x01, 0x55, 0x00}},
- }
- for _, v := range testcases {
- testOneData(t, v.Channel, v.Payload, false)
- testOneData(t, v.Channel, v.Payload, true)
- }
- }
- func testOneData(t *testing.T, ch uint32, payload []byte, hf bool) {
- ENC.SetHumanFriendOutputOption(hf)
- INCH <- &zmostp_go.Message{
- Channel: ch,
- Payload: payload,
- }
- t.Logf("wait on ch %d", ch)
- rep := <-OUTCH
- if rep.Channel != ch {
- t.Fatalf("channel mismatch: got %d, want %d", rep.Channel, ch)
- }
- if !bytes.Equal(rep.Payload, payload) {
- t.Fatalf("payload mismatch: got %s, want %s", rep.Payload, payload)
- }
- t.Logf("test on ch %d ok", ch)
- }
- func pickRandom() *TestCase {
- ch := rand.Uint32()
- payloadLen := rand.Intn(flagMaxRandomDataLength)
- payload := make([]byte, payloadLen)
- rand.Read(payload)
- return &TestCase{
- Channel: ch,
- Payload: payload,
- }
- }
- func TestRandomTestCase(t *testing.T) {
- for i := 0; i < flagBatchTestCount; i++ {
- tc := pickRandom()
- testOneData(t, tc.Channel, tc.Payload, false)
- testOneData(t, tc.Channel, tc.Payload, true)
- }
- }
|