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 }