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  }