Skip to content

Commit

Permalink
fix: jsonthrift codec test
Browse files Browse the repository at this point in the history
  • Loading branch information
Marina-Sakai committed May 30, 2024
1 parent 88b7b14 commit 2cd2091
Showing 1 changed file with 71 additions and 197 deletions.
268 changes: 71 additions & 197 deletions pkg/generic/jsonthrift_codec_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,25 +17,20 @@
package generic

import (
"context"
"strings"
"testing"

"github.com/cloudwego/dynamicgo/conv"

"github.com/cloudwego/kitex/internal/mocks"
"github.com/cloudwego/kitex/internal/test"
"github.com/cloudwego/kitex/pkg/remote"
"github.com/cloudwego/kitex/pkg/rpcinfo"
"github.com/cloudwego/kitex/transport"
"github.com/cloudwego/kitex/pkg/generic/thrift"
)

func TestJsonThriftCodec(t *testing.T) {
// without dynamicgo
p, err := NewThriftFileProvider("./json_test/idl/mock.thrift")
test.Assert(t, err == nil)
gOpts := &Options{dynamicgoConvOpts: DefaultJSONDynamicGoConvOpts}
jtc, err := newJsonThriftCodec(p, thriftCodec, gOpts)
test.Assert(t, err == nil)
jtc := newJsonThriftCodec(p, nil)
test.Assert(t, !jtc.dynamicgoEnabled)
test.DeepEqual(t, jtc.convOpts, conv.Options{})
test.DeepEqual(t, jtc.convOptsWithThriftBase, conv.Options{})
Expand All @@ -46,96 +41,29 @@ func TestJsonThriftCodec(t *testing.T) {
method, err := jtc.getMethod(nil, "Test")
test.Assert(t, err == nil)
test.Assert(t, method.Name == "Test")
test.Assert(t, jtc.GetIDLServiceName() == "Mock")

ctx := context.Background()
sendMsg := initJsonSendMsg(transport.TTHeader)

// Marshal side
out := remote.NewWriterBuffer(256)
err = jtc.Marshal(ctx, sendMsg, out)
test.Assert(t, err == nil, err)

// Unmarshal side
recvMsg := initJsonRecvMsg()
buf, err := out.Bytes()
test.Assert(t, err == nil)
recvMsg.SetPayloadLen(len(buf))
in := remote.NewReaderBuffer(buf)
err = jtc.Unmarshal(ctx, recvMsg, in)
test.Assert(t, err == nil, err)
}

func TestJsonThriftCodec_SelfRef_Old(t *testing.T) {
t.Run("old way", func(t *testing.T) {
p, err := NewThriftFileProvider("./json_test/idl/mock.thrift")
test.Assert(t, err == nil)
gOpts := &Options{dynamicgoConvOpts: DefaultJSONDynamicGoConvOpts}
jtc, err := newJsonThriftCodec(p, thriftCodec, gOpts)
test.Assert(t, err == nil)
defer jtc.Close()
test.Assert(t, jtc.Name() == "JSONThrift")

method, err := jtc.getMethod(nil, "Test")
test.Assert(t, err == nil)
test.Assert(t, method.Name == "Test")

ctx := context.Background()
sendMsg := initJsonSendMsg(transport.TTHeader)

// Marshal side
out := remote.NewWriterBuffer(256)
err = jtc.Marshal(ctx, sendMsg, out)
test.Assert(t, err == nil, err)

// Unmarshal side
recvMsg := initJsonRecvMsg()
buf, err := out.Bytes()
test.Assert(t, err == nil)
recvMsg.SetPayloadLen(len(buf))
in := remote.NewReaderBuffer(buf)
err = jtc.Unmarshal(ctx, recvMsg, in)
test.Assert(t, err == nil, err)
})

t.Run("old way", func(t *testing.T) {
p, err := NewThriftFileProviderWithDynamicGo("./json_test/idl/mock.thrift")
test.Assert(t, err == nil)
gOpts := &Options{dynamicgoConvOpts: DefaultJSONDynamicGoConvOpts}
jtc, err := newJsonThriftCodec(p, thriftCodec, gOpts)
test.Assert(t, err == nil)
defer jtc.Close()
test.Assert(t, jtc.Name() == "JSONThrift")

method, err := jtc.getMethod(nil, "Test")
test.Assert(t, err == nil)
test.Assert(t, method.Name == "Test")

ctx := context.Background()
sendMsg := initJsonSendMsg(transport.TTHeader)
rw := jtc.GetMessageReaderWriter()
err, ok := rw.(error)
test.Assert(t, ok)
test.Assert(t, strings.Contains(err.Error(), "missing method"))

// Marshal side
out := remote.NewWriterBuffer(256)
err = jtc.Marshal(ctx, sendMsg, out)
test.Assert(t, err == nil, err)
jtc.SetMethod(method.Name)
test.Assert(t, jtc.method == "Test")

// Unmarshal side
recvMsg := initJsonRecvMsg()
buf, err := out.Bytes()
test.Assert(t, err == nil)
recvMsg.SetPayloadLen(len(buf))
in := remote.NewReaderBuffer(buf)
err = jtc.Unmarshal(ctx, recvMsg, in)
test.Assert(t, err == nil, err)
})
rw = jtc.GetMessageReaderWriter()
_, ok = rw.(thrift.MessageWriter)
test.Assert(t, ok)
_, ok = rw.(thrift.MessageReader)
test.Assert(t, ok)
}

func TestJsonThriftCodecWithDynamicGo(t *testing.T) {
// with dynamicgo
p, err := NewThriftFileProviderWithDynamicGo("./json_test/idl/mock.thrift")
test.Assert(t, err == nil)
gOpts := &Options{dynamicgoConvOpts: DefaultJSONDynamicGoConvOpts}
jtc, err := newJsonThriftCodec(p, thriftCodec, gOpts)
test.Assert(t, err == nil)
jtc := newJsonThriftCodec(p, gOpts)
test.Assert(t, jtc.dynamicgoEnabled)
test.DeepEqual(t, jtc.convOpts, DefaultJSONDynamicGoConvOpts)
convOptsWithThriftBase := DefaultJSONDynamicGoConvOpts
Expand All @@ -151,127 +79,73 @@ func TestJsonThriftCodecWithDynamicGo(t *testing.T) {
test.Assert(t, err == nil)
test.Assert(t, method.Name == "Test")

ctx := context.Background()
sendMsg := initJsonSendMsg(transport.TTHeader)
rw := jtc.GetMessageReaderWriter()
err, ok := rw.(error)
test.Assert(t, ok)
test.Assert(t, strings.Contains(err.Error(), "missing method"))

// Marshal side
out := remote.NewWriterBuffer(256)
err = jtc.Marshal(ctx, sendMsg, out)
test.Assert(t, err == nil, err)

// Unmarshal side
recvMsg := initJsonRecvMsg()
buf, err := out.Bytes()
test.Assert(t, err == nil)
recvMsg.SetPayloadLen(len(buf))
in := remote.NewReaderBuffer(buf)
err = jtc.Unmarshal(ctx, recvMsg, in)
test.Assert(t, err == nil, err)

// disable unmarshal With dynamicgo because the payload length is 0
sendMsg = initJsonSendMsg(transport.PurePayload)

// Marshal side
out = remote.NewWriterBuffer(256)
err = jtc.Marshal(ctx, sendMsg, out)
test.Assert(t, err == nil)
jtc.SetMethod(method.Name)
test.Assert(t, jtc.method == "Test")

// Unmarshal side
recvMsg = initJsonRecvMsg()
buf, err = out.Bytes()
test.Assert(t, err == nil)
in = remote.NewReaderBuffer(buf)
err = jtc.Unmarshal(ctx, recvMsg, in)
test.Assert(t, err == nil)
rw = jtc.GetMessageReaderWriter()
_, ok = rw.(thrift.MessageWriter)
test.Assert(t, ok)
_, ok = rw.(thrift.MessageReader)
test.Assert(t, ok)
}

func TestJsonThriftCodec_SelfRef(t *testing.T) {
p, err := NewThriftFileProvider("./json_test/idl/mock.thrift")
test.Assert(t, err == nil)
jtc, err := newJsonThriftCodec(p, thriftCodec, nil)
test.Assert(t, err == nil)
defer jtc.Close()
test.Assert(t, jtc.Name() == "JSONThrift")

method, err := jtc.getMethod(nil, "Test")
test.Assert(t, err == nil)
test.Assert(t, method.Name == "Test")
t.Run("without_dynamicgo", func(t *testing.T) {
p, err := NewThriftFileProvider("./json_test/idl/self_ref.thrift")
test.Assert(t, err == nil)
jtc := newJsonThriftCodec(p, nil)
defer jtc.Close()
test.Assert(t, jtc.Name() == "JSONThrift")

ctx := context.Background()
sendMsg := initJsonSendMsg(transport.TTHeader)
method, err := jtc.getMethod(nil, "Test")
test.Assert(t, err == nil)
test.Assert(t, method.Name == "Test")

// Marshal side
out := remote.NewWriterBuffer(256)
err = jtc.Marshal(ctx, sendMsg, out)
test.Assert(t, err == nil, err)
rw := jtc.GetMessageReaderWriter()
err, ok := rw.(error)
test.Assert(t, ok)
test.Assert(t, strings.Contains(err.Error(), "missing method"))

// Unmarshal side
recvMsg := initJsonRecvMsg()
buf, err := out.Bytes()
test.Assert(t, err == nil)
recvMsg.SetPayloadLen(len(buf))
in := remote.NewReaderBuffer(buf)
err = jtc.Unmarshal(ctx, recvMsg, in)
test.Assert(t, err == nil, err)
}
jtc.SetMethod(method.Name)
test.Assert(t, jtc.method == "Test")

func TestJsonExceptionError(t *testing.T) {
// without dynamicgo
p, err := NewThriftFileProvider("./json_test/idl/mock.thrift")
test.Assert(t, err == nil)
gOpts := &Options{dynamicgoConvOpts: DefaultJSONDynamicGoConvOpts}
jtc, err := newJsonThriftCodec(p, thriftCodec, gOpts)
test.Assert(t, err == nil)
rw = jtc.GetMessageReaderWriter()
_, ok = rw.(thrift.MessageWriter)
test.Assert(t, ok)
_, ok = rw.(thrift.MessageReader)
test.Assert(t, ok)
})

ctx := context.Background()
out := remote.NewWriterBuffer(256)
// empty method test
emptyMethodInk := rpcinfo.NewInvocation("", "")
emptyMethodRi := rpcinfo.NewRPCInfo(nil, nil, emptyMethodInk, nil, nil)
emptyMethodMsg := remote.NewMessage(nil, nil, emptyMethodRi, remote.Exception, remote.Client)
err = jtc.Marshal(ctx, emptyMethodMsg, out)
test.Assert(t, err.Error() == "empty methodName in thrift Marshal")
t.Run("with_dynamicgo", func(t *testing.T) {
p, err := NewThriftFileProviderWithDynamicGo("./json_test/idl/self_ref.thrift")
test.Assert(t, err == nil)
gOpts := &Options{dynamicgoConvOpts: DefaultJSONDynamicGoConvOpts}
jtc := newJsonThriftCodec(p, gOpts)
defer jtc.Close()
test.Assert(t, jtc.Name() == "JSONThrift")

// Exception MsgType test
exceptionMsgTypeInk := rpcinfo.NewInvocation("", "Test")
exceptionMsgTypeRi := rpcinfo.NewRPCInfo(nil, nil, exceptionMsgTypeInk, nil, nil)
exceptionMsgTypeMsg := remote.NewMessage(&remote.TransError{}, nil, exceptionMsgTypeRi, remote.Exception, remote.Client)
err = jtc.Marshal(ctx, exceptionMsgTypeMsg, out)
test.Assert(t, err == nil)
method, err := jtc.getMethod(nil, "Test")
test.Assert(t, err == nil)
test.Assert(t, method.Name == "Test")
test.Assert(t, jtc.GetIDLServiceName() == "Mock")

// with dynamicgo
p, err = NewThriftFileProviderWithDynamicGo("./json_test/idl/mock.thrift")
test.Assert(t, err == nil)
jtc, err = newJsonThriftCodec(p, thriftCodec, gOpts)
test.Assert(t, err == nil)
// empty method test
err = jtc.Marshal(ctx, emptyMethodMsg, out)
test.Assert(t, err.Error() == "empty methodName in thrift Marshal")
// Exception MsgType test
err = jtc.Marshal(ctx, exceptionMsgTypeMsg, out)
test.Assert(t, err == nil)
}
rw := jtc.GetMessageReaderWriter()
err, ok := rw.(error)
test.Assert(t, ok)
test.Assert(t, strings.Contains(err.Error(), "missing method"))

func initJsonSendMsg(tp transport.Protocol) remote.Message {
req := &Args{
Request: `{"extra": "Hello"}`,
Method: "Test",
}
svcInfo := mocks.ServiceInfo()
ink := rpcinfo.NewInvocation("", "Test")
ri := rpcinfo.NewRPCInfo(nil, nil, ink, nil, rpcinfo.NewRPCStats())
msg := remote.NewMessage(req, svcInfo, ri, remote.Call, remote.Client)
msg.SetProtocolInfo(remote.NewProtocolInfo(tp, svcInfo.PayloadCodec))
return msg
}
jtc.SetMethod(method.Name)
test.Assert(t, jtc.method == "Test")

func initJsonRecvMsg() remote.Message {
req := &Args{
Request: "Test",
Method: "Test",
}
ink := rpcinfo.NewInvocation("", "Test")
ri := rpcinfo.NewRPCInfo(nil, nil, ink, nil, rpcinfo.NewRPCStats())
msg := remote.NewMessage(req, mocks.ServiceInfo(), ri, remote.Call, remote.Server)
return msg
rw = jtc.GetMessageReaderWriter()
_, ok = rw.(thrift.MessageWriter)
test.Assert(t, ok)
_, ok = rw.(thrift.MessageReader)
test.Assert(t, ok)
})
}

0 comments on commit 2cd2091

Please sign in to comment.