From 092a178c12637de197925822fcb1f2ba0a2591ae Mon Sep 17 00:00:00 2001 From: Federico Kunze Date: Wed, 22 Aug 2018 16:15:45 +0200 Subject: [PATCH 1/4] Parsed Error msgs and added tests --- types/errors.go | 46 ++++++++++++++++++++++++++++++++++++-------- types/errors_test.go | 3 +++ 2 files changed, 41 insertions(+), 8 deletions(-) diff --git a/types/errors.go b/types/errors.go index 58541dfea..80d9e9939 100644 --- a/types/errors.go +++ b/types/errors.go @@ -1,7 +1,9 @@ package types import ( + "encoding/json" "fmt" + "strings" cmn "github.com/tendermint/tendermint/libs/common" @@ -225,7 +227,11 @@ func (err *sdkError) TraceSDK(format string, args ...interface{}) Error { // Implements ABCIError. // Overrides err.Error.Error(). func (err *sdkError) Error() string { - return fmt.Sprintf("Error{%d:%d,%#v}", err.codespace, err.code, err.cmnError) + return fmt.Sprintf(`ERROR: +Codespace: %d +Code: %d +Message: %#v +`, err.codespace, err.code, parseCmnError(err.cmnError.Error())) } // Implements ABCIError. @@ -245,13 +251,15 @@ func (err *sdkError) Code() CodeType { // Implements ABCIError. func (err *sdkError) ABCILog() string { - return fmt.Sprintf(`=== ABCI Log === -Codespace: %v -Code: %v -ABCICode: %v -Error: %#v -=== /ABCI Log === -`, err.codespace, err.code, err.ABCICode(), err.cmnError) + _ = err.Error() + parsedErrMsg := parseCmnError(err.cmnError.Error()) + jsonErr := newHumanReadableError(err.codespace, err.code, err.ABCICode(), parsedErrMsg) + bz, er := json.Marshal(jsonErr) + if er != nil { + panic(er) + } + stringifiedJSON := string(bz) + return stringifiedJSON } func (err *sdkError) Result() Result { @@ -268,3 +276,25 @@ func (err *sdkError) QueryResult() abci.ResponseQuery { Log: err.ABCILog(), } } + +func parseCmnError(err string) string { + errArray := strings.Split(err, "{") + return errArray[1][:len(errArray[1])-1] +} + +// nolint +type HumanReadableError struct { + Codespace CodespaceType `json:"codespace"` + Code CodeType `json:"code"` + ABCICode ABCICodeType `json:"abci_code"` + Message string `json:"message"` +} + +func newHumanReadableError(codespace CodespaceType, code CodeType, ABCICode ABCICodeType, msg string) HumanReadableError { + return HumanReadableError{ + Codespace: codespace, + Code: code, + ABCICode: ABCICode, + Message: msg, + } +} diff --git a/types/errors_test.go b/types/errors_test.go index e7625e96f..f00b2600c 100644 --- a/types/errors_test.go +++ b/types/errors_test.go @@ -57,7 +57,10 @@ func TestErrFn(t *testing.T) { err := errFn("") codeType := codeTypes[i] require.Equal(t, err.Code(), codeType, "Err function expected to return proper code. tc #%d", i) + require.Equal(t, err.Codespace(), CodespaceRoot, "Err function expected to return proper codespace. tc #%d", i) require.Equal(t, err.Result().Code, ToABCICode(CodespaceRoot, codeType), "Err function expected to return proper ABCICode. tc #%d") + require.Equal(t, err.QueryResult().Code, uint32(err.ABCICode()), "Err function expected to return proper ABCICode from QueryResult. tc #%d") + require.Equal(t, err.QueryResult().Log, err.ABCILog(), "Err function expected to return proper ABCILog from QueryResult. tc #%d") } require.Equal(t, ABCICodeOK, ToABCICode(CodespaceRoot, CodeOK)) From 11ee255f11894afa44a3fb6c13bfdcd2b9d8a34e Mon Sep 17 00:00:00 2001 From: Federico Kunze Date: Wed, 22 Aug 2018 16:16:56 +0200 Subject: [PATCH 2/4] Delete unnecesary line --- types/errors.go | 1 - 1 file changed, 1 deletion(-) diff --git a/types/errors.go b/types/errors.go index 80d9e9939..889e635db 100644 --- a/types/errors.go +++ b/types/errors.go @@ -251,7 +251,6 @@ func (err *sdkError) Code() CodeType { // Implements ABCIError. func (err *sdkError) ABCILog() string { - _ = err.Error() parsedErrMsg := parseCmnError(err.cmnError.Error()) jsonErr := newHumanReadableError(err.codespace, err.code, err.ABCICode(), parsedErrMsg) bz, er := json.Marshal(jsonErr) From b02ecf915fe7853c27f012c4930856c0ca212727 Mon Sep 17 00:00:00 2001 From: Federico Kunze Date: Wed, 22 Aug 2018 16:24:09 +0200 Subject: [PATCH 3/4] Update PENDING.md --- PENDING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/PENDING.md b/PENDING.md index c4b04238c..5e8405270 100644 --- a/PENDING.md +++ b/PENDING.md @@ -46,11 +46,12 @@ IMPROVEMENTS * [cli] #2060 removed `--select` from `block` command * Gaia - * [x/stake] [#2023](https://github.com/cosmos/cosmos-sdk/pull/2023) Terminate iteration loop in `UpdateBondedValidators` and `UpdateBondedValidatorsFull` when the first revoked validator is encountered and perform a sanity check. + * [x/stake] [#2023](https://github.com/cosmos/cosmos-sdk/pull/2023) Terminate iteration loop in `UpdateBondedValidators` and `UpdateBondedValidatorsFull` when the first revoked validator is encountered and perform a sanity check. * [x/auth] Signature verification's gas cost now accounts for pubkey type. [#2046](https://github.com/tendermint/tendermint/pull/2046) * SDK * [tools] Make get_vendor_deps deletes `.vendor-new` directories, in case scratch files are present. + * [types] \#2119 Parsed error messages and ABCI log errors to make them more human readable. * Tendermint From f143c92ca60a808840a0863312b691e158387eb6 Mon Sep 17 00:00:00 2001 From: Federico Kunze Date: Thu, 23 Aug 2018 12:02:12 +0200 Subject: [PATCH 4/4] Addressed Chris and Dev's comments --- PENDING.md | 2 +- types/errors.go | 29 ++++++++++++++--------------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/PENDING.md b/PENDING.md index bc0a861fb..307d39c59 100644 --- a/PENDING.md +++ b/PENDING.md @@ -21,6 +21,7 @@ BREAKING CHANGES * SDK * [core] \#1807 Switch from use of rational to decimal * [types] \#1901 Validator interface's GetOwner() renamed to GetOperator() + * [types] \#2119 Parsed error messages and ABCI log errors to make them more human readable. * Tendermint @@ -56,7 +57,6 @@ IMPROVEMENTS * SDK * [tools] Make get_vendor_deps deletes `.vendor-new` directories, in case scratch files are present. - * [types] \#2119 Parsed error messages and ABCI log errors to make them more human readable. * Tendermint diff --git a/types/errors.go b/types/errors.go index 889e635db..45ef79f56 100644 --- a/types/errors.go +++ b/types/errors.go @@ -1,12 +1,12 @@ package types import ( - "encoding/json" "fmt" "strings" cmn "github.com/tendermint/tendermint/libs/common" + "github.com/cosmos/cosmos-sdk/wire" abci "github.com/tendermint/tendermint/abci/types" ) @@ -251,9 +251,15 @@ func (err *sdkError) Code() CodeType { // Implements ABCIError. func (err *sdkError) ABCILog() string { + cdc := wire.NewCodec() parsedErrMsg := parseCmnError(err.cmnError.Error()) - jsonErr := newHumanReadableError(err.codespace, err.code, err.ABCICode(), parsedErrMsg) - bz, er := json.Marshal(jsonErr) + jsonErr := humanReadableError{ + Codespace: err.codespace, + Code: err.code, + ABCICode: err.ABCICode(), + Message: parsedErrMsg, + } + bz, er := cdc.MarshalJSON(jsonErr) if er != nil { panic(er) } @@ -277,23 +283,16 @@ func (err *sdkError) QueryResult() abci.ResponseQuery { } func parseCmnError(err string) string { - errArray := strings.Split(err, "{") - return errArray[1][:len(errArray[1])-1] + if idx := strings.Index(err, "{"); idx != -1 { + err = err[idx+1 : len(err)-1] + } + return err } // nolint -type HumanReadableError struct { +type humanReadableError struct { Codespace CodespaceType `json:"codespace"` Code CodeType `json:"code"` ABCICode ABCICodeType `json:"abci_code"` Message string `json:"message"` } - -func newHumanReadableError(codespace CodespaceType, code CodeType, ABCICode ABCICodeType, msg string) HumanReadableError { - return HumanReadableError{ - Codespace: codespace, - Code: code, - ABCICode: ABCICode, - Message: msg, - } -}