github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/wasm/keeper/snapshotter_integration_test.go (about)

     1  package keeper_test
     2  
     3  //import (
     4  //	"crypto/sha256"
     5  //	"io/ioutil"
     6  //	"testing"
     7  //	"time"
     8  //
     9  //	"github.com/fibonacci-chain/fbc/x/wasm/types"
    10  //
    11  //	"github.com/stretchr/testify/assert"
    12  //
    13  //	cryptocodec "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/crypto/codec"
    14  //	"github.com/fibonacci-chain/fbc/libs/cosmos-sdk/crypto/keys/ed25519"
    15  //	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    16  //	authtypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/auth/types"
    17  //	banktypes "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/x/bank/types"
    18  //	"github.com/stretchr/testify/require"
    19  //	tmproto "github.com/tendermint/tendermint/proto/tendermint/types"
    20  //	tmtypes "github.com/tendermint/tendermint/types"
    21  //
    22  //	"github.com/fibonacci-chain/fbc/app"
    23  //	"github.com/fibonacci-chain/fbc/x/wasm/keeper"
    24  //)
    25  //
    26  //func TestSnapshotter(t *testing.T) {
    27  //	specs := map[string]struct {
    28  //		wasmFiles []string
    29  //	}{
    30  //		"single contract": {
    31  //			wasmFiles: []string{"./testdata/reflect.wasm"},
    32  //		},
    33  //		"multiple contract": {
    34  //			wasmFiles: []string{"./testdata/reflect.wasm", "./testdata/burner.wasm", "./testdata/reflect.wasm"},
    35  //		},
    36  //		"duplicate contracts": {
    37  //			wasmFiles: []string{"./testdata/reflect.wasm", "./testdata/reflect.wasm"},
    38  //		},
    39  //	}
    40  //	for name, spec := range specs {
    41  //		t.Run(name, func(t *testing.T) {
    42  //			// setup source app
    43  //			srcWasmApp, genesisAddr := newWasmExampleApp(t)
    44  //
    45  //			// store wasm codes on chain
    46  //			ctx := srcWasmApp.NewUncachedContext(false, tmproto.Header{
    47  //				ChainID: "foo",
    48  //				Height:  srcWasmApp.LastBlockHeight() + 1,
    49  //				Time:    time.Now(),
    50  //			})
    51  //			wasmKeeper := app.NewTestSupport(t, srcWasmApp).WasmKeeper()
    52  //			contractKeeper := keeper.NewDefaultPermissionKeeper(&wasmKeeper)
    53  //
    54  //			srcCodeIDToChecksum := make(map[uint64][]byte, len(spec.wasmFiles))
    55  //			for i, v := range spec.wasmFiles {
    56  //				wasmCode, err := ioutil.ReadFile(v)
    57  //				require.NoError(t, err)
    58  //				codeID, err := contractKeeper.Create(ctx, genesisAddr, wasmCode, nil)
    59  //				require.NoError(t, err)
    60  //				require.Equal(t, uint64(i+1), codeID)
    61  //				hash := sha256.Sum256(wasmCode)
    62  //				srcCodeIDToChecksum[codeID] = hash[:]
    63  //			}
    64  //			// create snapshot
    65  //			srcWasmApp.Commit()
    66  //			snapshotHeight := uint64(srcWasmApp.LastBlockHeight())
    67  //			snapshot, err := srcWasmApp.SnapshotManager().Create(snapshotHeight)
    68  //			require.NoError(t, err)
    69  //			assert.NotNil(t, snapshot)
    70  //
    71  //			// when snapshot imported into dest app instance
    72  //			destWasmApp := app.SetupWithEmptyStore(t)
    73  //			require.NoError(t, destWasmApp.SnapshotManager().Restore(*snapshot))
    74  //			for i := uint32(0); i < snapshot.Chunks; i++ {
    75  //				chunkBz, err := srcWasmApp.SnapshotManager().LoadChunk(snapshot.Height, snapshot.Format, i)
    76  //				require.NoError(t, err)
    77  //				end, err := destWasmApp.SnapshotManager().RestoreChunk(chunkBz)
    78  //				require.NoError(t, err)
    79  //				if end {
    80  //					break
    81  //				}
    82  //			}
    83  //
    84  //			// then all wasm contracts are imported
    85  //			wasmKeeper = app.NewTestSupport(t, destWasmApp).WasmKeeper()
    86  //			ctx = destWasmApp.NewUncachedContext(false, tmproto.Header{
    87  //				ChainID: "foo",
    88  //				Height:  destWasmApp.LastBlockHeight() + 1,
    89  //				Time:    time.Now(),
    90  //			})
    91  //
    92  //			destCodeIDToChecksum := make(map[uint64][]byte, len(spec.wasmFiles))
    93  //			wasmKeeper.IterateCodeInfos(ctx, func(id uint64, info types.CodeInfo) bool {
    94  //				bz, err := wasmKeeper.GetByteCode(ctx, id)
    95  //				require.NoError(t, err)
    96  //				hash := sha256.Sum256(bz)
    97  //				destCodeIDToChecksum[id] = hash[:]
    98  //				assert.Equal(t, hash[:], info.CodeHash)
    99  //				return false
   100  //			})
   101  //			assert.Equal(t, srcCodeIDToChecksum, destCodeIDToChecksum)
   102  //		})
   103  //	}
   104  //}
   105  //
   106  //func newWasmExampleApp(t *testing.T) (*app.WasmApp, sdk.AccAddress) {
   107  //	senderPrivKey := ed25519.GenPrivKey()
   108  //	pubKey, err := cryptocodec.ToTmPubKeyInterface(senderPrivKey.PubKey())
   109  //	require.NoError(t, err)
   110  //
   111  //	senderAddr := senderPrivKey.PubKey().Address().Bytes()
   112  //	acc := authtypes.NewBaseAccount(senderAddr, senderPrivKey.PubKey(), 0, 0)
   113  //	amount, ok := sdk.NewIntFromString("10000000000000000000")
   114  //	require.True(t, ok)
   115  //
   116  //	balance := banktypes.Balance{
   117  //		Address: acc.GetAddress().String(),
   118  //		Coins:   sdk.NewCoins(sdk.NewCoin(sdk.DefaultBondDenom, amount)),
   119  //	}
   120  //	validator := tmtypes.NewValidator(pubKey, 1)
   121  //	valSet := tmtypes.NewValidatorSet([]*tmtypes.Validator{validator})
   122  //	wasmApp := app.SetupWithGenesisValSet(t, valSet, []authtypes.GenesisAccount{acc}, nil, balance)
   123  //
   124  //	return wasmApp, senderAddr
   125  //}