github.com/cloudwego/kitex@v0.9.0/pkg/remote/codec/thrift/binary_protocol_test.go (about) 1 /* 2 * Copyright 2021 CloudWeGo Authors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package thrift 18 19 import ( 20 "context" 21 "encoding/binary" 22 "testing" 23 24 "github.com/apache/thrift/lib/go/thrift" 25 26 "github.com/cloudwego/kitex/internal/test" 27 "github.com/cloudwego/kitex/pkg/remote" 28 ) 29 30 func TestMessage(t *testing.T) { 31 trans := remote.NewReaderWriterBuffer(-1) 32 prot := NewBinaryProtocol(trans) 33 34 // check write 35 name := "name" 36 var seqID int32 = 1 37 typeID := thrift.CALL 38 err := prot.WriteMessageBegin(name, typeID, seqID) 39 test.Assert(t, err == nil, err) 40 41 tmp, _ := trans.Bytes() 42 test.Assert(t, binary.BigEndian.Uint32(tmp[:4]) == 0x80010001) 43 test.Assert(t, binary.BigEndian.Uint32(tmp[4:8]) == uint32(len(name))) 44 test.Assert(t, string(tmp[8:8+len(name)]) == name) 45 test.Assert(t, binary.BigEndian.Uint32(tmp[8+len(name):12+len(name)]) == uint32(seqID)) 46 47 err = prot.WriteMessageEnd() 48 test.Assert(t, err == nil, err) 49 50 err = prot.Flush(context.Background()) 51 test.Assert(t, err == nil, err) 52 53 // check read 54 _name, _typeID, _seqID, _err := prot.ReadMessageBegin() 55 test.Assert(t, _err == nil, _err) 56 test.Assert(t, _name == name, _name, name) 57 test.Assert(t, _typeID == typeID, _typeID, typeID) 58 test.Assert(t, _seqID == seqID, _seqID, seqID) 59 err = prot.ReadMessageEnd() 60 test.Assert(t, err == nil, err) 61 } 62 63 func TestStruct(t *testing.T) { 64 trans := remote.NewReaderWriterBuffer(-1) 65 prot := NewBinaryProtocol(trans) 66 67 name := "struct" 68 err := prot.WriteStructBegin(name) 69 test.Assert(t, err == nil, err) 70 err = prot.WriteStructEnd() 71 test.Assert(t, err == nil, err) 72 73 _name, _err := prot.ReadStructBegin() 74 test.Assert(t, _err == nil, _err) 75 test.Assert(t, _name == "", _name) 76 err = prot.ReadStructEnd() 77 test.Assert(t, err == nil, err) 78 } 79 80 func TestField(t *testing.T) { 81 trans := remote.NewReaderWriterBuffer(-1) 82 prot := NewBinaryProtocol(trans) 83 84 name := "name" 85 var fieldID int16 = 1 86 err := prot.WriteFieldBegin(name, thrift.STRUCT, fieldID) 87 test.Assert(t, err == nil, err) 88 err = prot.WriteFieldEnd() 89 test.Assert(t, err == nil, err) 90 err = prot.WriteFieldStop() 91 test.Assert(t, err == nil, err) 92 tmp, _ := trans.Bytes() 93 test.Assert(t, len(tmp) == 4) 94 test.Assert(t, tmp[0] == thrift.STRUCT) 95 test.Assert(t, binary.BigEndian.Uint16(tmp[1:]) == uint16(fieldID)) 96 test.Assert(t, tmp[3] == thrift.STOP) 97 err = prot.Flush(context.Background()) 98 test.Assert(t, err == nil, err) 99 100 _name, _typeID, _fieldID, _err := prot.ReadFieldBegin() 101 test.Assert(t, _err == nil, _err) 102 test.Assert(t, _name == "", _name) 103 test.Assert(t, _typeID == thrift.STRUCT, _typeID) 104 test.Assert(t, _fieldID == fieldID, _fieldID, fieldID) 105 err = prot.ReadFieldEnd() 106 test.Assert(t, err == nil, err) 107 // this is stop 108 _name, _typeID, _fieldID, _err = prot.ReadFieldBegin() 109 test.Assert(t, _err == nil, _err) 110 test.Assert(t, _name == "", _name) 111 test.Assert(t, _typeID == thrift.STOP, _typeID) 112 test.Assert(t, _fieldID == 0, _fieldID) 113 } 114 115 func TestMap(t *testing.T) { 116 trans := remote.NewReaderWriterBuffer(-1) 117 prot := NewBinaryProtocol(trans) 118 119 size := 10 120 err := prot.WriteMapBegin(thrift.I32, thrift.BOOL, size) 121 test.Assert(t, err == nil, err) 122 err = prot.WriteMapEnd() 123 test.Assert(t, err == nil, err) 124 tmp, _ := trans.Bytes() 125 test.Assert(t, len(tmp) == 6) 126 test.Assert(t, tmp[0] == thrift.I32) 127 test.Assert(t, tmp[1] == thrift.BOOL) 128 test.Assert(t, binary.BigEndian.Uint32(tmp[2:]) == uint32(size)) 129 130 err = prot.Flush(context.Background()) 131 test.Assert(t, err == nil, err) 132 133 _kType, _vType, _size, _err := prot.ReadMapBegin() 134 test.Assert(t, _err == nil, _err) 135 test.Assert(t, _size == size, _size, size) 136 test.Assert(t, _kType == thrift.I32, _kType) 137 test.Assert(t, _vType == thrift.BOOL, _vType) 138 err = prot.ReadMapEnd() 139 test.Assert(t, err == nil, err) 140 } 141 142 func TestList(t *testing.T) { 143 trans := remote.NewReaderWriterBuffer(-1) 144 prot := NewBinaryProtocol(trans) 145 146 size := 10 147 err := prot.WriteListBegin(thrift.I64, size) 148 test.Assert(t, err == nil, err) 149 err = prot.WriteListEnd() 150 test.Assert(t, err == nil, err) 151 tmp, _ := trans.Bytes() 152 test.Assert(t, len(tmp) == 5) 153 test.Assert(t, tmp[0] == thrift.I64) 154 test.Assert(t, binary.BigEndian.Uint32(tmp[1:]) == uint32(size)) 155 156 err = prot.Flush(context.Background()) 157 test.Assert(t, err == nil, err) 158 159 _type, _size, _err := prot.ReadListBegin() 160 test.Assert(t, _err == nil, _err) 161 test.Assert(t, _size == size, _size, size) 162 test.Assert(t, _type == thrift.I64, _type) 163 err = prot.ReadListEnd() 164 test.Assert(t, err == nil, err) 165 } 166 167 func TestSet(t *testing.T) { 168 trans := remote.NewReaderWriterBuffer(-1) 169 prot := NewBinaryProtocol(trans) 170 171 size := 10 172 err := prot.WriteSetBegin(thrift.STRING, size) 173 test.Assert(t, err == nil, err) 174 err = prot.WriteSetEnd() 175 test.Assert(t, err == nil, err) 176 tmp, _ := trans.Bytes() 177 test.Assert(t, len(tmp) == 5) 178 test.Assert(t, tmp[0] == thrift.STRING) 179 test.Assert(t, binary.BigEndian.Uint32(tmp[1:]) == uint32(size)) 180 181 err = prot.Flush(context.Background()) 182 test.Assert(t, err == nil, err) 183 184 _type, _size, _err := prot.ReadSetBegin() 185 test.Assert(t, _err == nil, _err) 186 test.Assert(t, _size == size, _size, size) 187 test.Assert(t, _type == thrift.STRING, _type) 188 err = prot.ReadSetEnd() 189 test.Assert(t, err == nil, err) 190 } 191 192 func TestConst(t *testing.T) { 193 trans := remote.NewReaderWriterBuffer(-1) 194 prot := NewBinaryProtocol(trans) 195 196 n := 0 197 err := prot.WriteBool(false) 198 n++ 199 test.Assert(t, err == nil, err) 200 err = prot.WriteByte(0x1) 201 n++ 202 test.Assert(t, err == nil, err) 203 err = prot.WriteI16(0x2) 204 n += 2 205 test.Assert(t, err == nil, err) 206 err = prot.WriteI32(0x3) 207 n += 4 208 test.Assert(t, err == nil, err) 209 err = prot.WriteI64(0x4) 210 n += 8 211 test.Assert(t, err == nil, err) 212 err = prot.WriteDouble(5.0) 213 n += 8 214 test.Assert(t, err == nil, err) 215 err = prot.WriteString("6") 216 n += 4 + 1 217 test.Assert(t, err == nil, err) 218 err = prot.WriteBinary([]byte{7}) 219 n += 4 + 1 220 test.Assert(t, err == nil, err) 221 err = prot.Flush(context.Background()) 222 test.Assert(t, err == nil, err) 223 224 tmp, _ := trans.Bytes() 225 test.Assert(t, len(tmp) == n, len(tmp)) 226 test.Assert(t, tmp[0] == 0x0) 227 test.Assert(t, tmp[1] == 0x1) 228 test.Assert(t, tmp[3] == 0x2) 229 test.Assert(t, tmp[7] == 0x3) 230 test.Assert(t, tmp[15] == 0x4) 231 test.Assert(t, string(tmp[28:29]) == "6") 232 test.Assert(t, tmp[33] == 0x7) 233 234 err = prot.Flush(context.Background()) 235 test.Assert(t, err == nil, err) 236 237 _bool, err := prot.ReadBool() 238 test.Assert(t, err == nil, err) 239 test.Assert(t, _bool == false) 240 _byte, err := prot.ReadByte() 241 test.Assert(t, err == nil, err) 242 test.Assert(t, _byte == 0x1) 243 _i16, err := prot.ReadI16() 244 test.Assert(t, err == nil, err) 245 test.Assert(t, _i16 == 0x2) 246 _i32, err := prot.ReadI32() 247 test.Assert(t, err == nil, err) 248 test.Assert(t, _i32 == 0x3) 249 _i64, err := prot.ReadI64() 250 test.Assert(t, err == nil, err) 251 test.Assert(t, _i64 == 0x4) 252 _double, err := prot.ReadDouble() 253 test.Assert(t, err == nil, err) 254 test.Assert(t, _double == 5.0) 255 _string, err := prot.ReadString() 256 test.Assert(t, err == nil, err) 257 test.Assert(t, _string == "6") 258 _binary, err := prot.ReadBinary() 259 test.Assert(t, err == nil, err) 260 test.Assert(t, len(_binary) == 1) 261 test.Assert(t, _binary[0] == 0x7) 262 }