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  }