github.com/angenalZZZ/gofunc@v0.0.0-20210507121333-48ff1be3917b/net/codec_test.go (about) 1 package net 2 3 import ( 4 "encoding/binary" 5 "math/rand" 6 "testing" 7 ) 8 9 func TestLengthFieldBasedFrameCodecWith1(t *testing.T) { 10 encoderConfig := EncoderConfig{ 11 ByteOrder: binary.BigEndian, 12 LengthFieldLength: 1, 13 LengthAdjustment: 0, 14 LengthIncludesLengthFieldLength: false, 15 } 16 decoderConfig := DecoderConfig{ 17 ByteOrder: binary.BigEndian, 18 LengthFieldOffset: 0, 19 LengthFieldLength: 1, 20 LengthAdjustment: 0, 21 InitialBytesToStrip: 1, 22 } 23 codec := NewLengthFieldBasedFrameCodec(encoderConfig, decoderConfig) 24 25 sz := 256 26 data := make([]byte, sz) 27 if _, err := rand.Read(data); err != nil { 28 panic(err) 29 } 30 if _, err := codec.Encode(nil, data); err == nil { 31 panic("should have a error of exceeding bytes.") 32 } 33 34 sz = 255 35 data = make([]byte, sz) 36 if _, err := rand.Read(data); err != nil { 37 panic(err) 38 } 39 out, _ := codec.Encode(nil, data) 40 if string(out[1:]) != string(data) { 41 t.Fatalf("data don't match with big endian, raw data: %s, encoded data: %s\n", string(data), string(out)) 42 } 43 44 encoderConfig.ByteOrder = binary.LittleEndian 45 decoderConfig.ByteOrder = binary.LittleEndian 46 codec = NewLengthFieldBasedFrameCodec(encoderConfig, decoderConfig) 47 if _, err := rand.Read(data); err != nil { 48 panic(err) 49 } 50 out, _ = codec.Encode(nil, data) 51 if string(out[1:]) != string(data) { 52 t.Fatalf("data don't match with little endian, raw data: %s, encoded data: %s\n", string(data), string(out)) 53 } 54 } 55 56 func TestLengthFieldBasedFrameCodecWith2(t *testing.T) { 57 encoderConfig := EncoderConfig{ 58 ByteOrder: binary.BigEndian, 59 LengthFieldLength: 2, 60 LengthAdjustment: 0, 61 LengthIncludesLengthFieldLength: false, 62 } 63 decoderConfig := DecoderConfig{ 64 ByteOrder: binary.BigEndian, 65 LengthFieldOffset: 0, 66 LengthFieldLength: 2, 67 LengthAdjustment: 0, 68 InitialBytesToStrip: 2, 69 } 70 codec := NewLengthFieldBasedFrameCodec(encoderConfig, decoderConfig) 71 72 sz := 65536 73 data := make([]byte, sz) 74 if _, err := rand.Read(data); err != nil { 75 panic(err) 76 } 77 if _, err := codec.Encode(nil, data); err == nil { 78 panic("should have a error of exceeding bytes.") 79 } 80 81 sz = rand.Intn(10) * 1024 82 data = make([]byte, sz) 83 if _, err := rand.Read(data); err != nil { 84 panic(err) 85 } 86 out, _ := codec.Encode(nil, data) 87 if string(out[2:]) != string(data) { 88 t.Fatalf("data don't match with big endian, raw data: %s, encoded data: %s\n", string(data), string(out)) 89 } 90 91 encoderConfig.ByteOrder = binary.LittleEndian 92 decoderConfig.ByteOrder = binary.LittleEndian 93 codec = NewLengthFieldBasedFrameCodec(encoderConfig, decoderConfig) 94 sz = rand.Intn(10) * 1024 95 data = make([]byte, sz) 96 if _, err := rand.Read(data); err != nil { 97 panic(err) 98 } 99 out, _ = codec.Encode(nil, data) 100 if string(out[2:]) != string(data) { 101 t.Fatalf("data don't match with little endian, raw data: %s, encoded data: %s\n", string(data), string(out)) 102 } 103 } 104 105 func TestLengthFieldBasedFrameCodecWith3(t *testing.T) { 106 encoderConfig := EncoderConfig{ 107 ByteOrder: binary.BigEndian, 108 LengthFieldLength: 3, 109 LengthAdjustment: 0, 110 LengthIncludesLengthFieldLength: false, 111 } 112 decoderConfig := DecoderConfig{ 113 ByteOrder: binary.BigEndian, 114 LengthFieldOffset: 0, 115 LengthFieldLength: 3, 116 LengthAdjustment: 0, 117 InitialBytesToStrip: 3, 118 } 119 codec := NewLengthFieldBasedFrameCodec(encoderConfig, decoderConfig) 120 121 sz := 16777216 122 data := make([]byte, sz) 123 if _, err := rand.Read(data); err != nil { 124 panic(err) 125 } 126 if _, err := codec.Encode(nil, data); err == nil { 127 panic("should have a error of exceeding bytes.") 128 } 129 130 sz = rand.Intn(10) * 64 * 1024 131 data = make([]byte, sz) 132 if _, err := rand.Read(data); err != nil { 133 panic(err) 134 } 135 out, _ := codec.Encode(nil, data) 136 if string(out[3:]) != string(data) { 137 t.Fatalf("data don't match with big endian, raw data: %s, encoded data: %s\n", string(data), string(out)) 138 } 139 140 encoderConfig.ByteOrder = binary.LittleEndian 141 decoderConfig.ByteOrder = binary.LittleEndian 142 codec = NewLengthFieldBasedFrameCodec(encoderConfig, decoderConfig) 143 sz = rand.Intn(10) * 64 * 1024 144 data = make([]byte, sz) 145 if _, err := rand.Read(data); err != nil { 146 panic(err) 147 } 148 out, _ = codec.Encode(nil, data) 149 if string(out[3:]) != string(data) { 150 t.Fatalf("data don't match with little endian, raw data: %s, encoded data: %s\n", string(data), string(out)) 151 } 152 153 buf := make([]byte, 3) 154 rand.Read(buf) 155 bNum := readUint24(binary.BigEndian, buf) 156 p := writeUint24(binary.BigEndian, int(bNum)) 157 if string(buf) != string(p) { 158 t.Fatalf("data don't match with big endian, raw data: %s, recovered data: %s\n", string(buf), string(p)) 159 } 160 161 rand.Read(buf) 162 bNum = readUint24(binary.LittleEndian, buf) 163 p = writeUint24(binary.LittleEndian, int(bNum)) 164 if string(buf) != string(p) { 165 t.Fatalf("data don't match with little endian, raw data: %s, recovered data: %s\n", string(buf), string(p)) 166 } 167 } 168 169 func TestLengthFieldBasedFrameCodecWith8(t *testing.T) { 170 encoderConfig := EncoderConfig{ 171 ByteOrder: binary.BigEndian, 172 LengthFieldLength: 8, 173 LengthAdjustment: 0, 174 LengthIncludesLengthFieldLength: false, 175 } 176 decoderConfig := DecoderConfig{ 177 ByteOrder: binary.BigEndian, 178 LengthFieldOffset: 0, 179 LengthFieldLength: 8, 180 LengthAdjustment: 0, 181 InitialBytesToStrip: 8, 182 } 183 codec := NewLengthFieldBasedFrameCodec(encoderConfig, decoderConfig) 184 sz := rand.Intn(10) * 1024 * 1024 185 data := make([]byte, sz) 186 if _, err := rand.Read(data); err != nil { 187 panic(err) 188 } 189 out, _ := codec.Encode(nil, data) 190 if string(out[8:]) != string(data) { 191 t.Fatalf("data don't match with big endian, raw data: %s, encoded data: %s\n", string(data), string(out)) 192 } 193 194 encoderConfig.ByteOrder = binary.LittleEndian 195 decoderConfig.ByteOrder = binary.LittleEndian 196 codec = NewLengthFieldBasedFrameCodec(encoderConfig, decoderConfig) 197 sz = rand.Intn(10) * 1024 * 1024 198 data = make([]byte, sz) 199 if _, err := rand.Read(data); err != nil { 200 panic(err) 201 } 202 out, _ = codec.Encode(nil, data) 203 if string(out[8:]) != string(data) { 204 t.Fatalf("data don't match with little endian, raw data: %s, encoded data: %s\n", string(data), string(out)) 205 } 206 } 207 208 func TestFixedLengthFrameCodec_Encode(t *testing.T) { 209 codec := NewFixedLengthFrameCodec(8) 210 if data, err := codec.Encode(nil, make([]byte, 15)); data != nil || err != errInvalidFixedLength { 211 panic("should have a error of invalid fixed length") 212 } 213 } 214 215 func TestInnerBufferReadN(t *testing.T) { 216 var in innerBuffer 217 data := make([]byte, 10) 218 if _, err := rand.Read(data); err != nil { 219 panic(err) 220 } 221 in = data 222 if _, err := in.readN(-1); err == nil { 223 t.Fatal("error missing") 224 } 225 if _, err := in.readN(11); err == nil { 226 t.Fatal("error missing") 227 } 228 if _, err := in.readN(1); err != nil { 229 t.Fatal("unexpected error") 230 } 231 if len(in) != 9 { 232 t.Fatal("wrong length of leftover bytes") 233 } 234 }