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 }