bson/bson_unmarshal_value_test.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)
}
}
})
})
}
}