15
15
package cecdysis
16
16
17
17
import (
18
+ "bytes"
19
+ "io"
20
+ "os"
21
+ "strings"
18
22
"testing"
19
23
24
+ "github.com/conduitio/conduit/pkg/foundation/cerrors"
20
25
"github.com/matryer/is"
21
26
"google.golang.org/grpc/codes"
22
27
"google.golang.org/grpc/status"
@@ -26,102 +31,122 @@ func TestHandleError(t *testing.T) {
26
31
is := is .New (t )
27
32
28
33
testCases := []struct {
29
- name string
30
- inputError error
31
- expected error
34
+ name string
35
+ inputError error
36
+ expected error
37
+ expectedStderr string
32
38
}{
33
39
{
34
- name : "OK error" ,
35
- inputError : status . Error ( codes . OK , "ok error" ),
36
- expected : status . Error ( codes . OK , "ok error") ,
40
+ name : "regular error" ,
41
+ inputError : cerrors . New ( "some error" ),
42
+ expectedStderr : "some error" ,
37
43
},
38
44
{
39
- name : "Canceled error" ,
40
- inputError : status .Error (codes .Canceled , "canceled error" ),
41
- expected : status . Error ( codes . Canceled , "canceled error" ) ,
45
+ name : "Canceled error" ,
46
+ inputError : status .Error (codes .Canceled , "canceled error" ),
47
+ expectedStderr : "canceled error" ,
42
48
},
43
49
{
44
- name : "Unknown error" ,
45
- inputError : status .Error (codes .Unknown , "unknown error" ),
46
- expected : status . Error ( codes . Unknown , "unknown error" ) ,
50
+ name : "Unknown error" ,
51
+ inputError : status .Error (codes .Unknown , "unknown error" ),
52
+ expectedStderr : "unknown error" ,
47
53
},
48
54
{
49
- name : "InvalidArgument error" ,
50
- inputError : status .Error (codes .InvalidArgument , "invalid argument error" ),
51
- expected : status . Error ( codes . InvalidArgument , "invalid argument error" ) ,
55
+ name : "InvalidArgument error" ,
56
+ inputError : status .Error (codes .InvalidArgument , "invalid argument error" ),
57
+ expectedStderr : "invalid argument error" ,
52
58
},
53
59
{
54
- name : "DeadlineExceeded error" ,
55
- inputError : status .Error (codes .DeadlineExceeded , "deadline exceeded error" ),
56
- expected : status . Error ( codes . DeadlineExceeded , "deadline exceeded error" ) ,
60
+ name : "DeadlineExceeded error" ,
61
+ inputError : status .Error (codes .DeadlineExceeded , "deadline exceeded error" ),
62
+ expectedStderr : "deadline exceeded error" ,
57
63
},
58
64
{
59
- name : "NotFound error" ,
60
- inputError : status .Error (codes .NotFound , "not found error" ),
61
- expected : nil ,
65
+ name : "NotFound error" ,
66
+ inputError : status .Error (codes .NotFound , "not found error" ),
67
+ expectedStderr : "not found error" ,
62
68
},
63
69
{
64
- name : "AlreadyExists error" ,
65
- inputError : status .Error (codes .AlreadyExists , "already exists error" ),
66
- expected : status .Error (codes .AlreadyExists , "already exists error" ),
70
+ name : "NotFound error with description" ,
71
+ inputError : status .Error (codes .NotFound , "failed to get pipeline: rpc error: code = NotFound " +
72
+ "desc = failed to get pipeline by ID: pipeline instance not found (ID: foo): pipeline instance not found" ),
73
+ expectedStderr : "failed to get pipeline by ID: pipeline instance not found (ID: foo): pipeline instance not found" ,
67
74
},
68
75
{
69
- name : "PermissionDenied error" ,
70
- inputError : status .Error (codes .PermissionDenied , "permission denied error" ),
71
- expected : status . Error ( codes . PermissionDenied , "permission denied error") ,
76
+ name : "AlreadyExists error" ,
77
+ inputError : status .Error (codes .AlreadyExists , "already exists error" ),
78
+ expectedStderr : "already exists error" ,
72
79
},
73
80
{
74
- name : "ResourceExhausted error" ,
75
- inputError : status .Error (codes .ResourceExhausted , "resource exhausted error" ),
76
- expected : status . Error ( codes . ResourceExhausted , "resource exhausted error") ,
81
+ name : "PermissionDenied error" ,
82
+ inputError : status .Error (codes .PermissionDenied , "permission denied error" ),
83
+ expectedStderr : "permission denied error" ,
77
84
},
78
85
{
79
- name : "FailedPrecondition error" ,
80
- inputError : status .Error (codes .FailedPrecondition , "failed precondition error" ),
81
- expected : status . Error ( codes . FailedPrecondition , "failed precondition error") ,
86
+ name : "ResourceExhausted error" ,
87
+ inputError : status .Error (codes .ResourceExhausted , "resource exhausted error" ),
88
+ expectedStderr : "resource exhausted error" ,
82
89
},
83
90
{
84
- name : "Aborted error" ,
85
- inputError : status .Error (codes .Aborted , "aborted error" ),
86
- expected : status . Error ( codes . Aborted , "aborted error") ,
91
+ name : "FailedPrecondition error" ,
92
+ inputError : status .Error (codes .FailedPrecondition , "failed precondition error" ),
93
+ expectedStderr : "failed precondition error" ,
87
94
},
88
95
{
89
- name : "OutOfRange error" ,
90
- inputError : status .Error (codes .OutOfRange , "out of range error" ),
91
- expected : status . Error ( codes . OutOfRange , "out of range error") ,
96
+ name : "Aborted error" ,
97
+ inputError : status .Error (codes .Aborted , "aborted error" ),
98
+ expectedStderr : "aborted error" ,
92
99
},
93
100
{
94
- name : "Unimplemented error" ,
95
- inputError : status .Error (codes .Unimplemented , "unimplemented error" ),
96
- expected : status . Error ( codes . Unimplemented , "unimplemented error") ,
101
+ name : "OutOfRange error" ,
102
+ inputError : status .Error (codes .OutOfRange , "out of range error" ),
103
+ expectedStderr : "out of range error" ,
97
104
},
98
105
{
99
- name : "Internal error" ,
100
- inputError : status .Error (codes .Internal , "internal error" ),
101
- expected : status . Error ( codes . Internal , "internal error") ,
106
+ name : "Unimplemented error" ,
107
+ inputError : status .Error (codes .Unimplemented , "unimplemented error" ),
108
+ expectedStderr : "unimplemented error" ,
102
109
},
103
110
{
104
- name : "Unavailable error" ,
105
- inputError : status .Error (codes .Unavailable , "unavailable error" ),
106
- expected : status . Error ( codes . Unavailable , "unavailable error") ,
111
+ name : "Internal error" ,
112
+ inputError : status .Error (codes .Internal , "internal error" ),
113
+ expectedStderr : "internal error" ,
107
114
},
108
115
{
109
- name : "DataLoss error" ,
110
- inputError : status .Error (codes .DataLoss , "data loss error" ),
111
- expected : status . Error ( codes . DataLoss , "data loss error") ,
116
+ name : "Unavailable error" ,
117
+ inputError : status .Error (codes .Unavailable , "unavailable error" ),
118
+ expectedStderr : "unavailable error" ,
112
119
},
113
120
{
114
- name : "Unauthenticated error" ,
115
- inputError : status .Error (codes .Unauthenticated , "unauthenticated error" ),
116
- expected : status .Error (codes .Unauthenticated , "unauthenticated error" ),
121
+ name : "DataLoss error" ,
122
+ inputError : status .Error (codes .DataLoss , "data loss error" ),
123
+ expectedStderr : "data loss error" ,
124
+ },
125
+ {
126
+ name : "Unauthenticated error" ,
127
+ inputError : status .Error (codes .Unauthenticated , "unauthenticated error" ),
128
+ expectedStderr : "unauthenticated error" ,
117
129
},
118
130
}
119
131
120
132
for _ , tc := range testCases {
121
133
t .Run (tc .name , func (t * testing.T ) {
122
134
is := is .New (t )
123
- result := handleExecuteError (tc .inputError )
135
+
136
+ oldStderr := os .Stderr
137
+ r , w , _ := os .Pipe ()
138
+ os .Stderr = w
139
+
140
+ result := handleError (tc .inputError )
141
+
142
+ w .Close ()
143
+ os .Stderr = oldStderr
144
+
145
+ var buf bytes.Buffer
146
+ io .Copy (& buf , r )
147
+
124
148
is .Equal (result , tc .expected )
149
+ is .Equal (strings .TrimSpace (buf .String ()), tc .expectedStderr )
125
150
})
126
151
}
127
152
}
0 commit comments