github.com/devwanda/aphelion-staking@v0.33.9/lite2/store/db/db_test.go (about)

     1  package db
     2  
     3  import (
     4  	"sync"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/assert"
     8  	"github.com/stretchr/testify/require"
     9  
    10  	dbm "github.com/tendermint/tm-db"
    11  
    12  	"github.com/devwanda/aphelion-staking/types"
    13  )
    14  
    15  func TestLast_FirstSignedHeaderHeight(t *testing.T) {
    16  	dbStore := New(dbm.NewMemDB(), "TestLast_FirstSignedHeaderHeight")
    17  
    18  	// Empty store
    19  	height, err := dbStore.LastSignedHeaderHeight()
    20  	require.NoError(t, err)
    21  	assert.EqualValues(t, -1, height)
    22  
    23  	height, err = dbStore.FirstSignedHeaderHeight()
    24  	require.NoError(t, err)
    25  	assert.EqualValues(t, -1, height)
    26  
    27  	// 1 key
    28  	err = dbStore.SaveSignedHeaderAndValidatorSet(
    29  		&types.SignedHeader{Header: &types.Header{Height: 1}}, &types.ValidatorSet{})
    30  	require.NoError(t, err)
    31  
    32  	height, err = dbStore.LastSignedHeaderHeight()
    33  	require.NoError(t, err)
    34  	assert.EqualValues(t, 1, height)
    35  
    36  	height, err = dbStore.FirstSignedHeaderHeight()
    37  	require.NoError(t, err)
    38  	assert.EqualValues(t, 1, height)
    39  }
    40  
    41  func Test_SaveSignedHeaderAndValidatorSet(t *testing.T) {
    42  	dbStore := New(dbm.NewMemDB(), "Test_SaveSignedHeaderAndValidatorSet")
    43  
    44  	// Empty store
    45  	h, err := dbStore.SignedHeader(1)
    46  	require.Error(t, err)
    47  	assert.Nil(t, h)
    48  
    49  	valSet, err := dbStore.ValidatorSet(1)
    50  	require.Error(t, err)
    51  	assert.Nil(t, valSet)
    52  
    53  	// 1 key
    54  	err = dbStore.SaveSignedHeaderAndValidatorSet(
    55  		&types.SignedHeader{Header: &types.Header{Height: 1}}, &types.ValidatorSet{})
    56  	require.NoError(t, err)
    57  
    58  	h, err = dbStore.SignedHeader(1)
    59  	require.NoError(t, err)
    60  	assert.NotNil(t, h)
    61  
    62  	valSet, err = dbStore.ValidatorSet(1)
    63  	require.NoError(t, err)
    64  	assert.NotNil(t, valSet)
    65  
    66  	// Empty store
    67  	err = dbStore.DeleteSignedHeaderAndValidatorSet(1)
    68  	require.NoError(t, err)
    69  
    70  	h, err = dbStore.SignedHeader(1)
    71  	require.Error(t, err)
    72  	assert.Nil(t, h)
    73  
    74  	valSet, err = dbStore.ValidatorSet(1)
    75  	require.Error(t, err)
    76  	assert.Nil(t, valSet)
    77  }
    78  
    79  func Test_SignedHeaderBefore(t *testing.T) {
    80  	dbStore := New(dbm.NewMemDB(), "Test_SignedHeaderBefore")
    81  
    82  	assert.Panics(t, func() {
    83  		_, _ = dbStore.SignedHeaderBefore(0)
    84  		_, _ = dbStore.SignedHeaderBefore(100)
    85  	})
    86  
    87  	err := dbStore.SaveSignedHeaderAndValidatorSet(
    88  		&types.SignedHeader{Header: &types.Header{Height: 2}}, &types.ValidatorSet{})
    89  	require.NoError(t, err)
    90  
    91  	h, err := dbStore.SignedHeaderBefore(3)
    92  	require.NoError(t, err)
    93  	if assert.NotNil(t, h) {
    94  		assert.EqualValues(t, 2, h.Height)
    95  	}
    96  }
    97  
    98  func Test_Prune(t *testing.T) {
    99  	dbStore := New(dbm.NewMemDB(), "Test_Prune")
   100  
   101  	// Empty store
   102  	assert.EqualValues(t, 0, dbStore.Size())
   103  	err := dbStore.Prune(0)
   104  	require.NoError(t, err)
   105  
   106  	// One header
   107  	err = dbStore.SaveSignedHeaderAndValidatorSet(
   108  		&types.SignedHeader{Header: &types.Header{Height: 2}}, &types.ValidatorSet{})
   109  	require.NoError(t, err)
   110  
   111  	assert.EqualValues(t, 1, dbStore.Size())
   112  
   113  	err = dbStore.Prune(1)
   114  	require.NoError(t, err)
   115  	assert.EqualValues(t, 1, dbStore.Size())
   116  
   117  	err = dbStore.Prune(0)
   118  	require.NoError(t, err)
   119  	assert.EqualValues(t, 0, dbStore.Size())
   120  
   121  	// Multiple headers
   122  	for i := 1; i <= 10; i++ {
   123  		err = dbStore.SaveSignedHeaderAndValidatorSet(
   124  			&types.SignedHeader{Header: &types.Header{Height: int64(i)}}, &types.ValidatorSet{})
   125  		require.NoError(t, err)
   126  	}
   127  
   128  	err = dbStore.Prune(11)
   129  	require.NoError(t, err)
   130  	assert.EqualValues(t, 10, dbStore.Size())
   131  
   132  	err = dbStore.Prune(7)
   133  	require.NoError(t, err)
   134  	assert.EqualValues(t, 7, dbStore.Size())
   135  }
   136  
   137  func Test_Concurrency(t *testing.T) {
   138  	dbStore := New(dbm.NewMemDB(), "Test_Prune")
   139  
   140  	var wg sync.WaitGroup
   141  	for i := 1; i <= 100; i++ {
   142  		wg.Add(1)
   143  		go func(i int64) {
   144  			defer wg.Done()
   145  
   146  			dbStore.SaveSignedHeaderAndValidatorSet(
   147  				&types.SignedHeader{Header: &types.Header{Height: i}}, &types.ValidatorSet{})
   148  
   149  			dbStore.SignedHeader(i)
   150  			dbStore.ValidatorSet(i)
   151  			dbStore.LastSignedHeaderHeight()
   152  			dbStore.FirstSignedHeaderHeight()
   153  
   154  			dbStore.Prune(2)
   155  			_ = dbStore.Size()
   156  
   157  			dbStore.DeleteSignedHeaderAndValidatorSet(1)
   158  		}(int64(i))
   159  	}
   160  
   161  	wg.Wait()
   162  }