github.com/onflow/flow-go@v0.33.17/module/execution/registers_async_test.go (about) 1 package execution 2 3 import ( 4 "testing" 5 6 "github.com/stretchr/testify/require" 7 8 "github.com/onflow/flow-go/model/flow" 9 "github.com/onflow/flow-go/module/state_synchronization/indexer" 10 "github.com/onflow/flow-go/storage" 11 storagemock "github.com/onflow/flow-go/storage/mock" 12 "github.com/onflow/flow-go/utils/unittest" 13 ) 14 15 func TestInitialize(t *testing.T) { 16 rootBlockHeight := uint64(1) 17 // test data available on init 18 registerID := unittest.RegisterIDFixture() 19 invalidRegisterID := flow.RegisterID{ 20 Owner: "ha", 21 Key: "ha", 22 } 23 registerValue1 := []byte("response1") 24 registerValue2 := []byte("response2") 25 firstHeight := rootBlockHeight 26 latestHeight := rootBlockHeight + 1 27 28 t.Parallel() 29 30 t.Run("registersDB bootstrapped correct values returned", func(t *testing.T) { 31 registersAsync := NewRegistersAsyncStore() 32 registers := storagemock.NewRegisterIndex(t) 33 registers.On("Get", registerID, firstHeight).Return(registerValue1, nil) 34 registers.On("Get", registerID, latestHeight).Return(registerValue2, nil) 35 registers.On("FirstHeight").Return(firstHeight) 36 registers.On("LatestHeight").Return(latestHeight) 37 38 require.NoError(t, registersAsync.Initialize(registers)) 39 val1, err := registersAsync.RegisterValues([]flow.RegisterID{registerID}, firstHeight) 40 require.NoError(t, err) 41 require.Equal(t, val1[0], registerValue1) 42 43 val2, err := registersAsync.RegisterValues([]flow.RegisterID{registerID}, latestHeight) 44 require.NoError(t, err) 45 require.Equal(t, val2[0], registerValue2) 46 }) 47 48 t.Run("out of bounds height correct error returned", func(t *testing.T) { 49 registersAsync := NewRegistersAsyncStore() 50 registers := storagemock.NewRegisterIndex(t) 51 registers.On("LatestHeight").Return(latestHeight) 52 53 require.NoError(t, registersAsync.Initialize(registers)) 54 _, err := registersAsync.RegisterValues([]flow.RegisterID{registerID}, latestHeight+1) 55 require.ErrorIs(t, err, storage.ErrHeightNotIndexed) 56 }) 57 58 t.Run("no register value available correct error returned", func(t *testing.T) { 59 registersAsync := NewRegistersAsyncStore() 60 registers := storagemock.NewRegisterIndex(t) 61 registers.On("Get", invalidRegisterID, latestHeight).Return(nil, storage.ErrNotFound) 62 registers.On("FirstHeight").Return(firstHeight) 63 registers.On("LatestHeight").Return(latestHeight) 64 65 require.NoError(t, registersAsync.Initialize(registers)) 66 _, err := registersAsync.RegisterValues([]flow.RegisterID{invalidRegisterID}, latestHeight) 67 require.ErrorIs(t, err, storage.ErrNotFound) 68 }) 69 } 70 71 func TestRegisterValuesDataUnAvailable(t *testing.T) { 72 rootBlockHeight := uint64(1) 73 registersAsync := NewRegistersAsyncStore() 74 // registerDB not bootstrapped, correct error returned 75 registerID := unittest.RegisterIDFixture() 76 _, err := registersAsync.RegisterValues([]flow.RegisterID{registerID}, rootBlockHeight) 77 require.ErrorIs(t, err, indexer.ErrIndexNotInitialized) 78 } 79 80 func TestInitDataRepeatedCalls(t *testing.T) { 81 registersAsync := NewRegistersAsyncStore() 82 registers1 := storagemock.NewRegisterIndex(t) 83 registers2 := storagemock.NewRegisterIndex(t) 84 85 require.NoError(t, registersAsync.Initialize(registers1)) 86 require.Error(t, registersAsync.Initialize(registers2)) 87 }