@@ -18,6 +18,7 @@ package generic
1818
1919import (
2020 "context"
21+ "reflect"
2122 "testing"
2223
2324 "github.com/cloudwego/kitex/internal/mocks"
@@ -58,6 +59,42 @@ func TestMapThriftCodec(t *testing.T) {
5859 test .Assert (t , err == nil )
5960}
6061
62+ func TestMapThriftCodecSelfRef (t * testing.T ) {
63+ p , err := NewThriftFileProvider ("./map_test/idl/self_ref.thrift" )
64+ test .Assert (t , err == nil )
65+ mtc , err := newMapThriftCodec (p , thriftCodec )
66+ test .Assert (t , err == nil )
67+ defer mtc .Close ()
68+ test .Assert (t , mtc .Name () == "MapThrift" )
69+
70+ method , err := mtc .getMethod (nil , "Test" )
71+ test .Assert (t , err == nil )
72+ test .Assert (t , method .Name == "Test" )
73+
74+ ctx := context .Background ()
75+ sendMsg := initNilMapSendMsg (transport .TTHeader )
76+
77+ // Marshal side
78+ out := remote .NewWriterBuffer (0 )
79+ err = mtc .Marshal (ctx , sendMsg , out )
80+ test .Assert (t , err == nil )
81+
82+ // UnMarshal side
83+ recvMsg := initMapRecvMsg ()
84+ buf , err := out .Bytes ()
85+ test .Assert (t , err == nil )
86+ recvMsg .SetPayloadLen (len (buf ))
87+ in := remote .NewReaderBuffer (buf )
88+ err = mtc .Unmarshal (ctx , recvMsg , in )
89+ test .Assert (t , err == nil )
90+ exp := map [string ]interface {}{
91+ "self" : map [string ]interface {}{},
92+ "extra" : "" ,
93+ }
94+ act := recvMsg .Data ().(* Args ).Request
95+ test .Assert (t , reflect .DeepEqual (exp , act ))
96+ }
97+
6198func TestMapThriftCodecForJSON (t * testing.T ) {
6299 p , err := NewThriftFileProvider ("./map_test/idl/mock.thrift" )
63100 test .Assert (t , err == nil )
@@ -127,7 +164,23 @@ func initMapSendMsg(tp transport.Protocol) remote.Message {
127164 "Test1" : "Test2" ,
128165 },
129166 },
130- Method : "Test" ,
167+ },
168+ Method : "Test" ,
169+ }
170+ svcInfo := mocks .ServiceInfo ()
171+ ink := rpcinfo .NewInvocation ("" , "Test" )
172+ ri := rpcinfo .NewRPCInfo (nil , nil , ink , nil , rpcinfo .NewRPCStats ())
173+ msg := remote .NewMessage (req , svcInfo , ri , remote .Call , remote .Client )
174+ msg .SetProtocolInfo (remote .NewProtocolInfo (tp , svcInfo .PayloadCodec ))
175+ return msg
176+ }
177+
178+ func initNilMapSendMsg (tp transport.Protocol ) remote.Message {
179+ req := & Args {
180+ Request : & descriptor.HTTPRequest {
181+ Body : map [string ]interface {}{
182+ "self" : nil ,
183+ },
131184 },
132185 Method : "Test" ,
133186 }
0 commit comments