github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/store/tracekv/store_test.go (about) 1 package tracekv_test 2 3 import ( 4 "bytes" 5 "fmt" 6 "io" 7 "testing" 8 9 "github.com/stretchr/testify/require" 10 11 dbm "github.com/fibonacci-chain/fbc/libs/tm-db" 12 13 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/dbadapter" 14 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/prefix" 15 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/tracekv" 16 "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/store/types" 17 ) 18 19 func bz(s string) []byte { return []byte(s) } 20 21 func keyFmt(i int) []byte { return bz(fmt.Sprintf("key%0.8d", i)) } 22 func valFmt(i int) []byte { return bz(fmt.Sprintf("value%0.8d", i)) } 23 24 var kvPairs = []types.KVPair{ 25 {Key: keyFmt(1), Value: valFmt(1)}, 26 {Key: keyFmt(2), Value: valFmt(2)}, 27 {Key: keyFmt(3), Value: valFmt(3)}, 28 } 29 30 func newTraceKVStore(w io.Writer) *tracekv.Store { 31 store := newEmptyTraceKVStore(w) 32 33 for _, kvPair := range kvPairs { 34 store.Set(kvPair.Key, kvPair.Value) 35 } 36 37 return store 38 } 39 40 func newEmptyTraceKVStore(w io.Writer) *tracekv.Store { 41 memDB := dbadapter.Store{DB: dbm.NewMemDB()} 42 tc := types.TraceContext(map[string]interface{}{"blockHeight": 64}) 43 44 return tracekv.NewStore(memDB, w, tc) 45 } 46 47 func TestTraceKVStoreGet(t *testing.T) { 48 testCases := []struct { 49 key []byte 50 expectedValue []byte 51 expectedOut string 52 }{ 53 { 54 key: []byte{}, 55 expectedValue: nil, 56 expectedOut: "{\"operation\":\"read\",\"key\":\"\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n", 57 }, 58 { 59 key: kvPairs[0].Key, 60 expectedValue: kvPairs[0].Value, 61 expectedOut: "{\"operation\":\"read\",\"key\":\"a2V5MDAwMDAwMDE=\",\"value\":\"dmFsdWUwMDAwMDAwMQ==\",\"metadata\":{\"blockHeight\":64}}\n", 62 }, 63 { 64 key: []byte("does-not-exist"), 65 expectedValue: nil, 66 expectedOut: "{\"operation\":\"read\",\"key\":\"ZG9lcy1ub3QtZXhpc3Q=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n", 67 }, 68 } 69 70 for _, tc := range testCases { 71 var buf bytes.Buffer 72 73 store := newTraceKVStore(&buf) 74 buf.Reset() 75 value := store.Get(tc.key) 76 77 require.Equal(t, tc.expectedValue, value) 78 require.Equal(t, tc.expectedOut, buf.String()) 79 } 80 } 81 82 func TestTraceKVStoreSet(t *testing.T) { 83 testCases := []struct { 84 key []byte 85 value []byte 86 expectedOut string 87 }{ 88 { 89 key: []byte{}, 90 value: nil, 91 expectedOut: "{\"operation\":\"write\",\"key\":\"\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n", 92 }, 93 { 94 key: kvPairs[0].Key, 95 value: kvPairs[0].Value, 96 expectedOut: "{\"operation\":\"write\",\"key\":\"a2V5MDAwMDAwMDE=\",\"value\":\"dmFsdWUwMDAwMDAwMQ==\",\"metadata\":{\"blockHeight\":64}}\n", 97 }, 98 } 99 100 for _, tc := range testCases { 101 var buf bytes.Buffer 102 103 store := newEmptyTraceKVStore(&buf) 104 buf.Reset() 105 store.Set(tc.key, tc.value) 106 107 require.Equal(t, tc.expectedOut, buf.String()) 108 } 109 } 110 111 func TestTraceKVStoreDelete(t *testing.T) { 112 testCases := []struct { 113 key []byte 114 expectedOut string 115 }{ 116 { 117 key: []byte{}, 118 expectedOut: "{\"operation\":\"delete\",\"key\":\"\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n", 119 }, 120 { 121 key: kvPairs[0].Key, 122 expectedOut: "{\"operation\":\"delete\",\"key\":\"a2V5MDAwMDAwMDE=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n", 123 }, 124 } 125 126 for _, tc := range testCases { 127 var buf bytes.Buffer 128 129 store := newTraceKVStore(&buf) 130 buf.Reset() 131 store.Delete(tc.key) 132 133 require.Equal(t, tc.expectedOut, buf.String()) 134 } 135 } 136 137 func TestTraceKVStoreHas(t *testing.T) { 138 testCases := []struct { 139 key []byte 140 expected bool 141 }{ 142 { 143 key: []byte{}, 144 expected: false, 145 }, 146 { 147 key: kvPairs[0].Key, 148 expected: true, 149 }, 150 } 151 152 for _, tc := range testCases { 153 var buf bytes.Buffer 154 155 store := newTraceKVStore(&buf) 156 buf.Reset() 157 ok := store.Has(tc.key) 158 159 require.Equal(t, tc.expected, ok) 160 } 161 } 162 163 func TestTestTraceKVStoreIterator(t *testing.T) { 164 var buf bytes.Buffer 165 166 store := newTraceKVStore(&buf) 167 iterator := store.Iterator(nil, nil) 168 169 s, e := iterator.Domain() 170 require.Equal(t, []byte(nil), s) 171 require.Equal(t, []byte(nil), e) 172 173 testCases := []struct { 174 expectedKey []byte 175 expectedValue []byte 176 expectedKeyOut string 177 expectedvalueOut string 178 }{ 179 { 180 expectedKey: kvPairs[0].Key, 181 expectedValue: kvPairs[0].Value, 182 expectedKeyOut: "{\"operation\":\"iterKey\",\"key\":\"a2V5MDAwMDAwMDE=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n", 183 expectedvalueOut: "{\"operation\":\"iterValue\",\"key\":\"\",\"value\":\"dmFsdWUwMDAwMDAwMQ==\",\"metadata\":{\"blockHeight\":64}}\n", 184 }, 185 { 186 expectedKey: kvPairs[1].Key, 187 expectedValue: kvPairs[1].Value, 188 expectedKeyOut: "{\"operation\":\"iterKey\",\"key\":\"a2V5MDAwMDAwMDI=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n", 189 expectedvalueOut: "{\"operation\":\"iterValue\",\"key\":\"\",\"value\":\"dmFsdWUwMDAwMDAwMg==\",\"metadata\":{\"blockHeight\":64}}\n", 190 }, 191 { 192 expectedKey: kvPairs[2].Key, 193 expectedValue: kvPairs[2].Value, 194 expectedKeyOut: "{\"operation\":\"iterKey\",\"key\":\"a2V5MDAwMDAwMDM=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n", 195 expectedvalueOut: "{\"operation\":\"iterValue\",\"key\":\"\",\"value\":\"dmFsdWUwMDAwMDAwMw==\",\"metadata\":{\"blockHeight\":64}}\n", 196 }, 197 } 198 199 for _, tc := range testCases { 200 buf.Reset() 201 ka := iterator.Key() 202 require.Equal(t, tc.expectedKeyOut, buf.String()) 203 204 buf.Reset() 205 va := iterator.Value() 206 require.Equal(t, tc.expectedvalueOut, buf.String()) 207 208 require.Equal(t, tc.expectedKey, ka) 209 require.Equal(t, tc.expectedValue, va) 210 211 iterator.Next() 212 } 213 214 require.False(t, iterator.Valid()) 215 require.Panics(t, iterator.Next) 216 require.NotPanics(t, iterator.Close) 217 } 218 219 func TestTestTraceKVStoreReverseIterator(t *testing.T) { 220 var buf bytes.Buffer 221 222 store := newTraceKVStore(&buf) 223 iterator := store.ReverseIterator(nil, nil) 224 225 s, e := iterator.Domain() 226 require.Equal(t, []byte(nil), s) 227 require.Equal(t, []byte(nil), e) 228 229 testCases := []struct { 230 expectedKey []byte 231 expectedValue []byte 232 expectedKeyOut string 233 expectedvalueOut string 234 }{ 235 { 236 expectedKey: kvPairs[2].Key, 237 expectedValue: kvPairs[2].Value, 238 expectedKeyOut: "{\"operation\":\"iterKey\",\"key\":\"a2V5MDAwMDAwMDM=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n", 239 expectedvalueOut: "{\"operation\":\"iterValue\",\"key\":\"\",\"value\":\"dmFsdWUwMDAwMDAwMw==\",\"metadata\":{\"blockHeight\":64}}\n", 240 }, 241 { 242 expectedKey: kvPairs[1].Key, 243 expectedValue: kvPairs[1].Value, 244 expectedKeyOut: "{\"operation\":\"iterKey\",\"key\":\"a2V5MDAwMDAwMDI=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n", 245 expectedvalueOut: "{\"operation\":\"iterValue\",\"key\":\"\",\"value\":\"dmFsdWUwMDAwMDAwMg==\",\"metadata\":{\"blockHeight\":64}}\n", 246 }, 247 { 248 expectedKey: kvPairs[0].Key, 249 expectedValue: kvPairs[0].Value, 250 expectedKeyOut: "{\"operation\":\"iterKey\",\"key\":\"a2V5MDAwMDAwMDE=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n", 251 expectedvalueOut: "{\"operation\":\"iterValue\",\"key\":\"\",\"value\":\"dmFsdWUwMDAwMDAwMQ==\",\"metadata\":{\"blockHeight\":64}}\n", 252 }, 253 } 254 255 for _, tc := range testCases { 256 buf.Reset() 257 ka := iterator.Key() 258 require.Equal(t, tc.expectedKeyOut, buf.String()) 259 260 buf.Reset() 261 va := iterator.Value() 262 require.Equal(t, tc.expectedvalueOut, buf.String()) 263 264 require.Equal(t, tc.expectedKey, ka) 265 require.Equal(t, tc.expectedValue, va) 266 267 iterator.Next() 268 } 269 270 require.False(t, iterator.Valid()) 271 require.Panics(t, iterator.Next) 272 require.NotPanics(t, iterator.Close) 273 } 274 275 func TestTraceKVStorePrefix(t *testing.T) { 276 store := newEmptyTraceKVStore(nil) 277 pStore := prefix.NewStore(store, []byte("trace_prefix")) 278 require.IsType(t, prefix.Store{}, pStore) 279 } 280 281 func TestTraceKVStoreGetStoreType(t *testing.T) { 282 memDB := dbadapter.Store{DB: dbm.NewMemDB()} 283 store := newEmptyTraceKVStore(nil) 284 require.Equal(t, memDB.GetStoreType(), store.GetStoreType()) 285 } 286 287 func TestTraceKVStoreCacheWrap(t *testing.T) { 288 store := newEmptyTraceKVStore(nil) 289 require.Panics(t, func() { store.CacheWrap() }) 290 } 291 func TestTraceKVStoreCacheWrapWithTrace(t *testing.T) { 292 store := newEmptyTraceKVStore(nil) 293 require.Panics(t, func() { store.CacheWrapWithTrace(nil, nil) }) 294 }