github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/istorage/provider/impl_test.go (about) 1 /* 2 * Copyright (c) 2020-present unTill Pro, Ltd. 3 */ 4 5 package provider 6 7 import ( 8 "testing" 9 10 "github.com/stretchr/testify/require" 11 12 "github.com/voedger/voedger/pkg/istorage" 13 "github.com/voedger/voedger/pkg/istorage/mem" 14 "github.com/voedger/voedger/pkg/istructs" 15 ) 16 17 func TestBasicUsage(t *testing.T) { 18 require := require.New(t) 19 asf := mem.Provide() 20 asp := Provide(asf) 21 22 app1 := istructs.NewAppQName("sys", "_") // SafeAppName is "sys" 23 app2 := istructs.NewAppQName("sys", "/") // SafeAppName is "sys{uuid}" 24 25 // basic IAppStorage obtain 26 storage, err := asp.AppStorage(app1) 27 require.NoError(err) 28 storageApp2, err := asp.AppStorage(app2) 29 require.NoError(err) 30 31 t.Run("same IAppStorage instances on AppStorage calls for the same app", func(t *testing.T) { 32 storage2, err := asp.AppStorage(app1) 33 require.NoError(err) 34 require.Same(storage, storage2) 35 36 storageApp3, err := asp.AppStorage(app2) 37 require.NoError(err) 38 require.Same(storageApp2, storageApp3) 39 }) 40 41 t.Run("safe app name is obtained once -> read it from sysmeta in future", func(t *testing.T) { 42 // store something for app2 43 require.NoError(storageApp2.Put([]byte{1}, []byte{1}, []byte{2})) 44 45 // re-initialize 46 asp = Provide(asf, asp.(*implIAppStorageProvider).suffix) 47 48 // obtain IAppStorage for app2 49 // it should be the same as before 50 storage, err := asp.AppStorage(app2) 51 require.NoError(err) 52 53 // now check we've got into sysab for app2, not sysaa that could be if there was just single app2 54 // because we've get sysab once for app2 so it should be stored in sysmeta 55 val := []byte{} 56 _, err = storage.Get([]byte{1}, []byte{1}, &val) 57 require.NoError(err) 58 require.Equal([]byte{2}, val) 59 }) 60 } 61 62 func TestInitErrorPersistence(t *testing.T) { 63 require := require.New(t) 64 asf := mem.Provide() 65 asp := Provide(asf) 66 67 app1 := istructs.NewAppQName("sys", "_") 68 app1SafeName, err := istorage.NewSafeAppName(app1, func(name string) (bool, error) { return true, nil }) 69 require.NoError(err) 70 71 // init the storage manually to force the error 72 app1SafeName = asp.(*implIAppStorageProvider).clarifyKeyspaceName(app1SafeName) 73 require.NoError(asf.Init(app1SafeName)) 74 75 // expect an error 76 _, err = asp.AppStorage(app1) 77 require.ErrorIs(err, ErrStorageInitError) 78 79 // re-init 80 asp = Provide(asf, asp.(*implIAppStorageProvider).suffix) 81 82 // expect Init() error is stored in sysmeta 83 _, err = asp.AppStorage(app1) 84 require.ErrorIs(err, ErrStorageInitError) 85 }