Spaces:
Running
Running
// _ _ | |
// __ _____ __ ___ ___ __ _| |_ ___ | |
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ | |
// \ V V / __/ (_| |\ V /| | (_| | || __/ | |
// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| | |
// | |
// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. | |
// | |
// CONTACT: [email protected] | |
// | |
//go:build integrationTest | |
// +build integrationTest | |
package modulestorage | |
import ( | |
"crypto/rand" | |
"fmt" | |
"math/big" | |
"os" | |
"testing" | |
"github.com/sirupsen/logrus/hooks/test" | |
"github.com/stretchr/testify/assert" | |
"github.com/stretchr/testify/require" | |
) | |
func mustRandIntn(max int64) int { | |
randInt, err := rand.Int(rand.Reader, big.NewInt(max)) | |
if err != nil { | |
panic(fmt.Sprintf("mustRandIntn error: %v", err)) | |
} | |
return int(randInt.Int64()) | |
} | |
func Test_ModuleStorage(t *testing.T) { | |
dirName := fmt.Sprintf("./testdata/%d", mustRandIntn(10000000)) | |
os.MkdirAll(dirName, 0o777) | |
defer func() { | |
err := os.RemoveAll(dirName) | |
fmt.Println(err) | |
}() | |
logger, _ := test.NewNullLogger() | |
r, err := NewRepo(dirName, logger) | |
require.Nil(t, err) | |
module1, err := r.Storage("my-module") | |
require.Nil(t, err) | |
module2, err := r.Storage("my-other-module") | |
require.Nil(t, err) | |
t.Run("storing two k/v pairs for each bucket", func(t *testing.T) { | |
err := module1.Put([]byte("module1-key1"), []byte("module1-value1")) | |
require.Nil(t, err) | |
err = module1.Put([]byte("module1-key2"), []byte("module1-value2")) | |
require.Nil(t, err) | |
err = module2.Put([]byte("module2-key1"), []byte("module2-value1")) | |
require.Nil(t, err) | |
err = module2.Put([]byte("module2-key2"), []byte("module2-value2")) | |
require.Nil(t, err) | |
}) | |
t.Run("retrieving values across buckets and keys", func(t *testing.T) { | |
var v []byte | |
var err error | |
// on module 1 bucket | |
v, err = module1.Get([]byte("module1-key1")) | |
require.Nil(t, err) | |
assert.Equal(t, []byte("module1-value1"), v) | |
v, err = module1.Get([]byte("module1-key2")) | |
require.Nil(t, err) | |
assert.Equal(t, []byte("module1-value2"), v) | |
v, err = module1.Get([]byte("module2-key1")) | |
require.Nil(t, err) | |
assert.Equal(t, []byte(nil), v) | |
v, err = module1.Get([]byte("module2-key2")) | |
require.Nil(t, err) | |
assert.Equal(t, []byte(nil), v) | |
// on module 2 bucket | |
v, err = module2.Get([]byte("module1-key1")) | |
require.Nil(t, err) | |
assert.Equal(t, []byte(nil), v) | |
v, err = module2.Get([]byte("module1-key2")) | |
require.Nil(t, err) | |
assert.Equal(t, []byte(nil), v) | |
v, err = module2.Get([]byte("module2-key1")) | |
require.Nil(t, err) | |
assert.Equal(t, []byte("module2-value1"), v) | |
v, err = module2.Get([]byte("module2-key2")) | |
require.Nil(t, err) | |
assert.Equal(t, []byte("module2-value2"), v) | |
}) | |
t.Run("scanning all k/v for a bucket", func(t *testing.T) { | |
t.Run("module1 - full range", func(t *testing.T) { | |
var ( | |
keys [][]byte | |
values [][]byte | |
) | |
expectedKeys := [][]byte{ | |
[]byte("module1-key1"), | |
[]byte("module1-key2"), | |
} | |
expectedValues := [][]byte{ | |
[]byte("module1-value1"), | |
[]byte("module1-value2"), | |
} | |
err := module1.Scan(func(k, v []byte) (bool, error) { | |
keys = append(keys, k) | |
values = append(values, v) | |
return true, nil | |
}) | |
require.Nil(t, err) | |
assert.Equal(t, expectedKeys, keys) | |
assert.Equal(t, expectedValues, values) | |
}) | |
t.Run("module2 - full range", func(t *testing.T) { | |
var ( | |
keys [][]byte | |
values [][]byte | |
) | |
expectedKeys := [][]byte{ | |
[]byte("module2-key1"), | |
[]byte("module2-key2"), | |
} | |
expectedValues := [][]byte{ | |
[]byte("module2-value1"), | |
[]byte("module2-value2"), | |
} | |
err := module2.Scan(func(k, v []byte) (bool, error) { | |
keys = append(keys, k) | |
values = append(values, v) | |
return true, nil | |
}) | |
require.Nil(t, err) | |
assert.Equal(t, expectedKeys, keys) | |
assert.Equal(t, expectedValues, values) | |
}) | |
t.Run("module2 - stop after single row", func(t *testing.T) { | |
var ( | |
keys [][]byte | |
values [][]byte | |
) | |
expectedKeys := [][]byte{ | |
[]byte("module2-key1"), | |
} | |
expectedValues := [][]byte{ | |
[]byte("module2-value1"), | |
} | |
err := module2.Scan(func(k, v []byte) (bool, error) { | |
keys = append(keys, k) | |
values = append(values, v) | |
return false, nil | |
}) | |
require.Nil(t, err) | |
assert.Equal(t, expectedKeys, keys) | |
assert.Equal(t, expectedValues, values) | |
}) | |
t.Run("module2 - with scan error", func(t *testing.T) { | |
err := module2.Scan(func(k, v []byte) (bool, error) { | |
return false, fmt.Errorf("oops") | |
}) | |
assert.Equal(t, "read item \"module2-key1\": oops", err.Error()) | |
}) | |
}) | |
} | |