Ensure storage loop throws an ErrorOutOfGas
This commit is contained in:
@@ -335,12 +335,59 @@ func TestExecuteWithCpuLoop(t *testing.T) {
|
||||
|
||||
// this must fail
|
||||
_, err = keeper.Execute(ctx, addr, fred, []byte(`{"cpuloop":{}}`), nil)
|
||||
require.Error(t, err)
|
||||
assert.Error(t, err)
|
||||
// make sure gas ran out
|
||||
// TODO: wasmer doesn't return gas used on error. we should consume it (for error on metering failure)
|
||||
// require.Equal(t, gasLimit, ctx.GasMeter().GasConsumed())
|
||||
}
|
||||
|
||||
func TestExecuteWithStorageLoop(t *testing.T) {
|
||||
tempDir, err := ioutil.TempDir("", "wasm")
|
||||
require.NoError(t, err)
|
||||
defer os.RemoveAll(tempDir)
|
||||
ctx, accKeeper, keeper := CreateTestInput(t, false, tempDir)
|
||||
|
||||
deposit := sdk.NewCoins(sdk.NewInt64Coin("denom", 100000))
|
||||
topUp := sdk.NewCoins(sdk.NewInt64Coin("denom", 5000))
|
||||
creator := createFakeFundedAccount(ctx, accKeeper, deposit.Add(deposit...))
|
||||
fred := createFakeFundedAccount(ctx, accKeeper, topUp)
|
||||
|
||||
wasmCode, err := ioutil.ReadFile("./testdata/contract.wasm")
|
||||
require.NoError(t, err)
|
||||
|
||||
contractID, err := keeper.Create(ctx, creator, wasmCode, "", "")
|
||||
require.NoError(t, err)
|
||||
|
||||
_, _, bob := keyPubAddr()
|
||||
initMsg := InitMsg{
|
||||
Verifier: fred,
|
||||
Beneficiary: bob,
|
||||
}
|
||||
initMsgBz, err := json.Marshal(initMsg)
|
||||
require.NoError(t, err)
|
||||
|
||||
addr, err := keeper.Instantiate(ctx, contractID, creator, initMsgBz, deposit)
|
||||
require.NoError(t, err)
|
||||
|
||||
// make sure we set a limit before calling
|
||||
var gasLimit uint64 = 400_000
|
||||
ctx = ctx.WithGasMeter(sdk.NewGasMeter(gasLimit))
|
||||
require.Equal(t, uint64(0), ctx.GasMeter().GasConsumed())
|
||||
|
||||
// ensure we get an out of gas panic
|
||||
defer func() {
|
||||
r := recover()
|
||||
require.NotNil(t, r)
|
||||
// TODO: ensure it is out of gas error
|
||||
_, ok := r.(sdk.ErrorOutOfGas)
|
||||
require.True(t, ok, "%v", r)
|
||||
}()
|
||||
|
||||
// this should throw out of gas exception (panic)
|
||||
_, _ = keeper.Execute(ctx, addr, fred, []byte(`{"storageloop":{}}`), nil)
|
||||
require.True(t, false, "We must panic before this line")
|
||||
}
|
||||
|
||||
type InitMsg struct {
|
||||
Verifier sdk.AccAddress `json:"verifier"`
|
||||
Beneficiary sdk.AccAddress `json:"beneficiary"`
|
||||
|
||||
Reference in New Issue
Block a user