github.com/Finschia/finschia-sdk@v0.48.1/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/tendermint/tm-db" 12 13 "github.com/Finschia/finschia-sdk/store/dbadapter" 14 "github.com/Finschia/finschia-sdk/store/prefix" 15 "github.com/Finschia/finschia-sdk/store/tracekv" 16 "github.com/Finschia/finschia-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 dbm := dbadapter.Store{DB: dbm.NewMemDB()} 42 tc := types.TraceContext(map[string]interface{}{"blockHeight": 64}) 43 44 return tracekv.NewStore(dbm, 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: kvPairs[0].Key, 55 expectedValue: kvPairs[0].Value, 56 expectedOut: "{\"operation\":\"read\",\"key\":\"a2V5MDAwMDAwMDE=\",\"value\":\"dmFsdWUwMDAwMDAwMQ==\",\"metadata\":{\"blockHeight\":64}}\n", 57 }, 58 { 59 key: []byte("does-not-exist"), 60 expectedValue: nil, 61 expectedOut: "{\"operation\":\"read\",\"key\":\"ZG9lcy1ub3QtZXhpc3Q=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n", 62 }, 63 } 64 65 for _, tc := range testCases { 66 var buf bytes.Buffer 67 68 store := newTraceKVStore(&buf) 69 buf.Reset() 70 value := store.Get(tc.key) 71 72 require.Equal(t, tc.expectedValue, value) 73 require.Equal(t, tc.expectedOut, buf.String()) 74 } 75 } 76 77 func TestTraceKVStoreSet(t *testing.T) { 78 testCases := []struct { 79 key []byte 80 value []byte 81 expectedOut string 82 }{ 83 { 84 key: kvPairs[0].Key, 85 value: kvPairs[0].Value, 86 expectedOut: "{\"operation\":\"write\",\"key\":\"a2V5MDAwMDAwMDE=\",\"value\":\"dmFsdWUwMDAwMDAwMQ==\",\"metadata\":{\"blockHeight\":64}}\n", 87 }, 88 { 89 key: kvPairs[1].Key, 90 value: kvPairs[1].Value, 91 expectedOut: "{\"operation\":\"write\",\"key\":\"a2V5MDAwMDAwMDI=\",\"value\":\"dmFsdWUwMDAwMDAwMg==\",\"metadata\":{\"blockHeight\":64}}\n", 92 }, 93 { 94 key: kvPairs[2].Key, 95 value: kvPairs[2].Value, 96 expectedOut: "{\"operation\":\"write\",\"key\":\"a2V5MDAwMDAwMDM=\",\"value\":\"dmFsdWUwMDAwMDAwMw==\",\"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 var buf bytes.Buffer 111 store := newEmptyTraceKVStore(&buf) 112 require.Panics(t, func() { store.Set([]byte(""), []byte("value")) }, "setting an empty key should panic") 113 require.Panics(t, func() { store.Set(nil, []byte("value")) }, "setting a nil key should panic") 114 } 115 116 func TestTraceKVStoreDelete(t *testing.T) { 117 testCases := []struct { 118 key []byte 119 expectedOut string 120 }{ 121 { 122 key: kvPairs[0].Key, 123 expectedOut: "{\"operation\":\"delete\",\"key\":\"a2V5MDAwMDAwMDE=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n", 124 }, 125 } 126 127 for _, tc := range testCases { 128 var buf bytes.Buffer 129 130 store := newTraceKVStore(&buf) 131 buf.Reset() 132 store.Delete(tc.key) 133 134 require.Equal(t, tc.expectedOut, buf.String()) 135 } 136 } 137 138 func TestTraceKVStoreHas(t *testing.T) { 139 testCases := []struct { 140 key []byte 141 expected bool 142 }{ 143 { 144 key: kvPairs[0].Key, 145 expected: true, 146 }, 147 } 148 149 for _, tc := range testCases { 150 var buf bytes.Buffer 151 152 store := newTraceKVStore(&buf) 153 buf.Reset() 154 ok := store.Has(tc.key) 155 156 require.Equal(t, tc.expected, ok) 157 } 158 } 159 160 func TestTestTraceKVStoreIterator(t *testing.T) { 161 var buf bytes.Buffer 162 163 store := newTraceKVStore(&buf) 164 iterator := store.Iterator(nil, nil) 165 166 s, e := iterator.Domain() 167 require.Equal(t, []byte(nil), s) 168 require.Equal(t, []byte(nil), e) 169 170 testCases := []struct { 171 expectedKey []byte 172 expectedValue []byte 173 expectedKeyOut string 174 expectedvalueOut string 175 }{ 176 { 177 expectedKey: kvPairs[0].Key, 178 expectedValue: kvPairs[0].Value, 179 expectedKeyOut: "{\"operation\":\"iterKey\",\"key\":\"a2V5MDAwMDAwMDE=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n", 180 expectedvalueOut: "{\"operation\":\"iterValue\",\"key\":\"\",\"value\":\"dmFsdWUwMDAwMDAwMQ==\",\"metadata\":{\"blockHeight\":64}}\n", 181 }, 182 { 183 expectedKey: kvPairs[1].Key, 184 expectedValue: kvPairs[1].Value, 185 expectedKeyOut: "{\"operation\":\"iterKey\",\"key\":\"a2V5MDAwMDAwMDI=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n", 186 expectedvalueOut: "{\"operation\":\"iterValue\",\"key\":\"\",\"value\":\"dmFsdWUwMDAwMDAwMg==\",\"metadata\":{\"blockHeight\":64}}\n", 187 }, 188 { 189 expectedKey: kvPairs[2].Key, 190 expectedValue: kvPairs[2].Value, 191 expectedKeyOut: "{\"operation\":\"iterKey\",\"key\":\"a2V5MDAwMDAwMDM=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n", 192 expectedvalueOut: "{\"operation\":\"iterValue\",\"key\":\"\",\"value\":\"dmFsdWUwMDAwMDAwMw==\",\"metadata\":{\"blockHeight\":64}}\n", 193 }, 194 } 195 196 for _, tc := range testCases { 197 buf.Reset() 198 ka := iterator.Key() 199 require.Equal(t, tc.expectedKeyOut, buf.String()) 200 201 buf.Reset() 202 va := iterator.Value() 203 require.Equal(t, tc.expectedvalueOut, buf.String()) 204 205 require.Equal(t, tc.expectedKey, ka) 206 require.Equal(t, tc.expectedValue, va) 207 208 iterator.Next() 209 } 210 211 require.False(t, iterator.Valid()) 212 require.Panics(t, iterator.Next) 213 require.NoError(t, iterator.Close()) 214 } 215 216 func TestTestTraceKVStoreReverseIterator(t *testing.T) { 217 var buf bytes.Buffer 218 219 store := newTraceKVStore(&buf) 220 iterator := store.ReverseIterator(nil, nil) 221 222 s, e := iterator.Domain() 223 require.Equal(t, []byte(nil), s) 224 require.Equal(t, []byte(nil), e) 225 226 testCases := []struct { 227 expectedKey []byte 228 expectedValue []byte 229 expectedKeyOut string 230 expectedvalueOut string 231 }{ 232 { 233 expectedKey: kvPairs[2].Key, 234 expectedValue: kvPairs[2].Value, 235 expectedKeyOut: "{\"operation\":\"iterKey\",\"key\":\"a2V5MDAwMDAwMDM=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n", 236 expectedvalueOut: "{\"operation\":\"iterValue\",\"key\":\"\",\"value\":\"dmFsdWUwMDAwMDAwMw==\",\"metadata\":{\"blockHeight\":64}}\n", 237 }, 238 { 239 expectedKey: kvPairs[1].Key, 240 expectedValue: kvPairs[1].Value, 241 expectedKeyOut: "{\"operation\":\"iterKey\",\"key\":\"a2V5MDAwMDAwMDI=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n", 242 expectedvalueOut: "{\"operation\":\"iterValue\",\"key\":\"\",\"value\":\"dmFsdWUwMDAwMDAwMg==\",\"metadata\":{\"blockHeight\":64}}\n", 243 }, 244 { 245 expectedKey: kvPairs[0].Key, 246 expectedValue: kvPairs[0].Value, 247 expectedKeyOut: "{\"operation\":\"iterKey\",\"key\":\"a2V5MDAwMDAwMDE=\",\"value\":\"\",\"metadata\":{\"blockHeight\":64}}\n", 248 expectedvalueOut: "{\"operation\":\"iterValue\",\"key\":\"\",\"value\":\"dmFsdWUwMDAwMDAwMQ==\",\"metadata\":{\"blockHeight\":64}}\n", 249 }, 250 } 251 252 for _, tc := range testCases { 253 buf.Reset() 254 ka := iterator.Key() 255 require.Equal(t, tc.expectedKeyOut, buf.String()) 256 257 buf.Reset() 258 va := iterator.Value() 259 require.Equal(t, tc.expectedvalueOut, buf.String()) 260 261 require.Equal(t, tc.expectedKey, ka) 262 require.Equal(t, tc.expectedValue, va) 263 264 iterator.Next() 265 } 266 267 require.False(t, iterator.Valid()) 268 require.Panics(t, iterator.Next) 269 require.NoError(t, iterator.Close()) 270 } 271 272 func TestTraceKVStorePrefix(t *testing.T) { 273 store := newEmptyTraceKVStore(nil) 274 pStore := prefix.NewStore(store, []byte("trace_prefix")) 275 require.IsType(t, prefix.Store{}, pStore) 276 } 277 278 func TestTraceKVStoreGetStoreType(t *testing.T) { 279 dbm := dbadapter.Store{DB: dbm.NewMemDB()} 280 store := newEmptyTraceKVStore(nil) 281 require.Equal(t, dbm.GetStoreType(), store.GetStoreType()) 282 } 283 284 func TestTraceKVStoreCacheWrap(t *testing.T) { 285 store := newEmptyTraceKVStore(nil) 286 require.Panics(t, func() { store.CacheWrap() }) 287 } 288 289 func TestTraceKVStoreCacheWrapWithTrace(t *testing.T) { 290 store := newEmptyTraceKVStore(nil) 291 require.Panics(t, func() { store.CacheWrapWithTrace(nil, nil) }) 292 } 293 294 func TestTraceKVStoreCacheWrapWithListeners(t *testing.T) { 295 store := newEmptyTraceKVStore(nil) 296 require.Panics(t, func() { store.CacheWrapWithListeners(nil, nil) }) 297 }