func (*functionSuite) TestAnnotate(c *gc.C) { first := errors.New("first") err := errors.Annotate(first, "annotation") //err annotateTest c.Assert(err.Error(), gc.Equals, "annotation: first") c.Assert(errors.Cause(err), gc.Equals, first) c.Assert(errors.Details(err), jc.Contains, tagToLocation["annotateTest"].String()) c.Assert(errors.Annotate(nil, "annotate"), gc.IsNil) }
func (*functionSuite) TestCause(c *gc.C) { c.Assert(errors.Cause(nil), gc.IsNil) c.Assert(errors.Cause(someErr), gc.Equals, someErr) fmtErr := fmt.Errorf("simple") c.Assert(errors.Cause(fmtErr), gc.Equals, fmtErr) err := errors.Wrap(someErr, fmtErr) c.Assert(errors.Cause(err), gc.Equals, fmtErr) err = errors.Annotate(err, "annotated") c.Assert(errors.Cause(err), gc.Equals, fmtErr) err = errors.Maskf(err, "maksed") c.Assert(errors.Cause(err), gc.Equals, err) // Look for a file that we know isn't there. dir := c.MkDir() _, err = os.Stat(filepath.Join(dir, "not-there")) c.Assert(os.IsNotExist(err), jc.IsTrue) err = errors.Annotatef(err, "wrap it") // Now the error itself isn't a 'IsNotExist'. c.Assert(os.IsNotExist(err), jc.IsFalse) // However if we use the Check method, it is. c.Assert(os.IsNotExist(errors.Cause(err)), jc.IsTrue) }
func (s *functionSuite) TestDetails(c *gc.C) { if runtime.Compiler == "gccgo" { c.Skip("gccgo can't determine the location") } c.Assert(errors.Details(nil), gc.Equals, "[]") otherErr := fmt.Errorf("other") checkDetails(c, otherErr, "[{other}]") err0 := newEmbed("foo") //err TestStack#0 checkDetails(c, err0, "[{$TestStack#0$: foo}]") err1 := errors.Annotate(err0, "bar") //err TestStack#1 checkDetails(c, err1, "[{$TestStack#1$: bar} {$TestStack#0$: foo}]") err2 := errors.Trace(err1) //err TestStack#2 checkDetails(c, err2, "[{$TestStack#2$: } {$TestStack#1$: bar} {$TestStack#0$: foo}]") }
func (*errorsSuite) TestErrorString(c *gc.C) { for i, test := range []struct { message string generator func() error expected string }{ { message: "uncomparable errors", generator: func() error { err := errors.Annotatef(newNonComparableError("uncomparable"), "annotation") return errors.Annotatef(err, "another") }, expected: "another: annotation: uncomparable", }, { message: "Errorf", generator: func() error { return errors.Errorf("first error") }, expected: "first error", }, { message: "annotated error", generator: func() error { err := errors.Errorf("first error") return errors.Annotatef(err, "annotation") }, expected: "annotation: first error", }, { message: "test annotation format", generator: func() error { err := errors.Errorf("first %s", "error") return errors.Annotatef(err, "%s", "annotation") }, expected: "annotation: first error", }, { message: "wrapped error", generator: func() error { err := newError("first error") return errors.Wrap(err, newError("detailed error")) }, expected: "detailed error", }, { message: "wrapped annotated error", generator: func() error { err := errors.Errorf("first error") err = errors.Annotatef(err, "annotated") return errors.Wrap(err, fmt.Errorf("detailed error")) }, expected: "detailed error", }, { message: "annotated wrapped error", generator: func() error { err := errors.Errorf("first error") err = errors.Wrap(err, fmt.Errorf("detailed error")) return errors.Annotatef(err, "annotated") }, expected: "annotated: detailed error", }, { message: "traced, and annotated", generator: func() error { err := errors.New("first error") err = errors.Trace(err) err = errors.Annotate(err, "some context") err = errors.Trace(err) err = errors.Annotate(err, "more context") return errors.Trace(err) }, expected: "more context: some context: first error", }, { message: "traced, and annotated, masked and annotated", generator: func() error { err := errors.New("first error") err = errors.Trace(err) err = errors.Annotate(err, "some context") err = errors.Maskf(err, "masked") err = errors.Annotate(err, "more context") return errors.Trace(err) }, expected: "more context: masked: some context: first error", }, } { c.Logf("%v: %s", i, test.message) err := test.generator() ok := c.Check(err.Error(), gc.Equals, test.expected) if !ok { c.Logf("%#v", test.generator()) } } }