From 46b75563a0dec4c07d7e622c1e919cdccfa37e6f Mon Sep 17 00:00:00 2001 From: Facundo Medica <14063057+facundomedica@users.noreply.github.com> Date: Wed, 26 Jul 2023 13:05:04 +0200 Subject: [PATCH] test: Add DiffCollectionsMigration (#17128) --- testutil/collections.go | 75 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 testutil/collections.go diff --git a/testutil/collections.go b/testutil/collections.go new file mode 100644 index 0000000000..2354943de7 --- /dev/null +++ b/testutil/collections.go @@ -0,0 +1,75 @@ +package testutil + +import ( + "crypto/sha256" + "encoding/hex" + "fmt" + + storetypes "cosmossdk.io/store/types" + + sdk "github.com/cosmos/cosmos-sdk/types" +) + +// DiffCollectionsMigration is meant to aid in the migration from the previous store +// solution to collections. It takes a few steps to use it: +// 1. Write a test function that writes elements using the old store solution. +// 2. Run the test function and copy the hash that it outputs (run it a couple +// of times to make sure no non-deterministic data is being used). +// 3. Change the code to use collections and run the test function again to make +// sure the hash didn't change. +// +// First we write it as such: +// +// func TestMigrateStore(t *testing.T) { +// DiffCollectionsMigration( +// ctx, +// storeKey, +// 100, +// func(i int64) { +// err := SetPreviousProposerConsAddr(ctx, addrs[i]) +// require.NoError(t, err) +// }, +// "abcdef0123456789", +// ) +// } +// +// Then after we change the code to use collections, we modify the writeElem function: +// +// func TestMigrateStore(t *testing.T) { +// DiffCollectionsMigration( +// ctx, +// storeKey, +// 100, +// func(i int64) { +// err := keeper.PreviousProposer.Set(ctx, addrs[i]) +// require.NoError(t, err) +// }, +// "abcdef0123456789", +// ) +// } +func DiffCollectionsMigration( + ctx sdk.Context, + storeKey *storetypes.KVStoreKey, + iterations int, + writeElem func(int64), + targetHash string, +) error { + for i := int64(0); i < int64(iterations); i++ { + writeElem(i) + } + + h := sha256.New() + it := ctx.KVStore(storeKey).Iterator(nil, nil) + defer it.Close() + for ; it.Valid(); it.Next() { + h.Write(it.Key()) + h.Write(it.Value()) + } + + hash := sha256.Sum256(nil) + if hex.EncodeToString(hash[:]) != targetHash { + return fmt.Errorf("hashes don't match: %s != %s", hex.EncodeToString(hash[:]), targetHash) + } + + return nil +}