github.com/number571/tendermint@v0.34.11-gost/light/store/db/db_test.go (about)

     1  package db
     2  
     3  import (
     4  	"sync"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/stretchr/testify/assert"
     9  	"github.com/stretchr/testify/require"
    10  
    11  	dbm "github.com/tendermint/tm-db"
    12  
    13  	"github.com/number571/tendermint/crypto"
    14  	"github.com/number571/tendermint/crypto/tmhash"
    15  	"github.com/number571/tendermint/internal/test/factory"
    16  	tmrand "github.com/number571/tendermint/libs/rand"
    17  	"github.com/number571/tendermint/types"
    18  	"github.com/number571/tendermint/version"
    19  )
    20  
    21  func TestLast_FirstLightBlockHeight(t *testing.T) {
    22  	dbStore := New(dbm.NewMemDB())
    23  
    24  	// Empty store
    25  	height, err := dbStore.LastLightBlockHeight()
    26  	require.NoError(t, err)
    27  	assert.EqualValues(t, -1, height)
    28  
    29  	height, err = dbStore.FirstLightBlockHeight()
    30  	require.NoError(t, err)
    31  	assert.EqualValues(t, -1, height)
    32  
    33  	// 1 key
    34  	err = dbStore.SaveLightBlock(randLightBlock(int64(1)))
    35  	require.NoError(t, err)
    36  
    37  	height, err = dbStore.LastLightBlockHeight()
    38  	require.NoError(t, err)
    39  	assert.EqualValues(t, 1, height)
    40  
    41  	height, err = dbStore.FirstLightBlockHeight()
    42  	require.NoError(t, err)
    43  	assert.EqualValues(t, 1, height)
    44  }
    45  
    46  func Test_SaveLightBlock(t *testing.T) {
    47  	dbStore := New(dbm.NewMemDB())
    48  
    49  	// Empty store
    50  	h, err := dbStore.LightBlock(1)
    51  	require.Error(t, err)
    52  	assert.Nil(t, h)
    53  
    54  	// 1 key
    55  	err = dbStore.SaveLightBlock(randLightBlock(1))
    56  	require.NoError(t, err)
    57  
    58  	size := dbStore.Size()
    59  	assert.Equal(t, uint16(1), size)
    60  	t.Log(size)
    61  
    62  	h, err = dbStore.LightBlock(1)
    63  	require.NoError(t, err)
    64  	assert.NotNil(t, h)
    65  
    66  	// Empty store
    67  	err = dbStore.DeleteLightBlock(1)
    68  	require.NoError(t, err)
    69  
    70  	h, err = dbStore.LightBlock(1)
    71  	require.Error(t, err)
    72  	assert.Nil(t, h)
    73  
    74  }
    75  
    76  func Test_LightBlockBefore(t *testing.T) {
    77  	dbStore := New(dbm.NewMemDB())
    78  
    79  	assert.Panics(t, func() {
    80  		_, _ = dbStore.LightBlockBefore(0)
    81  		_, _ = dbStore.LightBlockBefore(100)
    82  	})
    83  
    84  	err := dbStore.SaveLightBlock(randLightBlock(int64(2)))
    85  	require.NoError(t, err)
    86  
    87  	h, err := dbStore.LightBlockBefore(3)
    88  	require.NoError(t, err)
    89  	if assert.NotNil(t, h) {
    90  		assert.EqualValues(t, 2, h.Height)
    91  	}
    92  
    93  	_, err = dbStore.LightBlockBefore(2)
    94  	require.Error(t, err)
    95  }
    96  
    97  func Test_Prune(t *testing.T) {
    98  	dbStore := New(dbm.NewMemDB())
    99  
   100  	// Empty store
   101  	assert.EqualValues(t, 0, dbStore.Size())
   102  	err := dbStore.Prune(0)
   103  	require.NoError(t, err)
   104  
   105  	// One header
   106  	err = dbStore.SaveLightBlock(randLightBlock(2))
   107  	require.NoError(t, err)
   108  
   109  	assert.EqualValues(t, 1, dbStore.Size())
   110  
   111  	err = dbStore.Prune(1)
   112  	require.NoError(t, err)
   113  	assert.EqualValues(t, 1, dbStore.Size())
   114  
   115  	err = dbStore.Prune(0)
   116  	require.NoError(t, err)
   117  	assert.EqualValues(t, 0, dbStore.Size())
   118  
   119  	// Multiple headers
   120  	for i := 1; i <= 10; i++ {
   121  		err = dbStore.SaveLightBlock(randLightBlock(int64(i)))
   122  		require.NoError(t, err)
   123  	}
   124  
   125  	err = dbStore.Prune(11)
   126  	require.NoError(t, err)
   127  	assert.EqualValues(t, 10, dbStore.Size())
   128  
   129  	err = dbStore.Prune(7)
   130  	require.NoError(t, err)
   131  	assert.EqualValues(t, 7, dbStore.Size())
   132  }
   133  
   134  func Test_Concurrency(t *testing.T) {
   135  	dbStore := New(dbm.NewMemDB())
   136  
   137  	var wg sync.WaitGroup
   138  	for i := 1; i <= 100; i++ {
   139  		wg.Add(1)
   140  		go func(i int64) {
   141  			defer wg.Done()
   142  
   143  			err := dbStore.SaveLightBlock(randLightBlock(i))
   144  			require.NoError(t, err)
   145  
   146  			_, err = dbStore.LightBlock(i)
   147  			if err != nil {
   148  				t.Log(err)
   149  			}
   150  
   151  			if i > 2 {
   152  				_, err = dbStore.LightBlockBefore(i - 1)
   153  				if err != nil {
   154  					t.Log(err)
   155  				}
   156  			}
   157  
   158  			_, err = dbStore.LastLightBlockHeight()
   159  			if err != nil {
   160  				t.Log(err)
   161  			}
   162  			_, err = dbStore.FirstLightBlockHeight()
   163  			if err != nil {
   164  				t.Log(err)
   165  			}
   166  
   167  			err = dbStore.Prune(3)
   168  			if err != nil {
   169  				t.Log(err)
   170  			}
   171  			_ = dbStore.Size()
   172  
   173  			if i > 2 && i%2 == 0 {
   174  				err = dbStore.DeleteLightBlock(i - 1)
   175  				if err != nil {
   176  					t.Log(err)
   177  				}
   178  			}
   179  
   180  		}(int64(i))
   181  	}
   182  
   183  	wg.Wait()
   184  }
   185  
   186  func randLightBlock(height int64) *types.LightBlock {
   187  	vals, _ := factory.RandValidatorSet(2, 1)
   188  	return &types.LightBlock{
   189  		SignedHeader: &types.SignedHeader{
   190  			Header: &types.Header{
   191  				Version:            version.Consensus{Block: version.BlockProtocol, App: 0},
   192  				ChainID:            tmrand.Str(12),
   193  				Height:             height,
   194  				Time:               time.Now(),
   195  				LastBlockID:        types.BlockID{},
   196  				LastCommitHash:     crypto.CRandBytes(tmhash.Size),
   197  				DataHash:           crypto.CRandBytes(tmhash.Size),
   198  				ValidatorsHash:     crypto.CRandBytes(tmhash.Size),
   199  				NextValidatorsHash: crypto.CRandBytes(tmhash.Size),
   200  				ConsensusHash:      crypto.CRandBytes(tmhash.Size),
   201  				AppHash:            crypto.CRandBytes(tmhash.Size),
   202  				LastResultsHash:    crypto.CRandBytes(tmhash.Size),
   203  				EvidenceHash:       crypto.CRandBytes(tmhash.Size),
   204  				ProposerAddress:    crypto.CRandBytes(crypto.AddressSize),
   205  			},
   206  			Commit: &types.Commit{},
   207  		},
   208  		ValidatorSet: vals,
   209  	}
   210  }