github.com/adoriasoft/tendermint@v0.34.0-dev1.0.20200722151356-96d84601a75a/light/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/tendermint/tendermint/crypto"
    13  	tmrand "github.com/tendermint/tendermint/libs/rand"
    14  	"github.com/tendermint/tendermint/types"
    15  )
    16  
    17  func TestLast_FirstSignedHeaderHeight(t *testing.T) {
    18  	dbStore := New(dbm.NewMemDB(), "TestLast_FirstSignedHeaderHeight")
    19  	vals, _ := types.RandValidatorSet(10, 100)
    20  
    21  	// Empty store
    22  	height, err := dbStore.LastSignedHeaderHeight()
    23  	require.NoError(t, err)
    24  	assert.EqualValues(t, -1, height)
    25  
    26  	height, err = dbStore.FirstSignedHeaderHeight()
    27  	require.NoError(t, err)
    28  	assert.EqualValues(t, -1, height)
    29  
    30  	// 1 key
    31  	err = dbStore.SaveSignedHeaderAndValidatorSet(
    32  		&types.SignedHeader{Header: &types.Header{Height: 1}}, vals)
    33  	require.NoError(t, err)
    34  
    35  	height, err = dbStore.LastSignedHeaderHeight()
    36  	require.NoError(t, err)
    37  	assert.EqualValues(t, 1, height)
    38  
    39  	height, err = dbStore.FirstSignedHeaderHeight()
    40  	require.NoError(t, err)
    41  	assert.EqualValues(t, 1, height)
    42  }
    43  
    44  func Test_SaveSignedHeaderAndValidatorSet(t *testing.T) {
    45  	dbStore := New(dbm.NewMemDB(), "Test_SaveSignedHeaderAndValidatorSet")
    46  	vals, _ := types.RandValidatorSet(10, 100)
    47  	// Empty store
    48  	h, err := dbStore.SignedHeader(1)
    49  	require.Error(t, err)
    50  	assert.Nil(t, h)
    51  
    52  	valSet, err := dbStore.ValidatorSet(1)
    53  	require.Error(t, err)
    54  	assert.Nil(t, valSet)
    55  
    56  	// 1 key
    57  	pa := vals.Validators[0].Address
    58  	err = dbStore.SaveSignedHeaderAndValidatorSet(
    59  		&types.SignedHeader{Header: &types.Header{Height: 1, ProposerAddress: pa}}, vals)
    60  	require.NoError(t, err)
    61  
    62  	h, err = dbStore.SignedHeader(1)
    63  	require.NoError(t, err)
    64  	assert.NotNil(t, h)
    65  
    66  	valSet, err = dbStore.ValidatorSet(1)
    67  	require.NoError(t, err)
    68  	assert.NotNil(t, valSet)
    69  
    70  	// Empty store
    71  	err = dbStore.DeleteSignedHeaderAndValidatorSet(1)
    72  	require.NoError(t, err)
    73  
    74  	h, err = dbStore.SignedHeader(1)
    75  	require.Error(t, err)
    76  	assert.Nil(t, h)
    77  
    78  	valSet, err = dbStore.ValidatorSet(1)
    79  	require.Error(t, err)
    80  	assert.Nil(t, valSet)
    81  }
    82  
    83  func Test_SignedHeaderBefore(t *testing.T) {
    84  	dbStore := New(dbm.NewMemDB(), "Test_SignedHeaderBefore")
    85  	valSet, _ := types.RandValidatorSet(10, 100)
    86  	pa := valSet.Proposer.Address
    87  
    88  	assert.Panics(t, func() {
    89  		_, _ = dbStore.SignedHeaderBefore(0)
    90  		_, _ = dbStore.SignedHeaderBefore(100)
    91  	})
    92  
    93  	err := dbStore.SaveSignedHeaderAndValidatorSet(
    94  		&types.SignedHeader{Header: &types.Header{Height: 2, ProposerAddress: pa}}, valSet)
    95  	require.NoError(t, err)
    96  
    97  	h, err := dbStore.SignedHeaderBefore(3)
    98  	require.NoError(t, err)
    99  	if assert.NotNil(t, h) {
   100  		assert.EqualValues(t, 2, h.Height)
   101  	}
   102  }
   103  
   104  func Test_Prune(t *testing.T) {
   105  	dbStore := New(dbm.NewMemDB(), "Test_Prune")
   106  	valSet, _ := types.RandValidatorSet(10, 100)
   107  
   108  	// Empty store
   109  	assert.EqualValues(t, 0, dbStore.Size())
   110  	err := dbStore.Prune(0)
   111  	require.NoError(t, err)
   112  
   113  	// One header
   114  	err = dbStore.SaveSignedHeaderAndValidatorSet(
   115  		&types.SignedHeader{Header: &types.Header{Height: 2}}, valSet)
   116  	require.NoError(t, err)
   117  
   118  	assert.EqualValues(t, 1, dbStore.Size())
   119  
   120  	err = dbStore.Prune(1)
   121  	require.NoError(t, err)
   122  	assert.EqualValues(t, 1, dbStore.Size())
   123  
   124  	err = dbStore.Prune(0)
   125  	require.NoError(t, err)
   126  	assert.EqualValues(t, 0, dbStore.Size())
   127  
   128  	// Multiple headers
   129  	for i := 1; i <= 10; i++ {
   130  		err = dbStore.SaveSignedHeaderAndValidatorSet(
   131  			&types.SignedHeader{Header: &types.Header{Height: int64(i)}}, valSet)
   132  		require.NoError(t, err)
   133  	}
   134  
   135  	err = dbStore.Prune(11)
   136  	require.NoError(t, err)
   137  	assert.EqualValues(t, 10, dbStore.Size())
   138  
   139  	err = dbStore.Prune(7)
   140  	require.NoError(t, err)
   141  	assert.EqualValues(t, 7, dbStore.Size())
   142  }
   143  
   144  func Test_Concurrency(t *testing.T) {
   145  	dbStore := New(dbm.NewMemDB(), "Test_Prune")
   146  	vals, _ := types.RandValidatorSet(10, 100)
   147  
   148  	var wg sync.WaitGroup
   149  	for i := 1; i <= 100; i++ {
   150  		wg.Add(1)
   151  		go func(i int64) {
   152  			defer wg.Done()
   153  
   154  			err := dbStore.SaveSignedHeaderAndValidatorSet(
   155  				&types.SignedHeader{Header: &types.Header{Height: i,
   156  					ProposerAddress: tmrand.Bytes(crypto.AddressSize)}}, vals)
   157  			require.NoError(t, err)
   158  
   159  			_, err = dbStore.SignedHeader(i)
   160  			if err != nil {
   161  				t.Log(err)
   162  			}
   163  			_, err = dbStore.ValidatorSet(i)
   164  			if err != nil {
   165  				t.Log(err) // could not find validator set
   166  			}
   167  			_, err = dbStore.LastSignedHeaderHeight()
   168  			if err != nil {
   169  				t.Log(err)
   170  			}
   171  			_, err = dbStore.FirstSignedHeaderHeight()
   172  			if err != nil {
   173  				t.Log(err)
   174  			}
   175  
   176  			err = dbStore.Prune(2)
   177  			if err != nil {
   178  				t.Log(err)
   179  			}
   180  			_ = dbStore.Size()
   181  
   182  			err = dbStore.DeleteSignedHeaderAndValidatorSet(1)
   183  			if err != nil {
   184  				t.Log(err)
   185  			}
   186  		}(int64(i))
   187  	}
   188  
   189  	wg.Wait()
   190  }