github.com/cosmos/cosmos-sdk@v0.50.10/testutil/sims/simulation_helpers_test.go (about) 1 package sims 2 3 import ( 4 "fmt" 5 "testing" 6 7 dbm "github.com/cosmos/cosmos-db" 8 "github.com/stretchr/testify/require" 9 "gotest.tools/v3/assert" 10 11 "cosmossdk.io/log" 12 "cosmossdk.io/store/metrics" 13 "cosmossdk.io/store/rootmulti" 14 storetypes "cosmossdk.io/store/types" 15 16 "github.com/cosmos/cosmos-sdk/codec" 17 "github.com/cosmos/cosmos-sdk/types/kv" 18 "github.com/cosmos/cosmos-sdk/types/simulation" 19 authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" 20 ) 21 22 func TestGetSimulationLog(t *testing.T) { 23 legacyAmino := codec.NewLegacyAmino() 24 decoders := make(simulation.StoreDecoderRegistry) 25 decoders[authtypes.StoreKey] = func(kvAs, kvBs kv.Pair) string { return "10" } 26 27 tests := []struct { 28 store string 29 kvPairs []kv.Pair 30 expectedLog string 31 }{ 32 { 33 "Empty", 34 []kv.Pair{{}}, 35 "", 36 }, 37 { 38 authtypes.StoreKey, 39 []kv.Pair{{Key: authtypes.GlobalAccountNumberKey, Value: legacyAmino.MustMarshal(uint64(10))}}, 40 "10", 41 }, 42 { 43 "OtherStore", 44 []kv.Pair{{Key: []byte("key"), Value: []byte("value")}}, 45 fmt.Sprintf("store A %X => %X\nstore B %X => %X\n", []byte("key"), []byte("value"), []byte("key"), []byte("value")), 46 }, 47 } 48 49 for _, tt := range tests { 50 tt := tt 51 t.Run(tt.store, func(t *testing.T) { 52 require.Equal(t, tt.expectedLog, GetSimulationLog(tt.store, decoders, tt.kvPairs, tt.kvPairs), tt.store) 53 }) 54 } 55 } 56 57 func TestDiffKVStores(t *testing.T) { 58 store1, store2 := initTestStores(t) 59 // Two equal stores 60 k1, v1 := []byte("k1"), []byte("v1") 61 store1.Set(k1, v1) 62 store2.Set(k1, v1) 63 64 checkDiffResults(t, store1, store2, true, nil) 65 66 // delete k1 from store2, which is now empty 67 store2.Delete(k1) 68 checkDiffResults(t, store1, store2, false, nil) 69 70 // set k1 in store2, different value than what store1 holds for k1 71 v2 := []byte("v2") 72 store2.Set(k1, v2) 73 checkDiffResults(t, store1, store2, false, nil) 74 75 // add k2 to store2 76 k2 := []byte("k2") 77 store2.Set(k2, v2) 78 checkDiffResults(t, store1, store2, false, nil) 79 80 // add k3 to store1 81 k3 := []byte("k3") 82 store1.Set(k3, v2) 83 checkDiffResults(t, store1, store2, false, nil) 84 85 // Reset stores 86 store1.Delete(k1) 87 store1.Delete(k3) 88 store2.Delete(k1) 89 store2.Delete(k2) 90 91 // Same keys, different value. Comparisons will be nil as prefixes are skipped. 92 prefix := []byte("prefix:") 93 k1Prefixed := append(prefix, k1...) 94 store1.Set(k1Prefixed, v1) 95 store2.Set(k1Prefixed, v2) 96 checkDiffResults(t, store1, store2, true, [][]byte{prefix}) 97 } 98 99 func checkDiffResults(t *testing.T, store1, store2 storetypes.KVStore, noDiff bool, skipPrefixes [][]byte) { 100 t.Helper() 101 102 kvAs1, kvBs1 := DiffKVStores(store1, store2, skipPrefixes) 103 104 if noDiff { 105 assert.Assert(t, len(kvAs1) == 0) 106 assert.Assert(t, len(kvBs1) == 0) 107 } else { 108 assert.Assert(t, len(kvAs1) > 0 || len(kvBs1) > 0) 109 } 110 } 111 112 func initTestStores(t *testing.T) (storetypes.KVStore, storetypes.KVStore) { 113 db := dbm.NewMemDB() 114 ms := rootmulti.NewStore(db, log.NewNopLogger(), metrics.NewNoOpMetrics()) 115 116 key1 := storetypes.NewKVStoreKey("store1") 117 key2 := storetypes.NewKVStoreKey("store2") 118 require.NotPanics(t, func() { ms.MountStoreWithDB(key1, storetypes.StoreTypeIAVL, db) }) 119 require.NotPanics(t, func() { ms.MountStoreWithDB(key2, storetypes.StoreTypeIAVL, db) }) 120 require.NotPanics(t, func() { ms.LoadLatestVersion() }) 121 return ms.GetKVStore(key1), ms.GetKVStore(key2) 122 }