Index: common/errors/multierror_test.go |
diff --git a/common/errors/multierror_test.go b/common/errors/multierror_test.go |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a7a15329e1f430accde5798033af90a1a3d0b129 |
--- /dev/null |
+++ b/common/errors/multierror_test.go |
@@ -0,0 +1,138 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package errors |
+ |
+import ( |
+ "errors" |
+ "sync" |
+ "testing" |
+ |
+ . "github.com/smartystreets/goconvey/convey" |
+) |
+ |
+type otherMEType []error |
+ |
+func (o otherMEType) Error() string { return "FAIL" } |
+ |
+func TestUpstreamErrors(t *testing.T) { |
+ t.Parallel() |
+ |
+ Convey("Test MultiError", t, func() { |
+ Convey("nil", func() { |
+ me := MultiError(nil) |
+ So(me.Error(), ShouldEqual, "(0 errors)") |
+ Convey("single", func() { |
+ So(SingleError(error(me)), ShouldBeNil) |
+ }) |
+ }) |
+ Convey("one", func() { |
+ me := MultiError{errors.New("sup")} |
+ So(me.Error(), ShouldEqual, "sup") |
+ }) |
+ Convey("two", func() { |
+ me := MultiError{errors.New("sup"), errors.New("what")} |
+ So(me.Error(), ShouldEqual, "sup (and 1 other error)") |
+ }) |
+ Convey("more", func() { |
+ me := MultiError{errors.New("sup"), errors.New("what"), errors.New("nerds")} |
+ So(me.Error(), ShouldEqual, "sup (and 2 other errors)") |
+ |
+ Convey("single", func() { |
+ So(SingleError(error(me)), ShouldResemble, errors.New("sup")) |
+ }) |
+ }) |
+ }) |
+ |
+ Convey("SingleError passes through", t, func() { |
+ e := errors.New("unique") |
+ So(SingleError(e), ShouldEqual, e) |
+ }) |
+ |
+ Convey("Test MultiError Conversion", t, func() { |
+ ome := otherMEType{errors.New("sup")} |
+ So(Fix(ome), ShouldHaveSameTypeAs, MultiError{}) |
+ }) |
+ |
+ Convey("Fix passes through", t, func() { |
+ e := errors.New("unique") |
+ So(Fix(e), ShouldEqual, e) |
+ }) |
+} |
+ |
+func TestLazyMultiError(t *testing.T) { |
+ t.Parallel() |
+ |
+ Convey("Test LazyMultiError", t, func() { |
+ lme := LazyMultiError{Size: 10} |
+ So(lme.Get(), ShouldEqual, nil) |
+ |
+ e := errors.New("sup") |
+ lme.Assign(6, e) |
+ So(lme.Get(), ShouldResemble, |
+ MultiError{nil, nil, nil, nil, nil, nil, e, nil, nil, nil}) |
+ |
+ lme.Assign(2, e) |
+ So(lme.Get(), ShouldResemble, |
+ MultiError{nil, nil, e, nil, nil, nil, e, nil, nil, nil}) |
+ |
+ So(func() { lme.Assign(20, e) }, ShouldPanic) |
+ |
+ Convey("Try to freak out the race detector", func() { |
+ lme := LazyMultiError{Size: 64} |
+ Convey("all nils", func() { |
+ wg := sync.WaitGroup{} |
+ for i := 0; i < 64; i++ { |
+ wg.Add(1) |
+ go func(i int) { |
+ lme.Assign(i, nil) |
+ wg.Done() |
+ }(i) |
+ } |
+ wg.Wait() |
+ So(lme.Get(), ShouldBeNil) |
+ }) |
+ Convey("every other", func() { |
+ wow := errors.New("wow") |
+ wg := sync.WaitGroup{} |
+ for i := 0; i < 64; i++ { |
+ wg.Add(1) |
+ go func(i int) { |
+ e := error(nil) |
+ if i&1 == 1 { |
+ e = wow |
+ } |
+ lme.Assign(i, e) |
+ wg.Done() |
+ }(i) |
+ } |
+ wg.Wait() |
+ me := make(MultiError, 64) |
+ for i := range me { |
+ if i&1 == 1 { |
+ me[i] = wow |
+ } |
+ } |
+ So(lme.Get(), ShouldResemble, me) |
+ }) |
+ Convey("all", func() { |
+ wow := errors.New("wow") |
+ wg := sync.WaitGroup{} |
+ for i := 0; i < 64; i++ { |
+ wg.Add(1) |
+ go func(i int) { |
+ lme.Assign(i, wow) |
+ wg.Done() |
+ }(i) |
+ } |
+ wg.Wait() |
+ me := make(MultiError, 64) |
+ for i := range me { |
+ me[i] = wow |
+ } |
+ So(lme.Get(), ShouldResemble, me) |
+ }) |
+ }) |
+ }) |
+} |