github.com/onflow/flow-go@v0.35.7-crescendo-preview.23-atree-inlining/engine/execution/computation/committer/committer_test.go (about)

     1  package committer_test
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/mock"
     8  	"github.com/stretchr/testify/require"
     9  
    10  	"github.com/onflow/flow-go/engine/execution/computation/committer"
    11  	"github.com/onflow/flow-go/engine/execution/storehouse"
    12  	"github.com/onflow/flow-go/fvm/storage/snapshot"
    13  	"github.com/onflow/flow-go/ledger"
    14  	"github.com/onflow/flow-go/ledger/common/convert"
    15  	"github.com/onflow/flow-go/ledger/common/pathfinder"
    16  	"github.com/onflow/flow-go/ledger/complete"
    17  	ledgermock "github.com/onflow/flow-go/ledger/mock"
    18  	"github.com/onflow/flow-go/model/flow"
    19  	"github.com/onflow/flow-go/module/trace"
    20  	"github.com/onflow/flow-go/utils/unittest"
    21  )
    22  
    23  func TestLedgerViewCommitter(t *testing.T) {
    24  
    25  	// verify after committing a snapshot, proof will be generated,
    26  	// and changes are saved in storage snapshot
    27  	t.Run("CommitView should return proof and statecommitment", func(t *testing.T) {
    28  
    29  		l := ledgermock.NewLedger(t)
    30  		committer := committer.NewLedgerViewCommitter(l, trace.NewNoopTracer())
    31  
    32  		// CommitDelta will call ledger.Set and ledger.Prove
    33  
    34  		reg := unittest.MakeOwnerReg("key1", "val1")
    35  		startState := unittest.StateCommitmentFixture()
    36  
    37  		update, err := ledger.NewUpdate(ledger.State(startState), []ledger.Key{convert.RegisterIDToLedgerKey(reg.Key)}, []ledger.Value{reg.Value})
    38  		require.NoError(t, err)
    39  
    40  		expectedTrieUpdate, err := pathfinder.UpdateToTrieUpdate(update, complete.DefaultPathFinderVersion)
    41  		require.NoError(t, err)
    42  
    43  		endState := unittest.StateCommitmentFixture()
    44  		require.NotEqual(t, startState, endState)
    45  
    46  		// mock ledger.Set
    47  		l.On("Set", mock.Anything).
    48  			Return(func(update *ledger.Update) (newState ledger.State, trieUpdate *ledger.TrieUpdate, err error) {
    49  				if update.State().Equals(ledger.State(startState)) {
    50  					return ledger.State(endState), expectedTrieUpdate, nil
    51  				}
    52  				return ledger.DummyState, nil, fmt.Errorf("wrong update")
    53  			}).
    54  			Once()
    55  
    56  			// mock ledger.Prove
    57  		expectedProof := ledger.Proof([]byte{2, 3, 4})
    58  		l.On("Prove", mock.Anything).
    59  			Return(func(query *ledger.Query) (proof ledger.Proof, err error) {
    60  				if query.Size() != 1 {
    61  					return nil, fmt.Errorf("wrong query size: %v", query.Size())
    62  				}
    63  
    64  				k := convert.RegisterIDToLedgerKey(reg.Key)
    65  				if !query.Keys()[0].Equals(&k) {
    66  					return nil, fmt.Errorf("in correct query key for prove: %v", query.Keys()[0])
    67  				}
    68  
    69  				return expectedProof, nil
    70  			}).
    71  			Once()
    72  
    73  			// previous block's storage snapshot
    74  		oldReg := unittest.MakeOwnerReg("key1", "oldvalue")
    75  		previousBlockSnapshot := storehouse.NewExecutingBlockSnapshot(
    76  			snapshot.MapStorageSnapshot{
    77  				oldReg.Key: oldReg.Value,
    78  			},
    79  			flow.StateCommitment(update.State()),
    80  		)
    81  
    82  		// this block's register updates
    83  		blockUpdates := &snapshot.ExecutionSnapshot{
    84  			WriteSet: map[flow.RegisterID]flow.RegisterValue{
    85  				reg.Key: oldReg.Value,
    86  			},
    87  		}
    88  
    89  		newCommit, proof, trieUpdate, newStorageSnapshot, err := committer.CommitView(
    90  			blockUpdates,
    91  			previousBlockSnapshot,
    92  		)
    93  
    94  		require.NoError(t, err)
    95  
    96  		// verify CommitView returns expected proof and statecommitment
    97  		require.Equal(t, previousBlockSnapshot.Commitment(), flow.StateCommitment(trieUpdate.RootHash))
    98  		require.Equal(t, newCommit, newStorageSnapshot.Commitment())
    99  		require.Equal(t, endState, newCommit)
   100  		require.Equal(t, []uint8(expectedProof), proof)
   101  		require.True(t, expectedTrieUpdate.Equals(trieUpdate))
   102  
   103  	})
   104  
   105  }