github.com/weaviate/weaviate@v1.24.6/adapters/repos/modules/modules_integration_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 //go:build integrationTest 13 // +build integrationTest 14 15 package modulestorage 16 17 import ( 18 "crypto/rand" 19 "fmt" 20 "math/big" 21 "os" 22 "testing" 23 24 "github.com/sirupsen/logrus/hooks/test" 25 "github.com/stretchr/testify/assert" 26 "github.com/stretchr/testify/require" 27 ) 28 29 func mustRandIntn(max int64) int { 30 randInt, err := rand.Int(rand.Reader, big.NewInt(max)) 31 if err != nil { 32 panic(fmt.Sprintf("mustRandIntn error: %v", err)) 33 } 34 return int(randInt.Int64()) 35 } 36 37 func Test_ModuleStorage(t *testing.T) { 38 dirName := fmt.Sprintf("./testdata/%d", mustRandIntn(10000000)) 39 os.MkdirAll(dirName, 0o777) 40 defer func() { 41 err := os.RemoveAll(dirName) 42 fmt.Println(err) 43 }() 44 45 logger, _ := test.NewNullLogger() 46 47 r, err := NewRepo(dirName, logger) 48 require.Nil(t, err) 49 50 module1, err := r.Storage("my-module") 51 require.Nil(t, err) 52 module2, err := r.Storage("my-other-module") 53 require.Nil(t, err) 54 55 t.Run("storing two k/v pairs for each bucket", func(t *testing.T) { 56 err := module1.Put([]byte("module1-key1"), []byte("module1-value1")) 57 require.Nil(t, err) 58 err = module1.Put([]byte("module1-key2"), []byte("module1-value2")) 59 require.Nil(t, err) 60 err = module2.Put([]byte("module2-key1"), []byte("module2-value1")) 61 require.Nil(t, err) 62 err = module2.Put([]byte("module2-key2"), []byte("module2-value2")) 63 require.Nil(t, err) 64 }) 65 66 t.Run("retrieving values across buckets and keys", func(t *testing.T) { 67 var v []byte 68 var err error 69 70 // on module 1 bucket 71 v, err = module1.Get([]byte("module1-key1")) 72 require.Nil(t, err) 73 assert.Equal(t, []byte("module1-value1"), v) 74 75 v, err = module1.Get([]byte("module1-key2")) 76 require.Nil(t, err) 77 assert.Equal(t, []byte("module1-value2"), v) 78 79 v, err = module1.Get([]byte("module2-key1")) 80 require.Nil(t, err) 81 assert.Equal(t, []byte(nil), v) 82 83 v, err = module1.Get([]byte("module2-key2")) 84 require.Nil(t, err) 85 assert.Equal(t, []byte(nil), v) 86 87 // on module 2 bucket 88 v, err = module2.Get([]byte("module1-key1")) 89 require.Nil(t, err) 90 assert.Equal(t, []byte(nil), v) 91 92 v, err = module2.Get([]byte("module1-key2")) 93 require.Nil(t, err) 94 assert.Equal(t, []byte(nil), v) 95 96 v, err = module2.Get([]byte("module2-key1")) 97 require.Nil(t, err) 98 assert.Equal(t, []byte("module2-value1"), v) 99 100 v, err = module2.Get([]byte("module2-key2")) 101 require.Nil(t, err) 102 assert.Equal(t, []byte("module2-value2"), v) 103 }) 104 105 t.Run("scanning all k/v for a bucket", func(t *testing.T) { 106 t.Run("module1 - full range", func(t *testing.T) { 107 var ( 108 keys [][]byte 109 values [][]byte 110 ) 111 expectedKeys := [][]byte{ 112 []byte("module1-key1"), 113 []byte("module1-key2"), 114 } 115 expectedValues := [][]byte{ 116 []byte("module1-value1"), 117 []byte("module1-value2"), 118 } 119 120 err := module1.Scan(func(k, v []byte) (bool, error) { 121 keys = append(keys, k) 122 values = append(values, v) 123 return true, nil 124 }) 125 126 require.Nil(t, err) 127 128 assert.Equal(t, expectedKeys, keys) 129 assert.Equal(t, expectedValues, values) 130 }) 131 132 t.Run("module2 - full range", func(t *testing.T) { 133 var ( 134 keys [][]byte 135 values [][]byte 136 ) 137 expectedKeys := [][]byte{ 138 []byte("module2-key1"), 139 []byte("module2-key2"), 140 } 141 expectedValues := [][]byte{ 142 []byte("module2-value1"), 143 []byte("module2-value2"), 144 } 145 146 err := module2.Scan(func(k, v []byte) (bool, error) { 147 keys = append(keys, k) 148 values = append(values, v) 149 return true, nil 150 }) 151 152 require.Nil(t, err) 153 154 assert.Equal(t, expectedKeys, keys) 155 assert.Equal(t, expectedValues, values) 156 }) 157 158 t.Run("module2 - stop after single row", func(t *testing.T) { 159 var ( 160 keys [][]byte 161 values [][]byte 162 ) 163 expectedKeys := [][]byte{ 164 []byte("module2-key1"), 165 } 166 expectedValues := [][]byte{ 167 []byte("module2-value1"), 168 } 169 170 err := module2.Scan(func(k, v []byte) (bool, error) { 171 keys = append(keys, k) 172 values = append(values, v) 173 return false, nil 174 }) 175 176 require.Nil(t, err) 177 178 assert.Equal(t, expectedKeys, keys) 179 assert.Equal(t, expectedValues, values) 180 }) 181 182 t.Run("module2 - with scan error", func(t *testing.T) { 183 err := module2.Scan(func(k, v []byte) (bool, error) { 184 return false, fmt.Errorf("oops") 185 }) 186 187 assert.Equal(t, "read item \"module2-key1\": oops", err.Error()) 188 }) 189 }) 190 }