Spaces:
Sleeping
Sleeping
| // _ _ | |
| // __ _____ __ ___ ___ __ _| |_ ___ | |
| // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ | |
| // \ 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()) | |
| }) | |
| }) | |
| } | |