Skip to content

Commit 620eb5a

Browse files
Update tests to support bRV + streaming
1 parent ef6b024 commit 620eb5a

File tree

2 files changed

+60
-59
lines changed

2 files changed

+60
-59
lines changed

bson/value_reader.go

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,9 @@ func NewDocumentReader(r io.Reader) ValueReader {
122122
// ValueReader for a single BSON value.
123123
func newBufferedValueReader(t Type, b []byte) ValueReader {
124124
bVR := newBufferedDocumentReader(b)
125+
125126
bVR.stack[0].vType = t
127+
bVR.stack[0].mode = mValue
126128

127129
return bVR
128130
}
@@ -243,7 +245,7 @@ func (vr *valueReader) Type() Type {
243245

244246
// peekLength returns the length of the next value in the stream without
245247
// offsetting the reader position.
246-
func peekNextValueSize(vr *valueReader, dst []byte) (int32, error) {
248+
func peekNextValueSize(vr *valueReader) (int32, error) {
247249
var length int32
248250
var err error
249251
switch vr.stack[vr.frame].vType {
@@ -313,32 +315,31 @@ func (vr *valueReader) readBytes(n int32) ([]byte, error) {
313315
return readBytes(vr.src, int(n))
314316
}
315317

316-
// readValueBytes returns the raw bytes of the next value (or top‐level
317-
// document) without allocating intermediary buffers, then pops the frame.
318318
func (vr *valueReader) readValueBytes(dst []byte) (Type, []byte, error) {
319319
switch vr.stack[vr.frame].mode {
320320
case mTopLevel:
321321
length, err := vr.peekLength()
322322
if err != nil {
323-
return Type(0), nil, err
323+
return 0, nil, err
324324
}
325325
b, err := vr.readBytes(length)
326326
return Type(0), append(dst, b...), err
327327
case mElement, mValue:
328-
length, err := peekNextValueSize(vr, dst)
328+
t := vr.stack[vr.frame].vType
329+
330+
length, err := peekNextValueSize(vr)
329331
if err != nil {
330-
return Type(0), dst, err
332+
return t, dst, err
331333
}
332334

333335
b, err := vr.readBytes(length)
334336

335-
t := vr.stack[vr.frame].vType
336-
err = vr.pop()
337-
if err != nil {
337+
if err := vr.pop(); err != nil {
338338
return Type(0), nil, err
339339
}
340340

341341
return t, append(dst, b...), err
342+
342343
default:
343344
return Type(0), nil, vr.invalidTransitionErr(0, "readValueBytes", []mode{mElement, mValue})
344345
}
@@ -351,7 +352,7 @@ func (vr *valueReader) Skip() error {
351352
return vr.invalidTransitionErr(0, "Skip", []mode{mElement, mValue})
352353
}
353354

354-
length, err := peekNextValueSize(vr, nil)
355+
length, err := peekNextValueSize(vr)
355356
if err != nil {
356357
return err
357358
}
@@ -418,11 +419,15 @@ func (vr *valueReader) ReadBinary() ([]byte, byte, error) {
418419
return nil, 0, err
419420
}
420421

422+
// copy so user doesn’t share underlying buffer
423+
cp := make([]byte, len(b))
424+
copy(cp, b)
425+
421426
if err := vr.pop(); err != nil {
422427
return nil, 0, err
423428
}
424429

425-
return b, btype, nil
430+
return cp, btype, nil
426431
}
427432

428433
// ReadBoolean reads a BSON boolean value, returning true or false, advancing

bson/value_reader_test.go

Lines changed: 44 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
package bson
88

99
import (
10-
"bufio"
1110
"bytes"
1211
_ "embed"
1312
"errors"
@@ -81,7 +80,7 @@ func TestValueReader(t *testing.T) {
8180
for _, tc := range testCases {
8281
t.Run(tc.name, func(t *testing.T) {
8382
vr := &valueReader{
84-
r: bufio.NewReader(bytes.NewReader(tc.data)),
83+
src: &bufferedValueReader{buf: tc.data},
8584
stack: []vrState{
8685
{mode: mTopLevel},
8786
{
@@ -146,7 +145,7 @@ func TestValueReader(t *testing.T) {
146145
for _, tc := range testCases {
147146
t.Run(tc.name, func(t *testing.T) {
148147
vr := &valueReader{
149-
r: bufio.NewReader(bytes.NewReader(tc.data)),
148+
src: &bufferedValueReader{buf: tc.data},
150149
stack: []vrState{
151150
{mode: mTopLevel},
152151
{
@@ -176,16 +175,16 @@ func TestValueReader(t *testing.T) {
176175
}
177176

178177
// invalid length
179-
vr.r = bufio.NewReader(bytes.NewReader([]byte{0x00, 0x00}))
178+
vr.src = &bufferedValueReader{buf: []byte{0x00, 0x00}}
180179
_, err := vr.ReadDocument()
181-
if !errors.Is(err, io.ErrUnexpectedEOF) {
180+
if !errors.Is(err, io.EOF) {
182181
t.Errorf("Expected io.ErrUnexpectedEOF with document length too small. got %v; want %v", err, io.EOF)
183182
}
184-
if vr.offset != 0 {
185-
t.Errorf("Expected 0 offset. got %d", vr.offset)
183+
if vr.src.pos() != 0 {
184+
t.Errorf("Expected 0 offset. got %d", vr.src.pos())
186185
}
187186

188-
vr.r = bufio.NewReader(bytes.NewReader(doc))
187+
vr.src = &bufferedValueReader{buf: doc}
189188
_, err = vr.ReadDocument()
190189
noerr(t, err)
191190
if vr.stack[vr.frame].end != 5 {
@@ -215,8 +214,10 @@ func TestValueReader(t *testing.T) {
215214
}
216215

217216
vr.stack[1].mode, vr.stack[1].vType = mElement, TypeEmbeddedDocument
218-
vr.offset = 4
219-
vr.r = bufio.NewReader(bytes.NewReader([]byte{0x05, 0x00, 0x00, 0x00, 0x00, 0x00}))
217+
vr.src = &bufferedValueReader{
218+
buf: []byte{0x0A, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00},
219+
offset: 4,
220+
}
220221
_, err = vr.ReadDocument()
221222
noerr(t, err)
222223
if len(vr.stack) != 3 {
@@ -228,13 +229,13 @@ func TestValueReader(t *testing.T) {
228229
if vr.stack[2].end != 9 {
229230
t.Errorf("End of embedded document is not correct. got %d; want %d", vr.stack[2].end, 9)
230231
}
231-
if vr.offset != 8 {
232-
t.Errorf("Offset not incremented correctly. got %d; want %d", vr.offset, 8)
232+
if vr.src.pos() != 8 {
233+
t.Errorf("Offset not incremented correctly. got %d; want %d", vr.src.pos(), 8)
233234
}
234235

235236
vr.frame--
236237
_, err = vr.ReadDocument()
237-
if !errors.Is(err, io.ErrUnexpectedEOF) {
238+
if !errors.Is(err, io.EOF) {
238239
t.Errorf("Should return error when attempting to read length with not enough bytes. got %v; want %v", err, io.EOF)
239240
}
240241
})
@@ -312,7 +313,7 @@ func TestValueReader(t *testing.T) {
312313
for _, tc := range testCases {
313314
t.Run(tc.name, func(t *testing.T) {
314315
vr := &valueReader{
315-
r: bufio.NewReader(bytes.NewReader(tc.data)),
316+
src: &bufferedValueReader{buf: tc.data},
316317
stack: []vrState{
317318
{mode: mTopLevel},
318319
{
@@ -331,9 +332,11 @@ func TestValueReader(t *testing.T) {
331332
}
332333

333334
t.Run("success", func(t *testing.T) {
335+
doc := []byte{0x00, 0x00, 0x00, 0x00}
336+
doc = append(doc, codeWithScope...)
337+
doc = append(doc, 0x00)
334338
vr := &valueReader{
335-
offset: 4,
336-
r: bufio.NewReader(bytes.NewReader(codeWithScope)),
339+
src: &bufferedValueReader{buf: doc, offset: 4},
337340
stack: []vrState{
338341
{mode: mTopLevel},
339342
{mode: mElement, vType: TypeCodeWithScope},
@@ -355,8 +358,8 @@ func TestValueReader(t *testing.T) {
355358
if vr.stack[2].end != 21 {
356359
t.Errorf("End of scope is not correct. got %d; want %d", vr.stack[2].end, 21)
357360
}
358-
if vr.offset != 20 {
359-
t.Errorf("Offset not incremented correctly. got %d; want %d", vr.offset, 20)
361+
if vr.src.pos() != 20 {
362+
t.Errorf("Offset not incremented correctly. got %d; want %d", vr.src.pos(), 20)
360363
}
361364
})
362365
})
@@ -417,7 +420,7 @@ func TestValueReader(t *testing.T) {
417420
for _, tc := range testCases {
418421
t.Run(tc.name, func(t *testing.T) {
419422
vr := &valueReader{
420-
r: bufio.NewReader(bytes.NewReader(tc.data)),
423+
src: &bufferedValueReader{buf: tc.data},
421424
stack: []vrState{
422425
{mode: mTopLevel},
423426
{
@@ -475,7 +478,7 @@ func TestValueReader(t *testing.T) {
475478
for _, tc := range testCases {
476479
t.Run(tc.name, func(t *testing.T) {
477480
vr := &valueReader{
478-
r: bufio.NewReader(bytes.NewReader(tc.data)),
481+
src: &bufferedValueReader{buf: tc.data},
479482
stack: []vrState{
480483
{mode: mTopLevel},
481484
{
@@ -533,7 +536,7 @@ func TestValueReader(t *testing.T) {
533536
for _, tc := range testCases {
534537
t.Run(tc.name, func(t *testing.T) {
535538
vr := &valueReader{
536-
r: bufio.NewReader(bytes.NewReader(tc.data)),
539+
src: &bufferedValueReader{buf: tc.data},
537540
stack: []vrState{
538541
{mode: mTopLevel},
539542
{
@@ -593,7 +596,7 @@ func TestValueReader(t *testing.T) {
593596
for _, tc := range testCases {
594597
t.Run(tc.name, func(t *testing.T) {
595598
vr := &valueReader{
596-
r: bufio.NewReader(bytes.NewReader(tc.data)),
599+
src: &bufferedValueReader{buf: tc.data},
597600
stack: []vrState{
598601
{mode: mTopLevel},
599602
{
@@ -648,7 +651,7 @@ func TestValueReader(t *testing.T) {
648651
for _, tc := range testCases {
649652
t.Run(tc.name, func(t *testing.T) {
650653
vr := &valueReader{
651-
r: bufio.NewReader(bytes.NewReader(tc.data)),
654+
src: &bufferedValueReader{buf: tc.data},
652655
stack: []vrState{
653656
{mode: mTopLevel},
654657
{
@@ -703,7 +706,7 @@ func TestValueReader(t *testing.T) {
703706
for _, tc := range testCases {
704707
t.Run(tc.name, func(t *testing.T) {
705708
vr := &valueReader{
706-
r: bufio.NewReader(bytes.NewReader(tc.data)),
709+
src: &bufferedValueReader{buf: tc.data},
707710
stack: []vrState{
708711
{mode: mTopLevel},
709712
{
@@ -778,7 +781,7 @@ func TestValueReader(t *testing.T) {
778781
append([]byte{0x40, 0x27, 0x00, 0x00}, testcstring...),
779782
(*valueReader).ReadString,
780783
"",
781-
io.ErrUnexpectedEOF,
784+
io.EOF,
782785
TypeString,
783786
},
784787
{
@@ -858,7 +861,7 @@ func TestValueReader(t *testing.T) {
858861
for _, tc := range testCases {
859862
t.Run(tc.name, func(t *testing.T) {
860863
vr := &valueReader{
861-
r: bufio.NewReader(bytes.NewReader(tc.data)),
864+
src: &bufferedValueReader{buf: tc.data},
862865
stack: []vrState{
863866
{mode: mTopLevel},
864867
{
@@ -939,6 +942,7 @@ func TestValueReader(t *testing.T) {
939942
for _, tc := range testCases {
940943
t.Run(tc.name, func(t *testing.T) {
941944
vr := &valueReader{
945+
src: &bufferedValueReader{buf: []byte{}},
942946
stack: []vrState{
943947
{mode: mTopLevel},
944948
{
@@ -990,7 +994,7 @@ func TestValueReader(t *testing.T) {
990994
for _, tc := range testCases {
991995
t.Run(tc.name, func(t *testing.T) {
992996
vr := &valueReader{
993-
r: bufio.NewReader(bytes.NewReader(tc.data)),
997+
src: &bufferedValueReader{buf: tc.data},
994998
stack: []vrState{
995999
{mode: mTopLevel},
9961000
{
@@ -1057,7 +1061,7 @@ func TestValueReader(t *testing.T) {
10571061
for _, tc := range testCases {
10581062
t.Run(tc.name, func(t *testing.T) {
10591063
vr := &valueReader{
1060-
r: bufio.NewReader(bytes.NewReader(tc.data)),
1064+
src: &bufferedValueReader{buf: tc.data},
10611065
stack: []vrState{
10621066
{mode: mTopLevel},
10631067
{
@@ -1127,7 +1131,7 @@ func TestValueReader(t *testing.T) {
11271131
for _, tc := range testCases {
11281132
t.Run(tc.name, func(t *testing.T) {
11291133
vr := &valueReader{
1130-
r: bufio.NewReader(bytes.NewReader(tc.data)),
1134+
src: &bufferedValueReader{buf: tc.data},
11311135
stack: []vrState{
11321136
{mode: mTopLevel},
11331137
{
@@ -1347,46 +1351,38 @@ func TestValueReader(t *testing.T) {
13471351
const startingEnd = 64
13481352
t.Run("Skip", func(t *testing.T) {
13491353
vr := &valueReader{
1350-
r: bufio.NewReader(bytes.NewReader(tc.data[tc.startingOffset:tc.offset])),
1354+
src: &bufferedValueReader{buf: tc.data, offset: tc.startingOffset},
13511355
stack: []vrState{
13521356
{mode: mTopLevel, end: startingEnd},
13531357
{mode: mElement, vType: tc.t},
13541358
},
1355-
frame: 1,
1356-
offset: tc.startingOffset,
1359+
frame: 1,
13571360
}
13581361

13591362
err := vr.Skip()
13601363
if !errequal(t, err, tc.err) {
13611364
t.Errorf("Did not receive expected error; got %v; want %v", err, tc.err)
13621365
}
1363-
if tc.err == nil {
1364-
offset := startingEnd - vr.stack[0].end
1365-
if offset != tc.offset {
1366-
t.Errorf("Offset not set at correct position; got %d; want %d", offset, tc.offset)
1367-
}
1366+
if tc.err == nil && vr.src.pos() != tc.offset {
1367+
t.Errorf("Offset not set at correct position; got %d; want %d", vr.src.pos(), tc.offset)
13681368
}
13691369
})
13701370
t.Run("ReadBytes", func(t *testing.T) {
13711371
vr := &valueReader{
1372-
r: bufio.NewReader(bytes.NewReader(tc.data[tc.startingOffset:tc.offset])),
1372+
src: &bufferedValueReader{buf: tc.data, offset: tc.startingOffset},
13731373
stack: []vrState{
13741374
{mode: mTopLevel, end: startingEnd},
13751375
{mode: mElement, vType: tc.t},
13761376
},
1377-
frame: 1,
1378-
offset: tc.startingOffset,
1377+
frame: 1,
13791378
}
13801379

13811380
_, got, err := vr.readValueBytes(nil)
13821381
if !errequal(t, err, tc.err) {
13831382
t.Errorf("Did not receive expected error; got %v; want %v", err, tc.err)
13841383
}
1385-
if tc.err == nil {
1386-
offset := startingEnd - vr.stack[0].end
1387-
if offset != tc.offset {
1388-
t.Errorf("Offset not set at correct position; got %d; want %d", vr.offset, tc.offset)
1389-
}
1384+
if tc.err == nil && vr.src.pos() != tc.offset {
1385+
t.Errorf("Offset not set at correct position; got %d; want %d", vr.src.pos(), tc.offset)
13901386
}
13911387
if tc.err == nil && !bytes.Equal(got, tc.data[tc.startingOffset:]) {
13921388
t.Errorf("Did not receive expected bytes. got %v; want %v", got, tc.data[tc.startingOffset:])
@@ -1417,7 +1413,7 @@ func TestValueReader(t *testing.T) {
14171413
"append bytes",
14181414
[]byte{0x01, 0x02, 0x03, 0x04},
14191415
Type(0),
1420-
io.ErrUnexpectedEOF,
1416+
io.EOF,
14211417
},
14221418
}
14231419

@@ -1426,7 +1422,7 @@ func TestValueReader(t *testing.T) {
14261422
t.Run(tc.name, func(t *testing.T) {
14271423
t.Parallel()
14281424
vr := &valueReader{
1429-
r: bufio.NewReader(bytes.NewReader(tc.want)),
1425+
src: &bufferedValueReader{buf: tc.want},
14301426
stack: []vrState{
14311427
{mode: mTopLevel},
14321428
},
@@ -1460,7 +1456,7 @@ func TestValueReader(t *testing.T) {
14601456
t.Run("ReadBytes", func(t *testing.T) {
14611457
vr := &valueReader{stack: []vrState{{mode: mTopLevel}, {mode: mDocument}}, frame: 1}
14621458
wanterr := (&valueReader{stack: []vrState{{mode: mTopLevel}, {mode: mDocument}}, frame: 1}).
1463-
invalidTransitionErr(0, "ReadValueBytes", []mode{mElement, mValue})
1459+
invalidTransitionErr(0, "readValueBytes", []mode{mElement, mValue})
14641460
_, _, goterr := vr.readValueBytes(nil)
14651461
if !cmp.Equal(goterr, wanterr, cmp.Comparer(assert.CompareErrors)) {
14661462
t.Errorf("Expected correct invalid transition error. got %v; want %v", goterr, wanterr)

0 commit comments

Comments
 (0)