## Description This PR: * moves all of the `types/errors` code to a new `errors` go module, except: * the `RootCodespace` errors in `types/errors` stay there * ABCI stuff that depends on tendermint stays in `types/errors * adds aliases to everything in `types/errors` referencing `errors` so **this is not a breaking change** This will allow standalone go modules to use the same error types as the SDK. In particular, I want the `orm` to reference `errors` and then the SDK will be able to import `orm` and it can stay standalone. The same could apply to the `db` module. After this PR the plan is to: * tag `github.com/cosmos/cosmos-sdk/errors` as `v1.0` 🎉 * remove the `replace` directive for `errors` in the main SDK `go.mod` --- ### Author Checklist *All items are required. Please add a note to the item if the item is not applicable and please add links to any relevant follow up issues.* I have... - [x] included the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title - [ ] added `!` to the type prefix if API or client breaking change - [x] targeted the correct branch (see [PR Targeting](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#pr-targeting)) - [ ] provided a link to the relevant issue or specification - [ ] followed the guidelines for [building modules](https://github.com/cosmos/cosmos-sdk/blob/master/docs/building-modules) - [ ] included the necessary unit and integration [tests](https://github.com/cosmos/cosmos-sdk/blob/master/CONTRIBUTING.md#testing) - [ ] added a changelog entry to `CHANGELOG.md` - [ ] included comments for [documenting Go code](https://blog.golang.org/godoc) - [ ] updated the relevant documentation or specification - [x] reviewed "Files changed" and left comments if necessary - [ ] confirmed all CI checks have passed ### Reviewers Checklist *All items are required. Please add a note if the item is not applicable and please add your handle next to the items reviewed if you only reviewed selected items.* I have... - [ ] confirmed the correct [type prefix](https://github.com/commitizen/conventional-commit-types/blob/v3.0.0/index.json) in the PR title - [ ] confirmed `!` in the type prefix if API or client breaking change - [ ] confirmed all author checklist items have been addressed - [ ] reviewed state machine logic - [ ] reviewed API design and naming - [ ] reviewed documentation is accurate - [ ] reviewed tests and test coverage - [ ] manually tested (if applicable)
63 lines
1.8 KiB
Go
63 lines
1.8 KiB
Go
package errors
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"reflect"
|
|
"strings"
|
|
)
|
|
|
|
func (s *errorsTestSuite) TestStackTrace() {
|
|
cases := map[string]struct {
|
|
err error
|
|
wantError string
|
|
}{
|
|
"New gives us a stacktrace": {
|
|
err: Wrap(ErrNoSignatures, "name"),
|
|
wantError: "name: no signatures supplied",
|
|
},
|
|
"Wrapping stderr gives us a stacktrace": {
|
|
err: Wrap(fmt.Errorf("foo"), "standard"),
|
|
wantError: "standard: foo",
|
|
},
|
|
"Wrapping pkg/errors gives us clean stacktrace": {
|
|
err: Wrap(errors.New("bar"), "pkg"),
|
|
wantError: "pkg: bar",
|
|
},
|
|
"Wrapping inside another function is still clean": {
|
|
err: Wrap(fmt.Errorf("indirect"), "do the do"),
|
|
wantError: "do the do: indirect",
|
|
},
|
|
}
|
|
|
|
// Wrapping code is unwanted in the errors stack trace.
|
|
unwantedSrc := []string{
|
|
"github.com/cosmos/cosmos-sdk/types/errors.Wrap\n",
|
|
"github.com/cosmos/cosmos-sdk/types/errors.Wrapf\n",
|
|
"runtime.goexit\n",
|
|
}
|
|
const thisTestSrc = "types/errors/stacktrace_test.go"
|
|
|
|
for _, tc := range cases {
|
|
s.Require().True(reflect.DeepEqual(tc.err.Error(), tc.wantError))
|
|
s.Require().NotNil(stackTrace(tc.err))
|
|
fullStack := fmt.Sprintf("%+v", tc.err)
|
|
s.Require().True(strings.Contains(fullStack, thisTestSrc))
|
|
s.Require().True(strings.Contains(fullStack, tc.wantError))
|
|
|
|
for _, src := range unwantedSrc {
|
|
if strings.Contains(fullStack, src) {
|
|
s.T().Logf("Stack trace below\n----%s\n----", fullStack)
|
|
s.T().Logf("full stack contains unwanted source file path: %q", src)
|
|
}
|
|
}
|
|
|
|
tinyStack := fmt.Sprintf("%v", tc.err)
|
|
s.Require().True(strings.HasPrefix(tinyStack, tc.wantError))
|
|
s.Require().False(strings.Contains(tinyStack, "\n"))
|
|
// contains a link to where it was created, which must
|
|
// be here, not the Wrap() function
|
|
s.Require().True(strings.Contains(tinyStack, thisTestSrc))
|
|
}
|
|
}
|