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 }