github.com/ava-labs/avalanchego@v1.11.11/vms/proposervm/tree/tree_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 tree
     5  
     6  import (
     7  	"context"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/require"
    11  
    12  	"github.com/ava-labs/avalanchego/snow/consensus/snowman/snowmantest"
    13  	"github.com/ava-labs/avalanchego/snow/snowtest"
    14  )
    15  
    16  func TestAcceptSingleBlock(t *testing.T) {
    17  	require := require.New(t)
    18  
    19  	tr := New()
    20  
    21  	block := snowmantest.BuildChild(snowmantest.Genesis)
    22  	_, contains := tr.Get(block)
    23  	require.False(contains)
    24  
    25  	tr.Add(block)
    26  
    27  	_, contains = tr.Get(block)
    28  	require.True(contains)
    29  
    30  	require.NoError(tr.Accept(context.Background(), block))
    31  	require.Equal(snowtest.Accepted, block.Status)
    32  
    33  	_, contains = tr.Get(block)
    34  	require.False(contains)
    35  }
    36  
    37  func TestAcceptBlockConflict(t *testing.T) {
    38  	require := require.New(t)
    39  
    40  	tr := New()
    41  
    42  	blockToAccept := snowmantest.BuildChild(snowmantest.Genesis)
    43  	blockToReject := snowmantest.BuildChild(snowmantest.Genesis)
    44  
    45  	// add conflicting blocks
    46  	tr.Add(blockToAccept)
    47  	_, contains := tr.Get(blockToAccept)
    48  	require.True(contains)
    49  
    50  	tr.Add(blockToReject)
    51  	_, contains = tr.Get(blockToReject)
    52  	require.True(contains)
    53  
    54  	// accept one of them
    55  	require.NoError(tr.Accept(context.Background(), blockToAccept))
    56  
    57  	// check their statuses and that they are removed from the tree
    58  	require.Equal(snowtest.Accepted, blockToAccept.Status)
    59  	_, contains = tr.Get(blockToAccept)
    60  	require.False(contains)
    61  
    62  	require.Equal(snowtest.Rejected, blockToReject.Status)
    63  	_, contains = tr.Get(blockToReject)
    64  	require.False(contains)
    65  }
    66  
    67  func TestAcceptChainConflict(t *testing.T) {
    68  	require := require.New(t)
    69  
    70  	tr := New()
    71  
    72  	blockToAccept := snowmantest.BuildChild(snowmantest.Genesis)
    73  	blockToReject := snowmantest.BuildChild(snowmantest.Genesis)
    74  	blockToRejectChild := snowmantest.BuildChild(blockToReject)
    75  
    76  	// add conflicting blocks.
    77  	tr.Add(blockToAccept)
    78  	_, contains := tr.Get(blockToAccept)
    79  	require.True(contains)
    80  
    81  	tr.Add(blockToReject)
    82  	_, contains = tr.Get(blockToReject)
    83  	require.True(contains)
    84  
    85  	tr.Add(blockToRejectChild)
    86  	_, contains = tr.Get(blockToRejectChild)
    87  	require.True(contains)
    88  
    89  	// accept one of them
    90  	require.NoError(tr.Accept(context.Background(), blockToAccept))
    91  
    92  	// check their statuses and whether they are removed from tree
    93  	require.Equal(snowtest.Accepted, blockToAccept.Status)
    94  	_, contains = tr.Get(blockToAccept)
    95  	require.False(contains)
    96  
    97  	require.Equal(snowtest.Rejected, blockToReject.Status)
    98  	_, contains = tr.Get(blockToReject)
    99  	require.False(contains)
   100  
   101  	require.Equal(snowtest.Rejected, blockToRejectChild.Status)
   102  	_, contains = tr.Get(blockToRejectChild)
   103  	require.False(contains)
   104  }