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 }