github.com/weaviate/weaviate@v1.24.6/adapters/repos/db/helpers/allow_list_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 helpers
    13  
    14  import (
    15  	"testing"
    16  
    17  	"github.com/stretchr/testify/assert"
    18  	"github.com/weaviate/weaviate/adapters/repos/db/roaringset"
    19  )
    20  
    21  func TestAllowList(t *testing.T) {
    22  	t.Run("allowlist created with no values", func(t *testing.T) {
    23  		al := NewAllowList()
    24  
    25  		assert.Equal(t, 0, al.Len())
    26  		assert.True(t, al.IsEmpty())
    27  
    28  		assert.Equal(t, uint64(0), al.Min())
    29  		assert.Equal(t, uint64(0), al.Max())
    30  	})
    31  
    32  	t.Run("allowlist created with initial values", func(t *testing.T) {
    33  		al := NewAllowList(1, 2, 3)
    34  
    35  		assert.Equal(t, 3, al.Len())
    36  		assert.False(t, al.IsEmpty())
    37  
    38  		assert.True(t, al.Contains(1))
    39  		assert.True(t, al.Contains(2))
    40  		assert.True(t, al.Contains(3))
    41  
    42  		assert.Equal(t, uint64(1), al.Min())
    43  		assert.Equal(t, uint64(3), al.Max())
    44  	})
    45  
    46  	t.Run("allowlist with inserted values", func(t *testing.T) {
    47  		al := NewAllowList(1, 2, 3)
    48  		al.Insert(4, 5)
    49  
    50  		assert.Equal(t, 5, al.Len())
    51  		assert.False(t, al.IsEmpty())
    52  
    53  		assert.True(t, al.Contains(1))
    54  		assert.True(t, al.Contains(2))
    55  		assert.True(t, al.Contains(3))
    56  		assert.True(t, al.Contains(4))
    57  		assert.True(t, al.Contains(5))
    58  
    59  		assert.Equal(t, uint64(1), al.Min())
    60  		assert.Equal(t, uint64(5), al.Max())
    61  	})
    62  
    63  	t.Run("allowlist exported to slice", func(t *testing.T) {
    64  		al := NewAllowList(1, 2, 3)
    65  		al.Insert(4, 5)
    66  
    67  		assert.ElementsMatch(t, []uint64{1, 2, 3, 4, 5}, al.Slice())
    68  	})
    69  
    70  	t.Run("allowlist deepcopy", func(t *testing.T) {
    71  		al := NewAllowList(1, 2, 3)
    72  		copy := al.DeepCopy()
    73  		al.Insert(4, 5)
    74  
    75  		assert.Equal(t, 5, al.Len())
    76  		assert.False(t, al.IsEmpty())
    77  
    78  		assert.True(t, al.Contains(1))
    79  		assert.True(t, al.Contains(2))
    80  		assert.True(t, al.Contains(3))
    81  		assert.True(t, al.Contains(4))
    82  		assert.True(t, al.Contains(5))
    83  
    84  		assert.Equal(t, uint64(1), al.Min())
    85  		assert.Equal(t, uint64(5), al.Max())
    86  
    87  		assert.Equal(t, 3, copy.Len())
    88  		assert.False(t, copy.IsEmpty())
    89  
    90  		assert.True(t, copy.Contains(1))
    91  		assert.True(t, copy.Contains(2))
    92  		assert.True(t, copy.Contains(3))
    93  
    94  		assert.Equal(t, uint64(1), copy.Min())
    95  		assert.Equal(t, uint64(3), copy.Max())
    96  	})
    97  
    98  	t.Run("allowlist created from bitmap", func(t *testing.T) {
    99  		bm := roaringset.NewBitmap(1, 2, 3)
   100  
   101  		al := NewAllowListFromBitmap(bm)
   102  		bm.SetMany([]uint64{4, 5})
   103  
   104  		assert.Equal(t, 5, al.Len())
   105  		assert.False(t, al.IsEmpty())
   106  
   107  		assert.True(t, al.Contains(1))
   108  		assert.True(t, al.Contains(2))
   109  		assert.True(t, al.Contains(3))
   110  		assert.True(t, al.Contains(4))
   111  		assert.True(t, al.Contains(5))
   112  
   113  		assert.Equal(t, uint64(1), al.Min())
   114  		assert.Equal(t, uint64(5), al.Max())
   115  	})
   116  
   117  	t.Run("allowlist created from bitmap deepcopy", func(t *testing.T) {
   118  		bm := roaringset.NewBitmap(1, 2, 3)
   119  
   120  		al := NewAllowListFromBitmapDeepCopy(bm)
   121  		bm.SetMany([]uint64{4, 5})
   122  
   123  		assert.Equal(t, 3, al.Len())
   124  		assert.False(t, al.IsEmpty())
   125  
   126  		assert.True(t, al.Contains(1))
   127  		assert.True(t, al.Contains(2))
   128  		assert.True(t, al.Contains(3))
   129  
   130  		assert.Equal(t, uint64(1), al.Min())
   131  		assert.Equal(t, uint64(3), al.Max())
   132  	})
   133  }
   134  
   135  func TestAllowList_Iterator(t *testing.T) {
   136  	t.Run("empty bitmap iterator", func(t *testing.T) {
   137  		it := NewAllowList().Iterator()
   138  
   139  		id1, ok1 := it.Next()
   140  		id2, ok2 := it.Next()
   141  
   142  		assert.Equal(t, 0, it.Len())
   143  		assert.False(t, ok1)
   144  		assert.Equal(t, uint64(0), id1)
   145  		assert.False(t, ok2)
   146  		assert.Equal(t, uint64(0), id2)
   147  	})
   148  
   149  	t.Run("iterating step by step", func(t *testing.T) {
   150  		it := NewAllowList(3, 2, 1).Iterator()
   151  
   152  		id1, ok1 := it.Next()
   153  		id2, ok2 := it.Next()
   154  		id3, ok3 := it.Next()
   155  		id4, ok4 := it.Next()
   156  
   157  		assert.Equal(t, 3, it.Len())
   158  		assert.True(t, ok1)
   159  		assert.Equal(t, uint64(1), id1)
   160  		assert.True(t, ok2)
   161  		assert.Equal(t, uint64(2), id2)
   162  		assert.True(t, ok3)
   163  		assert.Equal(t, uint64(3), id3)
   164  		assert.False(t, ok4)
   165  		assert.Equal(t, uint64(0), id4)
   166  	})
   167  
   168  	t.Run("iterating in loop", func(t *testing.T) {
   169  		it := NewAllowList(3, 2, 1).Iterator()
   170  		ids := []uint64{}
   171  
   172  		for id, ok := it.Next(); ok; id, ok = it.Next() {
   173  			ids = append(ids, id)
   174  		}
   175  
   176  		assert.Equal(t, 3, it.Len())
   177  		assert.Equal(t, []uint64{1, 2, 3}, ids)
   178  	})
   179  }
   180  
   181  func TestAllowList_LimitedIterator(t *testing.T) {
   182  	t.Run("empty bitmap iterator", func(t *testing.T) {
   183  		it := NewAllowList().LimitedIterator(2)
   184  
   185  		id1, ok1 := it.Next()
   186  		id2, ok2 := it.Next()
   187  
   188  		assert.Equal(t, 0, it.Len())
   189  		assert.False(t, ok1)
   190  		assert.Equal(t, uint64(0), id1)
   191  		assert.False(t, ok2)
   192  		assert.Equal(t, uint64(0), id2)
   193  	})
   194  
   195  	t.Run("iterating step by step (higher limit)", func(t *testing.T) {
   196  		it := NewAllowList(3, 2, 1).LimitedIterator(4)
   197  
   198  		id1, ok1 := it.Next()
   199  		id2, ok2 := it.Next()
   200  		id3, ok3 := it.Next()
   201  		id4, ok4 := it.Next()
   202  
   203  		assert.Equal(t, 3, it.Len())
   204  		assert.True(t, ok1)
   205  		assert.Equal(t, uint64(1), id1)
   206  		assert.True(t, ok2)
   207  		assert.Equal(t, uint64(2), id2)
   208  		assert.True(t, ok3)
   209  		assert.Equal(t, uint64(3), id3)
   210  		assert.False(t, ok4)
   211  		assert.Equal(t, uint64(0), id4)
   212  	})
   213  
   214  	t.Run("iterating step by step (equal limit)", func(t *testing.T) {
   215  		it := NewAllowList(3, 2, 1).LimitedIterator(3)
   216  
   217  		id1, ok1 := it.Next()
   218  		id2, ok2 := it.Next()
   219  		id3, ok3 := it.Next()
   220  		id4, ok4 := it.Next()
   221  
   222  		assert.Equal(t, 3, it.Len())
   223  		assert.True(t, ok1)
   224  		assert.Equal(t, uint64(1), id1)
   225  		assert.True(t, ok2)
   226  		assert.Equal(t, uint64(2), id2)
   227  		assert.True(t, ok3)
   228  		assert.Equal(t, uint64(3), id3)
   229  		assert.False(t, ok4)
   230  		assert.Equal(t, uint64(0), id4)
   231  	})
   232  
   233  	t.Run("iterating step by step (lower limit)", func(t *testing.T) {
   234  		it := NewAllowList(3, 2, 1).LimitedIterator(2)
   235  
   236  		id1, ok1 := it.Next()
   237  		id2, ok2 := it.Next()
   238  		id3, ok3 := it.Next()
   239  
   240  		assert.Equal(t, 2, it.Len())
   241  		assert.True(t, ok1)
   242  		assert.Equal(t, uint64(1), id1)
   243  		assert.True(t, ok2)
   244  		assert.Equal(t, uint64(2), id2)
   245  		assert.False(t, ok3)
   246  		assert.Equal(t, uint64(0), id3)
   247  	})
   248  
   249  	t.Run("iterating in loop (higher limit)", func(t *testing.T) {
   250  		it := NewAllowList(3, 2, 1).LimitedIterator(4)
   251  		ids := []uint64{}
   252  
   253  		for id, ok := it.Next(); ok; id, ok = it.Next() {
   254  			ids = append(ids, id)
   255  		}
   256  
   257  		assert.Equal(t, 3, it.Len())
   258  		assert.Equal(t, []uint64{1, 2, 3}, ids)
   259  	})
   260  
   261  	t.Run("iterating in loop (equal limit)", func(t *testing.T) {
   262  		it := NewAllowList(3, 2, 1).LimitedIterator(3)
   263  		ids := []uint64{}
   264  
   265  		for id, ok := it.Next(); ok; id, ok = it.Next() {
   266  			ids = append(ids, id)
   267  		}
   268  
   269  		assert.Equal(t, 3, it.Len())
   270  		assert.Equal(t, []uint64{1, 2, 3}, ids)
   271  	})
   272  
   273  	t.Run("iterating in loop (lower limit)", func(t *testing.T) {
   274  		it := NewAllowList(3, 2, 1).LimitedIterator(2)
   275  		ids := []uint64{}
   276  
   277  		for id, ok := it.Next(); ok; id, ok = it.Next() {
   278  			ids = append(ids, id)
   279  		}
   280  
   281  		assert.Equal(t, 2, it.Len())
   282  		assert.Equal(t, []uint64{1, 2}, ids)
   283  	})
   284  }