-
Notifications
You must be signed in to change notification settings - Fork 35
/
Copy patherrors_test.go
168 lines (138 loc) · 4.38 KB
/
errors_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
//go:build unit
package errors
import (
"net/http"
"testing"
"github.com/stretchr/testify/assert"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
)
func TestNew(t *testing.T) {
tests := []struct {
msg string
args []interface{}
result string
}{
// empty message
{},
// simple message
{
msg: "some error",
result: "some error",
},
// format error
{
msg: "some error: %v: %v",
args: []interface{}{"error1", "error2"},
result: "some error: error1: error2",
},
}
for _, c := range tests {
err := New(c.msg, c.args...)
assert.Equal(t, c.result, err.Error(), "must match")
}
}
func checkListError(t *testing.T, lerr error, len int, result string) {
assert.NotNil(t, lerr)
_, ok := lerr.(listError)
assert.True(t, ok)
assert.Equal(t, len, Len(lerr))
assert.Equal(t, result, lerr.Error())
}
func TestAppendError(t *testing.T) {
// both nil
assert.Nil(t, AppendError(nil, nil))
// errn nil, and err not nil but simple error
serr := New("some error")
lerr := AppendError(serr, nil)
checkListError(t, lerr, 1, "[some error]")
// errn nil, and err not nil and a list error
lerr = AppendError(lerr, nil)
checkListError(t, lerr, 1, "[some error]")
// err nil and errn not nil and simple error
lerr = AppendError(nil, serr)
checkListError(t, lerr, 1, "[some error]")
// err nil and errn not nil and list error
lerr = AppendError(nil, lerr)
checkListError(t, lerr, 1, "[some error]")
// both simple errors
lerr = AppendError(serr, serr)
checkListError(t, lerr, 2, "[some error; some error]")
// err simple and errn list
lerr = AppendError(serr, lerr)
checkListError(t, lerr, 3, "[some error; some error; some error]")
// err list error and errn simple error
lerr = AppendError(lerr, serr)
checkListError(t, lerr, 4, "[some error; some error; some error; some error]")
// both list errors
lerr = AppendError(AppendError(serr, nil), AppendError(serr, nil))
checkListError(t, lerr, 2, "[some error; some error]")
}
func TestIsOfType(t *testing.T) {
// single type error
const errBadErr = Error("bad error")
serr := New("some error")
terr := NewTypedError(ErrUnknown, serr)
assert.True(t, IsOfType(ErrUnknown, terr))
assert.False(t, IsOfType(errBadErr, terr))
assert.Equal(t, "unknown error: some error", terr.Error())
// recursive error
terr = NewTypedError(errBadErr, terr)
assert.True(t, IsOfType(ErrUnknown, terr))
assert.True(t, IsOfType(errBadErr, terr))
assert.Equal(t, "bad error: unknown error: some error", terr.Error())
// simple error
assert.False(t, IsOfType(ErrUnknown, serr))
assert.False(t, IsOfType(errBadErr, serr))
assert.True(t, IsOfType(serr, serr))
// list error
lerr := AppendError(serr, nil)
assert.False(t, IsOfType(ErrUnknown, lerr))
assert.False(t, IsOfType(errBadErr, lerr))
terr = NewTypedError(errBadErr, lerr)
assert.True(t, IsOfType(errBadErr, terr))
// status err
serr = status.Error(codes.Unknown, errBadErr.Error())
assert.True(t, IsOfType(errBadErr, serr))
}
func TestMask(t *testing.T) {
errBadErr := Error("bad error")
terr := NewTypedError(ErrUnknown, errBadErr)
s := Mask(terr)
assert.Equal(t, "error has been masked", s.Error())
s = Mask(errBadErr)
assert.Equal(t, "error has been masked", s.Error())
}
func TestGetHTTPCode(t *testing.T) {
err := New("some error")
code, msg := GetHTTPDetails(err)
assert.Equal(t, http.StatusInternalServerError, code)
assert.Equal(t, "some error", msg)
err = NewHTTPError(http.StatusBadRequest, err)
code, msg = GetHTTPDetails(err)
assert.Equal(t, http.StatusBadRequest, code)
assert.Equal(t, "some error", msg)
err = NewHTTPError(int(codes.AlreadyExists), New("some error"))
code, msg = GetHTTPDetails(err)
assert.Equal(t, http.StatusConflict, code)
assert.Equal(t, "some error", msg)
}
func checkStackTrace(t *testing.T, err error, trace string) {
sterr, ok := err.(*withStack)
assert.True(t, ok)
werr := detachStackTrace(err)
assert.Equal(t, sterr.err.Error(), werr.Error())
st := StackTrace(err)
assert.NotEmpty(t, st)
assert.Contains(t, st, trace)
st = StackTrace(werr)
assert.Empty(t, st)
}
func TestNewWithStackTrace(t *testing.T) {
err := New("some error")
checkStackTrace(t, err, "github.com/centrifuge/go-centrifuge/errors.TestNewWithStackTrace")
}
func TestWithStackTrace(t *testing.T) {
err := WithStackTrace(New("some error"))
checkStackTrace(t, err, "github.com/centrifuge/go-centrifuge/errors.TestWithStackTrace")
}