-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrecovery_test.go
161 lines (144 loc) · 3.37 KB
/
recovery_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
package recovery_test
import (
"errors"
"fmt"
"testing"
"github.com/gregwebs/go-recovery"
"github.com/stretchr/testify/assert"
)
func TestCallNil(t *testing.T) {
// return nil- no error
err := recovery.Call(func() error {
return nil
})
assert.Nil(t, err)
}
func HasStack(err error) bool {
if errWithStack, ok := err.(interface{ HasStack() bool }); ok {
return errWithStack.HasStack()
}
return false
}
func TestCallError(t *testing.T) {
var errOrig error
// return a basic error
err := recovery.Call(func() error {
errOrig = fmt.Errorf("return error")
return errOrig
})
assert.NotNil(t, err)
assert.Equal(t, errOrig, err)
}
func TestCallPanicValue(t *testing.T) {
// panic string
err := recovery.Call(func() error {
panic("panic")
})
assert.NotNil(t, err)
assert.True(t, HasStack(err))
assert.Equal(t, "panic: panic", err.Error())
// panic nil
err = recovery.Call(func() error {
panic(nil)
})
assert.NotNil(t, err)
assert.True(t, HasStack(err))
assert.Equal(t, "panic: panic called with nil argument", err.Error())
}
var standardErr = fmt.Errorf("error standard")
func TestCallPanicError(t *testing.T) {
// panic standard error
err := recovery.Call(func() error {
panic(standardErr)
})
assert.NotNil(t, err)
assert.IsType(t, recovery.PanicError{}, err)
assert.True(t, HasStack(err))
assert.Equal(t, "panic: error standard", err.Error())
// panic error
err = recovery.Call(func() error {
panic(errors.New("error with stack"))
})
assert.IsType(t, recovery.PanicError{}, err)
assert.NotNil(t, err)
assert.True(t, HasStack(err))
assert.Equal(t, "panic: error with stack", err.Error())
fullPrint := fmt.Sprintf("%+v", err)
assert.Contains(t, fullPrint, "recovery_test.go")
}
func TestCallThrown(t *testing.T) {
thrown := fmt.Errorf("thrown error")
err := recovery.Call(func() error {
return thrown
})
assert.NotNil(t, err)
assert.Equal(t, thrown, err)
assert.Equal(t, "thrown error", err.Error())
err = recovery.Call(func() error {
recovery.Throw(thrown)
return nil
})
assert.NotNil(t, err)
assert.Equal(t, thrown, errors.Unwrap(err))
assert.Equal(t, "thrown error", err.Error())
err = recovery.Call(func() error {
panic("panic")
})
assert.NotNil(t, err)
assert.IsType(t, recovery.PanicError{}, err)
assert.Equal(t, "panic: panic", err.Error())
}
func TestGoHandler(t *testing.T) {
noError := func(err error) {
assert.Nil(t, err)
}
errHappened := func(err error) {
assert.NotNil(t, err)
}
recovery.GoHandler(noError, func() error {
return nil
})
recovery.GoHandler(errHappened, func() error {
panic("panic")
})
wait := make(chan struct{})
go recovery.GoHandler(noError, func() error {
wait <- struct{}{}
return nil
})
go recovery.GoHandler(errHappened, func() error {
defer func() { wait <- struct{}{} }()
panic("panic")
})
<-wait
<-wait
}
func TestGo(t *testing.T) {
noError := func(err error) {
assert.Nil(t, err)
}
errHappened := func(err error) {
assert.NotNil(t, err)
}
recovery.ErrorHandler = noError
recovery.Go(func() error {
return nil
})
recovery.ErrorHandler = errHappened
recovery.Go(func() error {
panic("panic")
})
wait := make(chan struct{})
recovery.ErrorHandler = noError
go recovery.Go(func() error {
wait <- struct{}{}
return nil
})
<-wait
recovery.ErrorHandler = errHappened
go recovery.Go(func() error {
defer func() { wait <- struct{}{} }()
panic("panic")
})
<-wait
}