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 }