Skip to content

Commit 124f3c6

Browse files
committed
feat: grid buffer tests
1 parent f23b391 commit 124f3c6

7 files changed

Lines changed: 199 additions & 6 deletions

File tree

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ go 1.18
44

55
require (
66
github.com/bytedance/gopkg v0.1.1
7-
github.com/cloudwego/gopkg v0.1.5-0.20250530054916-75b6f5e2aa44
7+
github.com/cloudwego/gopkg v0.1.5-0.20250530071447-b6645e3cf59d
88
github.com/cloudwego/iasm v0.2.0
99
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc
1010
github.com/stretchr/testify v1.9.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
github.com/bytedance/gopkg v0.1.1 h1:3azzgSkiaw79u24a+w9arfH8OfnQQ4MHUt9lJFREEaE=
22
github.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=
3-
github.com/cloudwego/gopkg v0.1.5-0.20250530054916-75b6f5e2aa44 h1:sU+f3ubi0CytsXoWHrcQ6Atnww0yi++QmNKINYqL8PY=
4-
github.com/cloudwego/gopkg v0.1.5-0.20250530054916-75b6f5e2aa44/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=
3+
github.com/cloudwego/gopkg v0.1.5-0.20250530071447-b6645e3cf59d h1:7eCX2Ffy69P7+T7GaAESCru6lpOgkMflLPd7/qqCS6w=
4+
github.com/cloudwego/gopkg v0.1.5-0.20250530071447-b6645e3cf59d/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=
55
github.com/cloudwego/iasm v0.2.0 h1:1KNIy1I1H9hNNFEEH3DVnI4UujN+1zjpuk6gwHLTssg=
66
github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
77
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=

internal/reflect/append_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package reflect
1919
import (
2020
"testing"
2121

22+
"github.com/cloudwego/gopkg/gridbuf"
2223
"github.com/stretchr/testify/require"
2324
)
2425

@@ -51,4 +52,14 @@ func TestAppendStruct(t *testing.T) {
5152
_, err = Decode(b, p1)
5253
require.NoError(t, err)
5354
require.Equal(t, p0, p1)
55+
56+
wb := gridbuf.NewWriteBuffer()
57+
err = GridWrite(wb, p0)
58+
require.NoError(t, err)
59+
p1 = &TestStruct{}
60+
61+
rb := gridbuf.NewReadBuffer(wb.Bytes())
62+
err = GridRead(rb, p1)
63+
require.NoError(t, err)
64+
require.Equal(t, p0, p1)
5465
}

internal/reflect/decoder_test.go

Lines changed: 107 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
"testing"
2424
"time"
2525

26+
"github.com/cloudwego/gopkg/gridbuf"
2627
"github.com/cloudwego/gopkg/protocol/thrift"
2728
"github.com/stretchr/testify/assert"
2829
"github.com/stretchr/testify/require"
@@ -181,7 +182,7 @@ func TestDecode(t *testing.T) {
181182
name := tc.name
182183
updatef := tc.update
183184
testf := tc.test
184-
t.Run(name, func(t *testing.T) {
185+
t.Run(name+"_append_decode", func(t *testing.T) {
185186
p0 := NewTestTypes()
186187
updatef(p0) // update by testcase func
187188

@@ -202,6 +203,29 @@ func TestDecode(t *testing.T) {
202203

203204
testf(t, p1) // test by testcase func
204205
})
206+
t.Run(name+"_grid_write_read", func(t *testing.T) {
207+
p0 := NewTestTypes()
208+
updatef(p0) // update by testcase func
209+
210+
b, err := Append(nil, p0)
211+
require.NoError(t, err)
212+
213+
wb := gridbuf.NewWriteBuffer()
214+
err = GridWrite(wb, p0)
215+
require.NoError(t, err)
216+
bs := wb.Bytes()
217+
218+
rb := gridbuf.NewReadBuffer(bs)
219+
ufs, err := thrift.GridBuffer.Skip(rb, thrift.TType(tSTRUCT), nil, true)
220+
require.NoError(t, err)
221+
require.Equal(t, len(ufs), len(b))
222+
223+
p1 := &TestTypes{}
224+
rb = gridbuf.NewReadBuffer(bs)
225+
err = GridRead(rb, p1)
226+
require.NoError(t, err)
227+
testf(t, p1) // test by testcase func
228+
})
205229
}
206230
}
207231

@@ -283,7 +307,7 @@ func TestDecodeOptional(t *testing.T) {
283307
name := tc.name
284308
updatef := tc.update
285309
testf := tc.test
286-
t.Run(name, func(t *testing.T) {
310+
t.Run(name+"_append_decode", func(t *testing.T) {
287311
p0 := NewTestTypesOptional()
288312
updatef(p0) // update by testcase func
289313

@@ -304,6 +328,29 @@ func TestDecodeOptional(t *testing.T) {
304328

305329
testf(t, p1) // test by testcase func
306330
})
331+
t.Run(name+"_grid_write_read", func(t *testing.T) {
332+
p0 := NewTestTypesOptional()
333+
updatef(p0) // update by testcase func
334+
335+
b, err := Append(nil, p0)
336+
require.NoError(t, err)
337+
338+
wb := gridbuf.NewWriteBuffer()
339+
err = GridWrite(wb, p0)
340+
require.NoError(t, err)
341+
bs := wb.Bytes()
342+
343+
rb := gridbuf.NewReadBuffer(bs)
344+
ufs, err := thrift.GridBuffer.Skip(rb, thrift.TType(tSTRUCT), nil, true)
345+
require.NoError(t, err)
346+
require.Equal(t, len(ufs), len(b))
347+
348+
p1 := &TestTypesOptional{}
349+
rb = gridbuf.NewReadBuffer(bs)
350+
err = GridRead(rb, p1)
351+
require.NoError(t, err)
352+
testf(t, p1) // test by testcase func
353+
})
307354
}
308355
}
309356

@@ -332,6 +379,34 @@ func TestDecodeRequired(t *testing.T) {
332379
require.Equal(t, true, p1.V)
333380
}
334381

382+
func TestGridReadWriteRequired(t *testing.T) {
383+
type S0 struct {
384+
V *bool `frugal:"1,optional,bool"`
385+
}
386+
type S1 struct {
387+
V bool `frugal:"1,required,bool"`
388+
}
389+
v := true
390+
p0 := &S0{}
391+
wb := gridbuf.NewWriteBuffer()
392+
err := GridWrite(wb, p0)
393+
require.NoError(t, err)
394+
p1 := &S1{}
395+
rb := gridbuf.NewReadBuffer(wb.Bytes())
396+
err = GridRead(rb, p1)
397+
require.Equal(t, newRequiredFieldNotSetException("V"), err)
398+
399+
p0.V = &v
400+
wb = gridbuf.NewWriteBuffer()
401+
err = GridWrite(wb, p0)
402+
require.NoError(t, err)
403+
404+
rb = gridbuf.NewReadBuffer(wb.Bytes())
405+
err = GridRead(rb, p1)
406+
require.NoError(t, err)
407+
require.Equal(t, true, p1.V)
408+
}
409+
335410
func TestDecodeUnknownFields(t *testing.T) {
336411
type Msg0 struct {
337412
I0 int32 `thrift:"i0,2" frugal:"2,default,i32"`
@@ -360,6 +435,36 @@ func TestDecodeUnknownFields(t *testing.T) {
360435
assert.Equal(t, testb, p._unknownFields)
361436
}
362437

438+
func TestGridReadWriteUnknownFields(t *testing.T) {
439+
type Msg0 struct {
440+
I0 int32 `thrift:"i0,2" frugal:"2,default,i32"`
441+
S0 string `thrift:"s0,3" frugal:"3,default,string"`
442+
}
443+
444+
type Msg1 struct { // without S0
445+
I0 int32 `thrift:"i0,2" frugal:"2,default,i32"`
446+
447+
_unknownFields []byte
448+
}
449+
450+
msg := Msg0{I0: 1, S0: "s0"}
451+
wb := gridbuf.NewWriteBuffer()
452+
_ = GridWrite(wb, msg)
453+
bs := wb.Bytes()
454+
455+
p := &Msg1{}
456+
rb := gridbuf.NewReadBuffer(bs)
457+
_ = GridRead(rb, p)
458+
459+
assert.Equal(t, msg.I0, p.I0)
460+
461+
sz := fieldHeaderLen + strHeaderLen + len(msg.S0)
462+
testb := make([]byte, sz)
463+
testb = appendStringField(testb[:0], 3, msg.S0)
464+
assert.Equal(t, sz, len(testb))
465+
assert.Equal(t, testb, p._unknownFields)
466+
}
467+
363468
func TestDecodeNoCopy(t *testing.T) {
364469
type Msg struct {
365470
A string `frugal:"1,default,string,nocopy"`

internal/reflect/encoder_test.go

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package reflect
1919
import (
2020
"testing"
2121

22+
"github.com/cloudwego/gopkg/gridbuf"
2223
"github.com/stretchr/testify/assert"
2324
"github.com/stretchr/testify/require"
2425
)
@@ -108,7 +109,7 @@ func TestEncode(t *testing.T) {
108109
}
109110

110111
for _, tc := range testcases {
111-
t.Run(tc.name, func(t *testing.T) {
112+
t.Run(tc.name+"_append", func(t *testing.T) {
112113
p := NewTestTypesOptional()
113114
tc.update(p)
114115
assert.Equal(t, tc.expect, EncodedSize(p))
@@ -117,6 +118,20 @@ func TestEncode(t *testing.T) {
117118
assert.Equal(t, tc.expect, len(x))
118119
}
119120
})
121+
t.Run(tc.name+"_grid_write", func(t *testing.T) {
122+
p := NewTestTypesOptional()
123+
tc.update(p)
124+
wb := gridbuf.NewWriteBuffer()
125+
err := GridWrite(wb, p)
126+
assert.NoError(t, err)
127+
128+
bs := wb.Bytes()
129+
var l int
130+
for _, b := range bs {
131+
l += len(b)
132+
}
133+
assert.Equal(t, tc.expect, l)
134+
})
120135
}
121136
}
122137

@@ -126,6 +141,16 @@ func TestEncodeStructOther(t *testing.T) {
126141
b, err := Append(nil, Msg{})
127142
assert.NoError(t, err)
128143
assert.Equal(t, encodedMsgSize, len(b))
144+
145+
wb := gridbuf.NewWriteBuffer()
146+
err = GridWrite(wb, Msg{})
147+
assert.NoError(t, err)
148+
bs := wb.Bytes()
149+
var l int
150+
for _, b := range bs {
151+
l += len(b)
152+
}
153+
assert.Equal(t, encodedMsgSize, l)
129154
}
130155

131156
func TestEncodeUnknownFields(t *testing.T) {
@@ -144,6 +169,17 @@ func TestEncodeUnknownFields(t *testing.T) {
144169
require.NoError(t, err)
145170
assert.Equal(t, n, len(b))
146171
assert.Contains(t, string(b), string(append([]byte("helloworld")[:], byte(tSTOP))))
172+
173+
wb := gridbuf.NewWriteBuffer()
174+
err = GridWrite(wb, m)
175+
assert.NoError(t, err)
176+
bs := wb.Bytes()
177+
var cbs []byte
178+
for _, b := range bs {
179+
cbs = append(cbs, b...)
180+
}
181+
assert.Equal(t, n, len(cbs))
182+
assert.Contains(t, string(cbs), string(append([]byte("helloworld")[:], byte(tSTOP))))
147183
}
148184

149185
func TestNestedListMapStruct(t *testing.T) {
@@ -169,4 +205,15 @@ func TestNestedListMapStruct(t *testing.T) {
169205
require.NoError(t, err)
170206
require.Equal(t, i, len(b))
171207
require.Equal(t, p, p2)
208+
209+
wb := gridbuf.NewWriteBuffer()
210+
err = GridWrite(wb, p)
211+
require.NoError(t, err)
212+
bs := wb.Bytes()
213+
214+
p2 = &Msg2{}
215+
rb := gridbuf.NewReadBuffer(bs)
216+
err = GridRead(rb, p2)
217+
require.NoError(t, err)
218+
require.Equal(t, p, p2)
172219
}

internal/reflect/gridread.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ func (d *tDecoder) GridRead(b *gridbuf.ReadBuffer, base unsafe.Pointer, sd *stru
5252

5353
f := sd.GetField(fid)
5454
if f == nil || f.Type.WT != tp {
55+
if sd.hasUnknownFields {
56+
ufs = append(ufs, byte(tp), byte(fid>>8), byte(fid))
57+
}
5558
ufs, err = thrift.GridBuffer.Skip(b, thrift.TType(tp), ufs, sd.hasUnknownFields)
5659
if err != nil {
5760
return fmt.Errorf("skip unknown field %d of struct %s err: %w", fid, sd.rt.String(), err)

internal/reflect/reflect_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ func BenchmarkDecode(b *testing.B) {
120120
require.NoError(b, err)
121121

122122
p0 := NewTestTypesForBenchmark()
123+
b.ResetTimer()
123124
for i := 0; i < b.N; i++ {
124125
p0.InitDefault()
125126
_, _ = Decode(buf, p0)
@@ -128,3 +129,29 @@ func BenchmarkDecode(b *testing.B) {
128129
}
129130
}
130131
}
132+
133+
func BenchmarkGridRead(b *testing.B) {
134+
p := initTestTypesForBenchmark()
135+
n := EncodedSize(p)
136+
if n <= 0 {
137+
b.Fatal(n)
138+
}
139+
var err error
140+
buf := make([]byte, n)
141+
b.SetBytes(int64(n))
142+
buf, err = Append(buf[:0], p)
143+
require.NoError(b, err)
144+
145+
p0 := NewTestTypesForBenchmark()
146+
bs := [][]byte{buf}
147+
b.ResetTimer()
148+
for i := 0; i < b.N; i++ {
149+
p0.InitDefault()
150+
rb := gridbuf.NewReadBuffer(bs)
151+
_ = GridRead(rb, p0)
152+
if checkBenchmarkDecodeResult {
153+
require.Equal(b, p0, p)
154+
}
155+
rb.Free()
156+
}
157+
}

0 commit comments

Comments
 (0)