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 }