-
Notifications
You must be signed in to change notification settings - Fork 46
/
abci_test.go
189 lines (176 loc) · 4.3 KB
/
abci_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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
package weave
import (
"fmt"
"reflect"
"testing"
"github.com/iov-one/weave/errors"
"github.com/iov-one/weave/weavetest/assert"
abci "github.com/tendermint/tendermint/abci/types"
)
func TestCreateResults(t *testing.T) {
dres := DeliverResult{
Data: []byte{1, 3, 4},
Log: "got it",
}
ad := dres.ToABCI()
assert.Equal(t, dres.Data, ad.Data)
assert.Equal(t, dres.Log, ad.Log)
assert.Equal(t, 0, len(ad.Tags))
log, gas := "aok", int64(12345)
cres := NewCheck(gas, log)
ac := cres.ToABCI()
assert.Equal(t, log, ac.Log)
assert.Equal(t, gas, ac.GasWanted)
assert.Equal(t, 0, len(ac.Data))
}
func TestDeliverTxError(t *testing.T) {
notFoundErr := &abciError{code: 666, msg: "not found"}
cases := map[string]struct {
err error
debug bool
wantResp abci.ResponseDeliverTx
}{
"internal error is hidden": {
err: fmt.Errorf("cannot connect to the database"),
debug: false,
wantResp: abci.ResponseDeliverTx{
Code: 1,
Log: "cannot deliver tx: internal error",
},
},
"internal error is not hidden when in debug mode": {
err: fmt.Errorf("cannot connect to the database"),
debug: true,
wantResp: abci.ResponseDeliverTx{
Code: 1,
Log: "cannot deliver tx: cannot connect to the database",
},
},
"weave error is exposed": {
err: errors.Wrap(notFoundErr, "not here"),
debug: false,
wantResp: abci.ResponseDeliverTx{
Code: 666,
Log: "cannot deliver tx: not here: not found",
},
},
"weave error is exposed in debug mode": {
err: errors.Wrap(notFoundErr, "not here"),
debug: false,
wantResp: abci.ResponseDeliverTx{
Code: 666,
Log: "cannot deliver tx: not here: not found",
},
},
"multi-error is exposing all errors": {
err: errors.Append(
&abciError{code: 111, msg: "first"},
&abciError{code: 222, msg: "second"},
&abciError{code: 333, msg: "third"},
),
debug: false,
wantResp: abci.ResponseDeliverTx{
Code: 1000,
Log: `cannot deliver tx: 3 errors occurred:
* first
* second
* third
`,
},
},
"multi-error with panic in debug mode": {
err: errors.Append(
&abciError{code: 111, msg: "first"},
errors.ErrPanic,
),
debug: true,
wantResp: abci.ResponseDeliverTx{
Code: 1000,
Log: `cannot deliver tx: 2 errors occurred:
* first
* panic
`,
},
},
"multi-error with panic in non debug mode": {
err: errors.Append(
&abciError{code: 111, msg: "first"},
errors.ErrPanic,
),
debug: false,
wantResp: abci.ResponseDeliverTx{
Code: 1000,
Log: "cannot deliver tx: internal error",
},
},
}
for testName, tc := range cases {
t.Run(testName, func(t *testing.T) {
resp := DeliverTxError(tc.err, tc.debug)
if !reflect.DeepEqual(resp, tc.wantResp) {
t.Fatalf("unexpected response: %+v", resp)
}
})
}
}
func TestCheckTxError(t *testing.T) {
notFoundErr := &abciError{code: 666, msg: "not found"}
cases := map[string]struct {
err error
debug bool
wantResp abci.ResponseCheckTx
}{
"internal error is hidden": {
err: fmt.Errorf("cannot connect to the database"),
debug: false,
wantResp: abci.ResponseCheckTx{
Code: 1,
Log: "cannot check tx: internal error",
},
},
"internal error is not hidden when in debug mode": {
err: fmt.Errorf("cannot connect to the database"),
debug: true,
wantResp: abci.ResponseCheckTx{
Code: 1,
Log: "cannot check tx: cannot connect to the database",
},
},
"abci error is exposed": {
err: errors.Wrap(notFoundErr, "not here"),
debug: false,
wantResp: abci.ResponseCheckTx{
Code: 666,
Log: "cannot check tx: not here: not found",
},
},
"weave error is exposed in debug mode": {
err: errors.Wrap(notFoundErr, "not here"),
debug: false,
wantResp: abci.ResponseCheckTx{
Code: 666,
Log: "cannot check tx: not here: not found",
},
},
}
for testName, tc := range cases {
t.Run(testName, func(t *testing.T) {
resp := CheckTxError(tc.err, tc.debug)
if !reflect.DeepEqual(resp, tc.wantResp) {
t.Fatalf("unexpected response: %+v", resp)
}
})
}
}
// abciError is a custom implementation of an error that provides an ABCICode
// method.
type abciError struct {
code uint32
msg string
}
func (e *abciError) ABCICode() uint32 {
return e.code
}
func (e *abciError) Error() string {
return e.msg
}