github.com/dim4egster/coreth@v0.10.2/plugin/evm/tx_heap_test.go (about)

     1  // (c) 2019-2021, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package evm
     5  
     6  import (
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  )
    11  
    12  func TestTxHeap(t *testing.T) {
    13  	var (
    14  		tx0 = &Tx{
    15  			UnsignedAtomicTx: &UnsignedImportTx{
    16  				NetworkID: 0,
    17  			},
    18  		}
    19  		tx0Bytes = []byte{0}
    20  
    21  		tx1 = &Tx{
    22  			UnsignedAtomicTx: &UnsignedImportTx{
    23  				NetworkID: 1,
    24  			},
    25  		}
    26  		tx1Bytes = []byte{1}
    27  
    28  		tx2 = &Tx{
    29  			UnsignedAtomicTx: &UnsignedImportTx{
    30  				NetworkID: 2,
    31  			},
    32  		}
    33  		tx2Bytes = []byte{2}
    34  	)
    35  	tx0.Initialize(tx0Bytes, tx0Bytes)
    36  	tx1.Initialize(tx1Bytes, tx1Bytes)
    37  	tx2.Initialize(tx2Bytes, tx2Bytes)
    38  
    39  	id0 := tx0.ID()
    40  	id1 := tx1.ID()
    41  	id2 := tx2.ID()
    42  
    43  	t.Run("add/remove single entry", func(t *testing.T) {
    44  		h := newTxHeap(3)
    45  		assert.Zero(t, h.Len())
    46  
    47  		assert := assert.New(t)
    48  		h.Push(tx0, 5)
    49  		assert.True(h.Has(id0))
    50  		gTx0, gHas0 := h.Get(id0)
    51  		assert.Equal(tx0, gTx0)
    52  		assert.True(gHas0)
    53  		h.Remove(id0)
    54  		assert.False(h.Has(id0))
    55  		assert.Zero(h.Len())
    56  		h.Push(tx0, 5)
    57  		assert.True(h.Has(id0))
    58  		assert.Equal(1, h.Len())
    59  	})
    60  
    61  	t.Run("add other items", func(t *testing.T) {
    62  		h := newTxHeap(3)
    63  		assert.Zero(t, h.Len())
    64  
    65  		assert := assert.New(t)
    66  		h.Push(tx1, 10)
    67  		assert.True(h.Has(id1))
    68  		gTx1, gHas1 := h.Get(id1)
    69  		assert.Equal(tx1, gTx1)
    70  		assert.True(gHas1)
    71  
    72  		h.Push(tx2, 2)
    73  		assert.True(h.Has(id2))
    74  		gTx2, gHas2 := h.Get(id2)
    75  		assert.Equal(tx2, gTx2)
    76  		assert.True(gHas2)
    77  
    78  		assert.Equal(id1, h.PopMax().ID())
    79  		assert.Equal(id2, h.PopMax().ID())
    80  
    81  		assert.False(h.Has(id0))
    82  		gTx0, gHas0 := h.Get(id0)
    83  		assert.Nil(gTx0)
    84  		assert.False(gHas0)
    85  
    86  		assert.False(h.Has(id1))
    87  		gTx1, gHas1 = h.Get(id1)
    88  		assert.Nil(gTx1)
    89  		assert.False(gHas1)
    90  
    91  		assert.False(h.Has(id2))
    92  		gTx2, gHas2 = h.Get(id2)
    93  		assert.Nil(gTx2)
    94  		assert.False(gHas2)
    95  	})
    96  
    97  	verifyRemovalOrder := func(t *testing.T, h *txHeap) {
    98  		t.Helper()
    99  
   100  		assert := assert.New(t)
   101  		assert.Equal(id2, h.PopMin().ID())
   102  		assert.True(h.Has(id0))
   103  		assert.True(h.Has(id1))
   104  		assert.False(h.Has(id2))
   105  		assert.Equal(id0, h.PopMin().ID())
   106  		assert.False(h.Has(id0))
   107  		assert.True(h.Has(id1))
   108  		assert.False(h.Has(id2))
   109  		assert.Equal(id1, h.PopMin().ID())
   110  		assert.False(h.Has(id0))
   111  		assert.False(h.Has(id1))
   112  		assert.False(h.Has(id2))
   113  	}
   114  
   115  	t.Run("drop", func(t *testing.T) {
   116  		h := newTxHeap(3)
   117  		assert.Zero(t, h.Len())
   118  
   119  		h.Push(tx0, 5)
   120  		h.Push(tx1, 10)
   121  		h.Push(tx2, 2)
   122  		verifyRemovalOrder(t, h)
   123  	})
   124  	t.Run("drop (alt order)", func(t *testing.T) {
   125  		h := newTxHeap(3)
   126  		assert.Zero(t, h.Len())
   127  
   128  		h.Push(tx0, 5)
   129  		h.Push(tx2, 2)
   130  		h.Push(tx1, 10)
   131  		verifyRemovalOrder(t, h)
   132  	})
   133  	t.Run("drop (alt order 2)", func(t *testing.T) {
   134  		h := newTxHeap(3)
   135  		assert.Zero(t, h.Len())
   136  
   137  		h.Push(tx2, 2)
   138  		h.Push(tx0, 5)
   139  		h.Push(tx1, 10)
   140  		verifyRemovalOrder(t, h)
   141  	})
   142  }