github.com/onflow/flow-go@v0.35.7-crescendo-preview.23-atree-inlining/storage/badger/operation/guarantees_test.go (about)

     1  package operation
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/dgraph-io/badger/v2"
     7  	"github.com/onflow/crypto"
     8  	"github.com/stretchr/testify/assert"
     9  	"github.com/stretchr/testify/require"
    10  
    11  	"github.com/onflow/flow-go/model/flow"
    12  	"github.com/onflow/flow-go/utils/unittest"
    13  )
    14  
    15  func TestGuaranteeInsertRetrieve(t *testing.T) {
    16  	unittest.RunWithBadgerDB(t, func(db *badger.DB) {
    17  		g := unittest.CollectionGuaranteeFixture()
    18  
    19  		err := db.Update(InsertGuarantee(g.CollectionID, g))
    20  		require.Nil(t, err)
    21  
    22  		var retrieved flow.CollectionGuarantee
    23  		err = db.View(RetrieveGuarantee(g.CollectionID, &retrieved))
    24  		require.NoError(t, err)
    25  
    26  		assert.Equal(t, g, &retrieved)
    27  	})
    28  }
    29  
    30  func TestIndexGuaranteedCollectionByBlockHashInsertRetrieve(t *testing.T) {
    31  	unittest.RunWithBadgerDB(t, func(db *badger.DB) {
    32  		blockID := flow.Identifier{0x10}
    33  		collID1 := flow.Identifier{0x01}
    34  		collID2 := flow.Identifier{0x02}
    35  		guarantees := []*flow.CollectionGuarantee{
    36  			{CollectionID: collID1, Signature: crypto.Signature{0x10}},
    37  			{CollectionID: collID2, Signature: crypto.Signature{0x20}},
    38  		}
    39  		expected := flow.GetIDs(guarantees)
    40  
    41  		err := db.Update(func(tx *badger.Txn) error {
    42  			for _, guarantee := range guarantees {
    43  				if err := InsertGuarantee(guarantee.ID(), guarantee)(tx); err != nil {
    44  					return err
    45  				}
    46  			}
    47  			if err := IndexPayloadGuarantees(blockID, expected)(tx); err != nil {
    48  				return err
    49  			}
    50  			return nil
    51  		})
    52  		require.Nil(t, err)
    53  
    54  		var actual []flow.Identifier
    55  		err = db.View(LookupPayloadGuarantees(blockID, &actual))
    56  		require.Nil(t, err)
    57  
    58  		assert.Equal(t, []flow.Identifier{collID1, collID2}, actual)
    59  	})
    60  }
    61  
    62  func TestIndexGuaranteedCollectionByBlockHashMultipleBlocks(t *testing.T) {
    63  	unittest.RunWithBadgerDB(t, func(db *badger.DB) {
    64  		blockID1 := flow.Identifier{0x10}
    65  		blockID2 := flow.Identifier{0x20}
    66  		collID1 := flow.Identifier{0x01}
    67  		collID2 := flow.Identifier{0x02}
    68  		collID3 := flow.Identifier{0x03}
    69  		collID4 := flow.Identifier{0x04}
    70  		set1 := []*flow.CollectionGuarantee{
    71  			{CollectionID: collID1, Signature: crypto.Signature{0x1}},
    72  		}
    73  		set2 := []*flow.CollectionGuarantee{
    74  			{CollectionID: collID2, Signature: crypto.Signature{0x2}},
    75  			{CollectionID: collID3, Signature: crypto.Signature{0x3}},
    76  			{CollectionID: collID4, Signature: crypto.Signature{0x1}},
    77  		}
    78  		ids1 := flow.GetIDs(set1)
    79  		ids2 := flow.GetIDs(set2)
    80  
    81  		// insert block 1
    82  		err := db.Update(func(tx *badger.Txn) error {
    83  			for _, guarantee := range set1 {
    84  				if err := InsertGuarantee(guarantee.CollectionID, guarantee)(tx); err != nil {
    85  					return err
    86  				}
    87  			}
    88  			if err := IndexPayloadGuarantees(blockID1, ids1)(tx); err != nil {
    89  				return err
    90  			}
    91  			return nil
    92  		})
    93  		require.Nil(t, err)
    94  
    95  		// insert block 2
    96  		err = db.Update(func(tx *badger.Txn) error {
    97  			for _, guarantee := range set2 {
    98  				if err := InsertGuarantee(guarantee.CollectionID, guarantee)(tx); err != nil {
    99  					return err
   100  				}
   101  			}
   102  			if err := IndexPayloadGuarantees(blockID2, ids2)(tx); err != nil {
   103  				return err
   104  			}
   105  			return nil
   106  		})
   107  		require.Nil(t, err)
   108  
   109  		t.Run("should retrieve collections for block", func(t *testing.T) {
   110  			var actual1 []flow.Identifier
   111  			err = db.View(LookupPayloadGuarantees(blockID1, &actual1))
   112  			assert.NoError(t, err)
   113  			assert.ElementsMatch(t, []flow.Identifier{collID1}, actual1)
   114  
   115  			// get block 2
   116  			var actual2 []flow.Identifier
   117  			err = db.View(LookupPayloadGuarantees(blockID2, &actual2))
   118  			assert.NoError(t, err)
   119  			assert.Equal(t, []flow.Identifier{collID2, collID3, collID4}, actual2)
   120  		})
   121  	})
   122  }