2018-03-17 18:03:25 -07:00
|
|
|
package types
|
|
|
|
|
|
|
|
import (
|
2018-10-19 09:55:20 -07:00
|
|
|
"fmt"
|
2018-03-17 18:03:25 -07:00
|
|
|
"testing"
|
|
|
|
|
2018-06-29 18:10:15 -07:00
|
|
|
"github.com/stretchr/testify/require"
|
2019-08-05 11:17:37 -07:00
|
|
|
|
|
|
|
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
|
2018-03-17 18:03:25 -07:00
|
|
|
)
|
|
|
|
|
|
|
|
var codeTypes = []CodeType{
|
|
|
|
CodeInternal,
|
2018-03-20 18:40:58 -07:00
|
|
|
CodeTxDecode,
|
2018-03-17 18:03:25 -07:00
|
|
|
CodeInvalidSequence,
|
|
|
|
CodeUnauthorized,
|
|
|
|
CodeInsufficientFunds,
|
|
|
|
CodeUnknownRequest,
|
2018-08-06 12:00:49 -07:00
|
|
|
CodeInvalidAddress,
|
2018-03-17 18:03:25 -07:00
|
|
|
CodeInvalidPubKey,
|
2018-08-06 12:00:49 -07:00
|
|
|
CodeUnknownAddress,
|
|
|
|
CodeInsufficientCoins,
|
|
|
|
CodeInvalidCoins,
|
|
|
|
CodeOutOfGas,
|
|
|
|
CodeMemoTooLarge,
|
2018-03-17 18:03:25 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
type errFn func(msg string) Error
|
|
|
|
|
|
|
|
var errFns = []errFn{
|
|
|
|
ErrInternal,
|
2018-03-20 18:40:58 -07:00
|
|
|
ErrTxDecode,
|
2018-03-17 18:03:25 -07:00
|
|
|
ErrInvalidSequence,
|
|
|
|
ErrUnauthorized,
|
|
|
|
ErrInsufficientFunds,
|
|
|
|
ErrUnknownRequest,
|
2018-08-06 12:00:49 -07:00
|
|
|
ErrInvalidAddress,
|
2018-03-17 18:03:25 -07:00
|
|
|
ErrInvalidPubKey,
|
2018-08-06 12:00:49 -07:00
|
|
|
ErrUnknownAddress,
|
|
|
|
ErrInsufficientCoins,
|
|
|
|
ErrInvalidCoins,
|
|
|
|
ErrOutOfGas,
|
|
|
|
ErrMemoTooLarge,
|
2018-03-17 18:03:25 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestCodeType(t *testing.T) {
|
2018-11-16 09:12:24 -08:00
|
|
|
require.True(t, CodeOK.IsOK())
|
2018-03-17 18:03:25 -07:00
|
|
|
|
2018-08-06 12:00:49 -07:00
|
|
|
for tcnum, c := range codeTypes {
|
2018-03-17 18:03:25 -07:00
|
|
|
msg := CodeToDefaultMsg(c)
|
2018-08-06 12:00:49 -07:00
|
|
|
require.NotEqual(t, unknownCodeMsg(c), msg, "Code expected to be known. tc #%d, code %d, msg %s", tcnum, c, msg)
|
2018-03-17 18:03:25 -07:00
|
|
|
}
|
2018-08-06 12:00:49 -07:00
|
|
|
|
|
|
|
msg := CodeToDefaultMsg(CodeOK)
|
|
|
|
require.Equal(t, unknownCodeMsg(CodeOK), msg)
|
2018-03-17 18:03:25 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestErrFn(t *testing.T) {
|
|
|
|
for i, errFn := range errFns {
|
|
|
|
err := errFn("")
|
|
|
|
codeType := codeTypes[i]
|
2018-08-06 12:00:49 -07:00
|
|
|
require.Equal(t, err.Code(), codeType, "Err function expected to return proper code. tc #%d", i)
|
2018-08-22 07:15:45 -07:00
|
|
|
require.Equal(t, err.Codespace(), CodespaceRoot, "Err function expected to return proper codespace. tc #%d", i)
|
2018-11-16 09:12:24 -08:00
|
|
|
require.Equal(t, err.QueryResult().Code, uint32(err.Code()), "Err function expected to return proper Code from QueryResult. tc #%d")
|
2018-08-22 07:15:45 -07:00
|
|
|
require.Equal(t, err.QueryResult().Log, err.ABCILog(), "Err function expected to return proper ABCILog from QueryResult. tc #%d")
|
2018-03-17 18:03:25 -07:00
|
|
|
}
|
|
|
|
}
|
2018-10-19 09:55:20 -07:00
|
|
|
|
|
|
|
func TestAppendMsgToErr(t *testing.T) {
|
|
|
|
for i, errFn := range errFns {
|
|
|
|
err := errFn("")
|
|
|
|
errMsg := err.Stacktrace().Error()
|
|
|
|
abciLog := err.ABCILog()
|
|
|
|
|
|
|
|
// plain msg error
|
|
|
|
msg := AppendMsgToErr("something unexpected happened", errMsg)
|
2019-02-11 15:12:43 -08:00
|
|
|
require.Equal(
|
|
|
|
t,
|
|
|
|
fmt.Sprintf("something unexpected happened; %s", errMsg),
|
2018-10-19 09:55:20 -07:00
|
|
|
msg,
|
2019-02-11 15:12:43 -08:00
|
|
|
fmt.Sprintf("Should have formatted the error message of ABCI Log. tc #%d", i),
|
|
|
|
)
|
2018-10-19 09:55:20 -07:00
|
|
|
|
|
|
|
// ABCI Log msg error
|
|
|
|
msg = AppendMsgToErr("something unexpected happened", abciLog)
|
|
|
|
msgIdx := mustGetMsgIndex(abciLog)
|
2019-02-11 15:12:43 -08:00
|
|
|
require.Equal(
|
|
|
|
t,
|
|
|
|
fmt.Sprintf("%s%s; %s}",
|
|
|
|
abciLog[:msgIdx],
|
|
|
|
"something unexpected happened",
|
|
|
|
abciLog[msgIdx:len(abciLog)-1],
|
|
|
|
),
|
2018-10-19 09:55:20 -07:00
|
|
|
msg,
|
|
|
|
fmt.Sprintf("Should have formatted the error message of ABCI Log. tc #%d", i))
|
|
|
|
}
|
|
|
|
}
|
2019-08-05 11:17:37 -07:00
|
|
|
|
|
|
|
func TestResultFromError(t *testing.T) {
|
|
|
|
cases := map[string]struct {
|
|
|
|
err error
|
|
|
|
expect Result
|
|
|
|
}{
|
|
|
|
"sdk.Error": {
|
|
|
|
err: ErrUnauthorized("not owner"),
|
|
|
|
expect: Result{
|
|
|
|
Codespace: CodespaceRoot,
|
|
|
|
Code: CodeUnauthorized,
|
|
|
|
Log: `{"codespace":"sdk","code":4,"message":"not owner"}`,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"types/errors": {
|
|
|
|
err: sdkerrors.Wrap(sdkerrors.ErrUnauthorized, "not owner"),
|
|
|
|
expect: Result{
|
|
|
|
Codespace: CodespaceRoot,
|
|
|
|
Code: CodeUnauthorized,
|
|
|
|
Log: `{"codespace":"sdk","code":4,"message":"not owner: unauthorized"}`,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
"stdlib errors": {
|
|
|
|
err: fmt.Errorf("not owner"),
|
|
|
|
expect: Result{
|
|
|
|
Codespace: CodespaceType("undefined"),
|
|
|
|
Code: CodeInternal,
|
|
|
|
// note that we redact the internal errors in the new package to not leak eg. panics
|
|
|
|
Log: `{"codespace":"undefined","code":1,"message":"internal error"}`,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
for name, tc := range cases {
|
|
|
|
t.Run(name, func(t *testing.T) {
|
|
|
|
res := ResultFromError(tc.err)
|
|
|
|
require.Equal(t, tc.expect, res)
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|