github.com/weaviate/weaviate@v1.24.6/adapters/repos/db/roaringset/serialization_test.go (about)

     1  //                           _       _
     2  // __      _____  __ ___   ___  __ _| |_ ___
     3  // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \
     4  //  \ V  V /  __/ (_| |\ V /| | (_| | ||  __/
     5  //   \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___|
     6  //
     7  //  Copyright © 2016 - 2024 Weaviate B.V. All rights reserved.
     8  //
     9  //  CONTACT: hello@weaviate.io
    10  //
    11  
    12  package roaringset
    13  
    14  import (
    15  	"bytes"
    16  	"math"
    17  	"testing"
    18  
    19  	"github.com/stretchr/testify/assert"
    20  	"github.com/stretchr/testify/require"
    21  )
    22  
    23  func TestSerialization_HappyPath(t *testing.T) {
    24  	additions := NewBitmap(1, 2, 3, 4, 6)
    25  	deletions := NewBitmap(5, 7)
    26  	key := []byte("my-key")
    27  
    28  	sn, err := NewSegmentNode(key, additions, deletions)
    29  	require.Nil(t, err)
    30  
    31  	buf := sn.ToBuffer()
    32  	assert.Equal(t, sn.Len(), uint64(len(buf)))
    33  
    34  	newSN := NewSegmentNodeFromBuffer(buf)
    35  	assert.Equal(t, newSN.Len(), uint64(len(buf)))
    36  
    37  	// without copying
    38  	newAdditions := newSN.Additions()
    39  	assert.True(t, newAdditions.Contains(4))
    40  	assert.False(t, newAdditions.Contains(5))
    41  	newDeletions := newSN.Deletions()
    42  	assert.False(t, newDeletions.Contains(4))
    43  	assert.True(t, newDeletions.Contains(5))
    44  	assert.Equal(t, []byte("my-key"), newSN.PrimaryKey())
    45  
    46  	// with copying
    47  	newAdditions = newSN.AdditionsWithCopy()
    48  	assert.True(t, newAdditions.Contains(4))
    49  	assert.False(t, newAdditions.Contains(5))
    50  	newDeletions = newSN.DeletionsWithCopy()
    51  	assert.False(t, newDeletions.Contains(4))
    52  	assert.True(t, newDeletions.Contains(5))
    53  }
    54  
    55  func TestSerialization_InitializingFromBufferTooLarge(t *testing.T) {
    56  	additions := NewBitmap(1, 2, 3, 4, 6)
    57  	deletions := NewBitmap(5, 7)
    58  	key := []byte("my-key")
    59  
    60  	sn, err := NewSegmentNode(key, additions, deletions)
    61  	require.Nil(t, err)
    62  
    63  	buf := sn.ToBuffer()
    64  	assert.Equal(t, sn.Len(), uint64(len(buf)))
    65  
    66  	bufTooLarge := make([]byte, 3*len(buf))
    67  	copy(bufTooLarge, buf)
    68  
    69  	newSN := NewSegmentNodeFromBuffer(bufTooLarge)
    70  	// assert that the buffer self reports the useful length, not the length of
    71  	// the initialization buffer
    72  	assert.Equal(t, newSN.Len(), uint64(len(buf)))
    73  	// assert that ToBuffer() returns a buffer that is no longer than the useful
    74  	// length
    75  	assert.Equal(t, len(buf), len(newSN.ToBuffer()))
    76  }
    77  
    78  func TestSerialization_UnhappyPath(t *testing.T) {
    79  	t.Run("with primary key that's too long", func(t *testing.T) {
    80  		key := make([]byte, math.MaxUint32+3)
    81  		_, err := NewSegmentNode(key, nil, nil)
    82  
    83  		require.NotNil(t, err)
    84  		assert.Contains(t, err.Error(), "key too long")
    85  	})
    86  }
    87  
    88  func TestSerialization_KeyIndexAndWriteTo(t *testing.T) {
    89  	buf := &bytes.Buffer{}
    90  	offset := 7
    91  	// write some dummy data, so we have an offset
    92  	buf.Write(make([]byte, offset))
    93  
    94  	additions := NewBitmap(1, 2, 3, 4, 6)
    95  	deletions := NewBitmap(5, 7)
    96  	key := []byte("my-key")
    97  
    98  	sn, err := NewSegmentNode(key, additions, deletions)
    99  	require.Nil(t, err)
   100  
   101  	keyIndex, err := sn.KeyIndexAndWriteTo(buf, offset)
   102  	require.Nil(t, err)
   103  
   104  	res := buf.Bytes()
   105  	assert.Equal(t, keyIndex.ValueEnd, len(res))
   106  
   107  	newSN := NewSegmentNodeFromBuffer(res[keyIndex.ValueStart:keyIndex.ValueEnd])
   108  	newAdditions := newSN.Additions()
   109  	assert.True(t, newAdditions.Contains(4))
   110  	assert.False(t, newAdditions.Contains(5))
   111  	newDeletions := newSN.Deletions()
   112  	assert.False(t, newDeletions.Contains(4))
   113  	assert.True(t, newDeletions.Contains(5))
   114  	assert.Equal(t, []byte("my-key"), newSN.PrimaryKey())
   115  }