github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/state/impl_wlog_storage_test.go (about) 1 /* 2 * Copyright (c) 2022-present unTill Pro, Ltd. 3 */ 4 5 package state 6 7 import ( 8 "context" 9 "testing" 10 11 "github.com/stretchr/testify/mock" 12 "github.com/stretchr/testify/require" 13 14 "github.com/voedger/voedger/pkg/appdef" 15 "github.com/voedger/voedger/pkg/istructs" 16 ) 17 18 func TestWLogStorage_Read(t *testing.T) { 19 t.Run("Should be ok", func(t *testing.T) { 20 require := require.New(t) 21 touched := false 22 events := &mockEvents{} 23 events.On("ReadWLog", context.Background(), istructs.WSID(1), istructs.FirstOffset, 1, mock.AnythingOfType("istructs.WLogEventsReaderCallback")). 24 Return(nil). 25 Run(func(args mock.Arguments) { 26 require.NoError(args.Get(4).(istructs.WLogEventsReaderCallback)(istructs.FirstOffset, nil)) 27 }) 28 appStructs := &mockAppStructs{} 29 appStructs.On("AppDef").Return(&nilAppDef{}) 30 appStructs.On("Events").Return(events) 31 appStructs.On("Records").Return(&nilRecords{}) 32 appStructs.On("ViewRecords").Return(&nilViewRecords{}) 33 s := ProvideQueryProcessorStateFactory()(context.Background(), appStructsFunc(appStructs), nil, SimpleWSIDFunc(istructs.WSID(1)), nil, nil, nil, nil, nil, nil, nil, nil) 34 kb, err := s.KeyBuilder(WLog, appdef.NullQName) 35 require.NoError(err) 36 kb.PutInt64(Field_Offset, 1) 37 kb.PutInt64(Field_Count, 1) 38 39 require.NoError(s.Read(kb, func(key istructs.IKey, _ istructs.IStateValue) (err error) { 40 touched = true 41 require.Equal(int64(1), key.AsInt64(Field_Offset)) 42 return err 43 })) 44 45 require.True(touched) 46 }) 47 t.Run("Should return error on read wlog", func(t *testing.T) { 48 require := require.New(t) 49 events := &mockEvents{} 50 events.On("ReadWLog", context.Background(), istructs.WSID(1), istructs.FirstOffset, 1, mock.AnythingOfType("istructs.WLogEventsReaderCallback")).Return(errTest) 51 appStructs := &mockAppStructs{} 52 appStructs.On("AppDef").Return(&nilAppDef{}) 53 appStructs.On("Events").Return(events) 54 appStructs.On("Records").Return(&nilRecords{}) 55 appStructs.On("ViewRecords").Return(&nilViewRecords{}) 56 s := ProvideQueryProcessorStateFactory()(context.Background(), appStructsFunc(appStructs), nil, SimpleWSIDFunc(istructs.WSID(1)), nil, nil, nil, nil, nil, nil, nil, nil) 57 k, err := s.KeyBuilder(WLog, appdef.NullQName) 58 require.NoError(err) 59 k.PutInt64(Field_Offset, 1) 60 k.PutInt64(Field_Count, 1) 61 62 err = s.Read(k, func(istructs.IKey, istructs.IStateValue) error { return nil }) 63 64 require.ErrorIs(err, errTest) 65 }) 66 } 67 func TestWLogStorage_GetBatch(t *testing.T) { 68 t.Run("Should be ok", func(t *testing.T) { 69 require := require.New(t) 70 event := new(mockWLogEvent) 71 event.On("CUDs", mock.Anything).Return(nil).Run(func(args mock.Arguments) { 72 cb := args.Get(0).(func(rec istructs.ICUDRow)) 73 cb(new(mockCUDRow)) 74 }) 75 events := &mockEvents{} 76 events.On("ReadWLog", context.Background(), istructs.WSID(1), istructs.FirstOffset, 1, mock.AnythingOfType("istructs.WLogEventsReaderCallback")). 77 Return(nil). 78 Run(func(args mock.Arguments) { 79 cb := args.Get(4).(istructs.WLogEventsReaderCallback) 80 require.NoError(cb(istructs.FirstOffset, event)) 81 }) 82 appStructs := &mockAppStructs{} 83 appStructs.On("AppDef").Return(&nilAppDef{}) 84 appStructs.On("Events").Return(events) 85 appStructs.On("Records").Return(&nilRecords{}) 86 appStructs.On("ViewRecords").Return(&nilViewRecords{}) 87 s := ProvideCommandProcessorStateFactory()(context.Background(), func() istructs.IAppStructs { return appStructs }, 88 nil, SimpleWSIDFunc(istructs.WSID(1)), nil, nil, nil, nil, 0, nil, nil, nil, nil) 89 kb, err := s.KeyBuilder(WLog, appdef.NullQName) 90 require.NoError(err) 91 kb.PutInt64(Field_Offset, 1) 92 kb.PutInt64(Field_Count, 1) 93 94 sv, ok, err := s.CanExist(kb) 95 require.NoError(err) 96 97 require.True(ok) 98 require.Equal(int64(1), sv.AsInt64(Field_Offset)) 99 100 cuds := sv.AsValue(Field_CUDs) 101 cud := cuds.GetAsValue(0) 102 103 require.Equal(1, cuds.Length()) 104 require.NotNil(cud) 105 require.PanicsWithValue(errFieldByIndexIsNotAnObjectOrArray, func() { sv.GetAsValue(0) }) 106 require.PanicsWithValue(errFieldByNameIsNotAnObjectOrArray, func() { cud.AsValue(Field_CUDs) }) 107 require.PanicsWithValue(errCurrentValueIsNotAnArray, func() { sv.GetAsInt64(0) }) 108 require.PanicsWithValue(errNotImplemented, func() { sv.AsRecordID(Field_Offset) }) 109 }) 110 t.Run("Should return error when error occurred on read wlog", func(t *testing.T) { 111 require := require.New(t) 112 events := &mockEvents{} 113 events. 114 On("ReadWLog", context.Background(), istructs.WSID(1), istructs.FirstOffset, 1, mock.AnythingOfType("istructs.WLogEventsReaderCallback")). 115 Return(nil). 116 Run(func(args mock.Arguments) { 117 require.NoError(args.Get(4).(istructs.WLogEventsReaderCallback)(istructs.FirstOffset, nil)) 118 }). 119 On("ReadWLog", context.Background(), istructs.WSID(1), istructs.Offset(2), 1, mock.AnythingOfType("istructs.WLogEventsReaderCallback")). 120 Return(errTest) 121 appStructs := &mockAppStructs{} 122 appStructs.On("AppDef").Return(&nilAppDef{}) 123 appStructs.On("Events").Return(events) 124 appStructs.On("Records").Return(&nilRecords{}) 125 appStructs.On("ViewRecords").Return(&nilViewRecords{}) 126 s := ProvideCommandProcessorStateFactory()(context.Background(), func() istructs.IAppStructs { return appStructs }, 127 nil, SimpleWSIDFunc(istructs.WSID(1)), nil, nil, nil, nil, 0, nil, nil, nil, nil) 128 kb1, err := s.KeyBuilder(WLog, appdef.NullQName) 129 require.NoError(err) 130 kb1.PutInt64(Field_Offset, 1) 131 kb1.PutInt64(Field_Count, 1) 132 kb2, err := s.KeyBuilder(WLog, appdef.NullQName) 133 require.NoError(err) 134 kb2.PutInt64(Field_Offset, 2) 135 kb2.PutInt64(Field_Count, 1) 136 137 err = s.CanExistAll([]istructs.IStateKeyBuilder{kb1, kb2}, nil) 138 139 require.ErrorIs(err, errTest) 140 }) 141 }