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  }