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 }