93 lines
2.5 KiB
Go
93 lines
2.5 KiB
Go
// Copyright (C) MongoDB, Inc. 2023-present.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
// not use this file except in compliance with the License. You may obtain
|
|
// a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
package bson
|
|
|
|
import (
|
|
"bytes"
|
|
"reflect"
|
|
"strings"
|
|
"testing"
|
|
|
|
"gitea.psichedelico.com/go/bson/internal/assert"
|
|
"gitea.psichedelico.com/go/bson/internal/require"
|
|
"gitea.psichedelico.com/go/bson/x/bsonx/bsoncore"
|
|
)
|
|
|
|
func TestUnmarshalValue(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
for _, tc := range marshalValueTestCases {
|
|
tc := tc
|
|
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
gotValue := reflect.New(reflect.TypeOf(tc.val))
|
|
err := UnmarshalValue(tc.bsontype, tc.bytes, gotValue.Interface())
|
|
assert.Nil(t, err, "UnmarshalValueWithRegistry error: %v", err)
|
|
assert.Equal(t, tc.val, gotValue.Elem().Interface(), "value mismatch; expected %s, got %s", tc.val, gotValue.Elem())
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestInitializedPointerDataWithBSONNull(t *testing.T) {
|
|
// Set up the test case with initialized pointers.
|
|
tc := unmarshalBehaviorTestCase{
|
|
BSONValuePtrTracker: &unmarshalBSONValueCallTracker{},
|
|
BSONPtrTracker: &unmarshalBSONCallTracker{},
|
|
}
|
|
// Create BSON data where the '*_ptr_tracker' fields are explicitly set to
|
|
// null.
|
|
bytes := docToBytes(D{
|
|
{Key: "bv_ptr_tracker", Value: nil},
|
|
{Key: "b_ptr_tracker", Value: nil},
|
|
})
|
|
// Unmarshal the BSON data into the test case struct. This should set the
|
|
// pointer fields to nil due to the BSON null value.
|
|
err := Unmarshal(bytes, &tc)
|
|
require.NoError(t, err)
|
|
assert.Nil(t, tc.BSONValuePtrTracker)
|
|
assert.Nil(t, tc.BSONPtrTracker)
|
|
}
|
|
|
|
// tests covering GODRIVER-2779
|
|
func BenchmarkSliceCodecUnmarshal(b *testing.B) {
|
|
benchmarks := []struct {
|
|
name string
|
|
bsontype Type
|
|
bytes []byte
|
|
}{
|
|
{
|
|
name: "SliceCodec binary",
|
|
bsontype: TypeBinary,
|
|
bytes: bsoncore.AppendBinary(nil, TypeBinaryGeneric, []byte(strings.Repeat("t", 4096))),
|
|
},
|
|
{
|
|
name: "SliceCodec string",
|
|
bsontype: TypeString,
|
|
bytes: bsoncore.AppendString(nil, strings.Repeat("t", 4096)),
|
|
},
|
|
}
|
|
reg := NewRegistry()
|
|
reg.RegisterTypeDecoder(reflect.TypeOf([]byte{}), &sliceCodec{})
|
|
for _, bm := range benchmarks {
|
|
b.Run(bm.name, func(b *testing.B) {
|
|
b.RunParallel(func(pb *testing.PB) {
|
|
dec := NewDecoder(nil)
|
|
dec.SetRegistry(reg)
|
|
for pb.Next() {
|
|
dec.Reset(newValueReader(bm.bsontype, bytes.NewReader(bm.bytes)))
|
|
err := dec.Decode(&[]byte{})
|
|
if err != nil {
|
|
b.Fatal(err)
|
|
}
|
|
}
|
|
})
|
|
})
|
|
}
|
|
}
|