github.com/MetalBlockchain/metalgo@v1.11.9/snow/engine/snowman/bootstrap/interval/blocks_test.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package interval
     5  
     6  import (
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/require"
    10  
    11  	"github.com/MetalBlockchain/metalgo/database"
    12  	"github.com/MetalBlockchain/metalgo/database/memdb"
    13  )
    14  
    15  func TestAdd(t *testing.T) {
    16  	tests := []struct {
    17  		name                 string
    18  		existing             []uint64
    19  		lastAcceptedHeight   uint64
    20  		height               uint64
    21  		blkBytes             []byte
    22  		expectedToPersist    bool
    23  		expectedToWantParent bool
    24  	}{
    25  		{
    26  			name:                 "height already accepted",
    27  			lastAcceptedHeight:   1,
    28  			height:               1,
    29  			blkBytes:             []byte{1},
    30  			expectedToPersist:    false,
    31  			expectedToWantParent: false,
    32  		},
    33  		{
    34  			name:                 "height already added",
    35  			existing:             []uint64{1},
    36  			lastAcceptedHeight:   0,
    37  			height:               1,
    38  			blkBytes:             []byte{1},
    39  			expectedToPersist:    false,
    40  			expectedToWantParent: false,
    41  		},
    42  		{
    43  			name:                 "next block is desired",
    44  			lastAcceptedHeight:   0,
    45  			height:               2,
    46  			blkBytes:             []byte{2},
    47  			expectedToPersist:    true,
    48  			expectedToWantParent: true,
    49  		},
    50  		{
    51  			name:                 "next block is accepted",
    52  			lastAcceptedHeight:   0,
    53  			height:               1,
    54  			blkBytes:             []byte{1},
    55  			expectedToPersist:    true,
    56  			expectedToWantParent: false,
    57  		},
    58  		{
    59  			name:                 "next block already added",
    60  			existing:             []uint64{1},
    61  			lastAcceptedHeight:   0,
    62  			height:               2,
    63  			blkBytes:             []byte{2},
    64  			expectedToPersist:    true,
    65  			expectedToWantParent: false,
    66  		},
    67  	}
    68  	for _, test := range tests {
    69  		t.Run(test.name, func(t *testing.T) {
    70  			require := require.New(t)
    71  
    72  			db := memdb.New()
    73  			tree, err := NewTree(db)
    74  			require.NoError(err)
    75  			for _, add := range test.existing {
    76  				require.NoError(tree.Add(db, add))
    77  			}
    78  
    79  			wantsParent, err := Add(
    80  				db,
    81  				tree,
    82  				test.lastAcceptedHeight,
    83  				test.height,
    84  				test.blkBytes,
    85  			)
    86  			require.NoError(err)
    87  			require.Equal(test.expectedToWantParent, wantsParent)
    88  
    89  			blkBytes, err := GetBlock(db, test.height)
    90  			if test.expectedToPersist {
    91  				require.NoError(err)
    92  				require.Equal(test.blkBytes, blkBytes)
    93  				require.True(tree.Contains(test.height))
    94  			} else {
    95  				require.ErrorIs(err, database.ErrNotFound)
    96  			}
    97  		})
    98  	}
    99  }
   100  
   101  func TestRemove(t *testing.T) {
   102  	require := require.New(t)
   103  
   104  	db := memdb.New()
   105  	tree, err := NewTree(db)
   106  	require.NoError(err)
   107  	lastAcceptedHeight := uint64(1)
   108  	height := uint64(5)
   109  	blkBytes := []byte{5}
   110  
   111  	_, err = Add(
   112  		db,
   113  		tree,
   114  		lastAcceptedHeight,
   115  		height,
   116  		blkBytes,
   117  	)
   118  	require.NoError(err)
   119  
   120  	// Verify that the database has the block.
   121  	storedBlkBytes, err := GetBlock(db, height)
   122  	require.NoError(err)
   123  	require.Equal(blkBytes, storedBlkBytes)
   124  	require.Equal(uint64(1), tree.Len())
   125  
   126  	require.NoError(Remove(
   127  		db,
   128  		tree,
   129  		height,
   130  	))
   131  	require.Zero(tree.Len())
   132  
   133  	// Verify that the database no longer contains the block.
   134  	_, err = GetBlock(db, height)
   135  	require.ErrorIs(err, database.ErrNotFound)
   136  	require.Zero(tree.Len())
   137  }