qchen.fun/fatchoy@v0.6.9/codec/server_codec_test.go (about)

     1  // Copyright © 2021-present simon@qchen.fun All rights reserved.
     2  // Distributed under the terms and conditions of the BSD License.
     3  // See accompanying files LICENSE.
     4  
     5  package codec
     6  
     7  import (
     8  	"bytes"
     9  	"math/rand"
    10  	"testing"
    11  	"time"
    12  
    13  	"qchen.fun/fatchoy"
    14  	"qchen.fun/fatchoy/x/cipher"
    15  	"qchen.fun/fatchoy/x/strutil"
    16  )
    17  
    18  func isEqualV2Packet(t *testing.T, a, b *fatchoy.Packet) bool {
    19  	if a.Command != b.Command || (a.Seq != b.Seq) {
    20  		return false
    21  	}
    22  	data1 := a.EncodeToBytes()
    23  	data2 := b.EncodeToBytes()
    24  	if len(data1) > 0 && len(data2) > 0 {
    25  		if !bytes.Equal(data1, data2) {
    26  			println("msg a md5sum", md5Sum(data1))
    27  			println("msg b md5sum", md5Sum(data2))
    28  			t.Fatalf("packet not equal, [%v] != [%v]", a, b)
    29  			return false
    30  		}
    31  	}
    32  	return true
    33  }
    34  
    35  func newTestV2Packet(bodyLen int, refcnt int) *fatchoy.Packet {
    36  	var pkt = fatchoy.AllocPacket()
    37  	pkt.Node = fatchoy.NodeID(rand.Uint32() % 100000)
    38  	pkt.Command = uint16(rand.Uint32() % 1000)
    39  	pkt.MsgID = rand.Uint32()
    40  	pkt.Seq = rand.Uint32() % 100000
    41  	if refcnt > 0 {
    42  		var nodes = make([]fatchoy.NodeID, refcnt)
    43  		for i := 0; i < refcnt; i++ {
    44  			nodes[i] = fatchoy.NodeID(rand.Int() % 1000000)
    45  		}
    46  	}
    47  	if bodyLen > 0 {
    48  		s := strutil.RandString(bodyLen)
    49  		pkt.SetBody([]byte(s))
    50  	}
    51  	return pkt
    52  }
    53  
    54  func testProtoCodecV2(t *testing.T, size int, msgSent *fatchoy.Packet, c Encoder) {
    55  	encrypt, _ := createCryptor("aes-192")
    56  	decrypt := cipher.NewCrypt("aes-192", encrypt.Key(), encrypt.IV())
    57  	// 如果加密方式是原地加密,会导致packet的body是加密后的内容
    58  	clone := append([]byte(nil), msgSent.EncodeToBytes()...)
    59  	var w bytes.Buffer
    60  	if _, err := c.Marshal(msgSent, encrypt, &w); err != nil {
    61  		t.Fatalf("Encode with size %d: %v", size, err)
    62  	}
    63  	msgSent.SetBody(nil)
    64  	msgRecv, err := ReadPacket(c, &w, decrypt)
    65  	if err != nil {
    66  		t.Fatalf("Decode with size %d: %v", size, err)
    67  	}
    68  	msgSent.SetBody(clone)
    69  	if !isEqualV2Packet(t, msgSent, msgRecv) {
    70  		t.Fatalf("Encode and Decode not equal: %d\n%v\n%v", size, msgSent, msgRecv)
    71  	}
    72  }
    73  
    74  func TestCodecV2_Encode(t *testing.T) {
    75  	rand.Seed(time.Now().UnixNano())
    76  	var enc = NewEncoder(0)
    77  	var sizeList = []int{404, 1012, 2014, 4018, 8012, 40487, 1024 * 31} //
    78  	for _, n := range sizeList {
    79  		var pkt = newTestV2Packet(n, rand.Int()%10)
    80  		testProtoCodecV2(t, n, pkt, enc)
    81  	}
    82  }
    83  
    84  func BenchmarkCodecV2Marshal(b *testing.B) {
    85  	b.StopTimer()
    86  	var size = 4096
    87  	b.Logf("benchmark with message size %d\n", size)
    88  	var msg = newTestV2Packet(size, 0)
    89  	b.StartTimer()
    90  
    91  	var w bytes.Buffer
    92  	var c = NewV1Encoder(0)
    93  	if _, err := c.Marshal(msg, nil, &w); err != nil {
    94  		b.Logf("Encode: %v", err)
    95  	}
    96  	w.Reset()
    97  }