Add contract error integration test
This commit is contained in:
@@ -738,6 +738,68 @@ func TestContractErrorRedacting(t *testing.T) {
|
|||||||
require.Contains(t, err.Error(), "addr_validate errored: invalid address")
|
require.Contains(t, err.Error(), "addr_validate errored: invalid address")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestContractErrorGetsForwarded(t *testing.T) {
|
||||||
|
// This test makes sure that a contract gets the error message from its submessage execution
|
||||||
|
// in a non-redacted form if that error comes from the contract in the submessage.
|
||||||
|
ctx, keepers := CreateTestInput(t, false, AvailableCapabilities)
|
||||||
|
|
||||||
|
reflect1 := InstantiateReflectExampleContract(t, ctx, keepers)
|
||||||
|
// reflect2 will be the contract that errors. It is owned by the other reflect contract.
|
||||||
|
// This is necessary because the reflect contract only accepts messages from its owner.
|
||||||
|
reflect2, _, err := keepers.ContractKeeper.Instantiate(ctx, reflect1.CodeID, reflect1.Contract, reflect1.Contract, []byte("{}"), "reflect2", sdk.NewCoins())
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
const SubMsgID = 1
|
||||||
|
// Make the reflect1 contract send a submessage to reflect2. That sub-message will error.
|
||||||
|
execMsg := testdata.ReflectHandleMsg{
|
||||||
|
ReflectSubMsg: &testdata.ReflectSubPayload{
|
||||||
|
Msgs: []wasmvmtypes.SubMsg{
|
||||||
|
{
|
||||||
|
ID: SubMsgID,
|
||||||
|
Msg: wasmvmtypes.CosmosMsg{
|
||||||
|
Wasm: &wasmvmtypes.WasmMsg{
|
||||||
|
Execute: &wasmvmtypes.ExecuteMsg{
|
||||||
|
ContractAddr: reflect2.String(),
|
||||||
|
// This message will error in the reflect contract as an empty "msgs" array is not allowed
|
||||||
|
Msg: mustMarshal(t, testdata.ReflectHandleMsg{
|
||||||
|
Reflect: &testdata.ReflectPayload{
|
||||||
|
Msgs: []wasmvmtypes.CosmosMsg{},
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
ReplyOn: wasmvmtypes.ReplyError, // we want to see the error
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
execMsgBz := mustMarshal(t, execMsg)
|
||||||
|
|
||||||
|
em := sdk.NewEventManager()
|
||||||
|
_, err = keepers.ContractKeeper.Execute(
|
||||||
|
ctx.WithEventManager(em),
|
||||||
|
reflect1.Contract,
|
||||||
|
reflect1.CreatorAddr,
|
||||||
|
execMsgBz,
|
||||||
|
nil,
|
||||||
|
)
|
||||||
|
require.NoError(t, err)
|
||||||
|
|
||||||
|
// now query the submessage reply
|
||||||
|
queryMsgBz := mustMarshal(t, testdata.ReflectQueryMsg{
|
||||||
|
SubMsgResult: &testdata.SubCall{
|
||||||
|
ID: SubMsgID,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
queryResponse, err := keepers.WasmKeeper.QuerySmart(ctx, reflect1.Contract, queryMsgBz)
|
||||||
|
require.NoError(t, err)
|
||||||
|
var submsgReply wasmvmtypes.Reply
|
||||||
|
mustUnmarshal(t, queryResponse, &submsgReply)
|
||||||
|
|
||||||
|
assert.Equal(t, "Messages empty. Must reflect at least one message: execute wasm contract failed", submsgReply.Result.Err)
|
||||||
|
}
|
||||||
|
|
||||||
func TestInstantiateWithContractDataResponse(t *testing.T) {
|
func TestInstantiateWithContractDataResponse(t *testing.T) {
|
||||||
ctx, keepers := CreateTestInput(t, false, AvailableCapabilities)
|
ctx, keepers := CreateTestInput(t, false, AvailableCapabilities)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user