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  }