Skip to content

Commit 75b914b

Browse files
authored
Merge pull request #1037 from cloudwego/hotfix/generic_dead_loop
hotfix(generic): generic bugs
2 parents bed7557 + 3d97971 commit 75b914b

File tree

8 files changed

+226
-104
lines changed

8 files changed

+226
-104
lines changed

pkg/generic/json_test/idl/self_ref.thrift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,8 @@ namespace go kitex.test.server
33
struct A {
44
1: A self
55
2: string extra
6+
}
7+
8+
service Mock {
9+
string Test(1:A req)
610
}

pkg/generic/jsonthrift_codec_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,36 @@ func TestJsonThriftCodec(t *testing.T) {
5757
test.Assert(t, err == nil)
5858
}
5959

60+
func TestJsonThriftCodec_SelfRef(t *testing.T) {
61+
p, err := NewThriftFileProvider("./json_test/idl/mock.thrift")
62+
test.Assert(t, err == nil)
63+
jtc, err := newJsonThriftCodec(p, thriftCodec)
64+
test.Assert(t, err == nil)
65+
defer jtc.Close()
66+
test.Assert(t, jtc.Name() == "JSONThrift")
67+
68+
method, err := jtc.getMethod(nil, "Test")
69+
test.Assert(t, err == nil)
70+
test.Assert(t, method.Name == "Test")
71+
72+
ctx := context.Background()
73+
sendMsg := initJsonSendMsg(transport.TTHeader)
74+
75+
// Marshal side
76+
out := remote.NewWriterBuffer(256)
77+
err = jtc.Marshal(ctx, sendMsg, out)
78+
test.Assert(t, err == nil, err)
79+
80+
// Unmarshal side
81+
recvMsg := initJsonRecvMsg()
82+
buf, err := out.Bytes()
83+
test.Assert(t, err == nil)
84+
recvMsg.SetPayloadLen(len(buf))
85+
in := remote.NewReaderBuffer(buf)
86+
err = jtc.Unmarshal(ctx, recvMsg, in)
87+
test.Assert(t, err == nil, err)
88+
}
89+
6090
func TestJsonExceptionError(t *testing.T) {
6191
p, err := NewThriftFileProvider("./json_test/idl/mock.thrift")
6292
test.Assert(t, err == nil)

pkg/generic/map_test/idl/self_ref.thrift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,8 @@ namespace go kitex.test.server
33
struct A {
44
1: A self
55
2: string extra
6+
}
7+
8+
service Mock {
9+
string Test(1:A req)
610
}

pkg/generic/mapthrift_codec_test.go

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package generic
1818

1919
import (
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+
6198
func 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
}

pkg/generic/thrift/read_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,14 @@ func Test_readMap(t *testing.T) {
431431
return "world", nil
432432
},
433433
}
434+
mockTTransportWithInt16Key := &mocks.MockThriftTTransport{
435+
ReadMapBeginFunc: func() (keyType, valueType thrift.TType, size int, err error) {
436+
return thrift.I16, thrift.BOOL, 1, nil
437+
},
438+
ReadI16Func: func() (int16, error) {
439+
return 16, nil
440+
},
441+
}
434442
tests := []struct {
435443
name string
436444
args args
@@ -450,6 +458,12 @@ func Test_readMap(t *testing.T) {
450458
map[string]interface{}{"hello": "world"},
451459
false,
452460
},
461+
{
462+
"readJsonMapWithInt16Key",
463+
args{in: mockTTransportWithInt16Key, t: &descriptor.TypeDescriptor{Type: descriptor.MAP, Key: &descriptor.TypeDescriptor{Type: descriptor.I16}, Elem: &descriptor.TypeDescriptor{Type: descriptor.BOOL}}, opt: &readerOption{forJSON: true}},
464+
map[string]interface{}{"16": false},
465+
false,
466+
},
453467
}
454468
for _, tt := range tests {
455469
t.Run(tt.name, func(t *testing.T) {

pkg/generic/thrift/util.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,8 @@ func buildinTypeIntoString(val interface{}) string {
129129
return strconv.FormatBool(v)
130130
case int8:
131131
return strconv.FormatInt(int64(v), 10)
132+
case int16:
133+
return strconv.FormatInt(int64(v), 10)
132134
case int32:
133135
return strconv.FormatInt(int64(v), 10)
134136
case int64:

0 commit comments

Comments
 (0)