1 package x509_test
2
3 import (
4 "errors"
5 "fmt"
6 "reflect"
7 "testing"
8
9 "github.com/google/certificate-transparency-go/x509"
10 )
11
12 func TestErrors(t *testing.T) {
13 var tests = []struct {
14 errs *x509.Errors
15 want string
16 wantVerbose string
17 wantFatal bool
18 wantFirstFatal error
19 }{
20 {
21 errs: &x509.Errors{Errs: []x509.Error{
22 {Summary: "Error", Field: "a.b.c"},
23 }},
24 want: "Error",
25 wantVerbose: "Error (a.b.c)",
26 },
27 {
28 errs: &x509.Errors{Errs: []x509.Error{
29 {
30 Summary: "Error",
31 Field: "a.b.c",
32 SpecRef: "RFC5280 s4.1.2.2",
33 SpecText: "The serial number MUST be a positive integer",
34 Category: x509.MalformedCertificate,
35 },
36 }},
37 want: "Error",
38 wantVerbose: "Error (a.b.c: Certificate does not comply with MUST clause in spec: RFC5280 s4.1.2.2, 'The serial number MUST be a positive integer')",
39 },
40 {
41 errs: &x509.Errors{Errs: []x509.Error{
42 {
43 Summary: "Error",
44 Field: "a.b.c",
45 SpecRef: "RFC5280 s4.1.2.2",
46 SpecText: "The serial number MUST be a positive integer",
47 },
48 }},
49 want: "Error",
50 wantVerbose: "Error (a.b.c: RFC5280 s4.1.2.2, 'The serial number MUST be a positive integer')",
51 },
52 {
53 errs: &x509.Errors{Errs: []x509.Error{
54 {
55 Summary: "Error",
56 Field: "a.b.c",
57 SpecRef: "RFC5280 s4.1.2.2",
58 Category: x509.MalformedCertificate,
59 },
60 }},
61 want: "Error",
62 wantVerbose: "Error (a.b.c: Certificate does not comply with MUST clause in spec: RFC5280 s4.1.2.2)",
63 },
64 {
65 errs: &x509.Errors{Errs: []x509.Error{
66 {
67 Summary: "Error",
68 Field: "a.b.c",
69 SpecText: "The serial number MUST be a positive integer",
70 Category: x509.MalformedCertificate,
71 },
72 }},
73 want: "Error",
74 wantVerbose: "Error (a.b.c: Certificate does not comply with MUST clause in spec: 'The serial number MUST be a positive integer')",
75 },
76 {
77 errs: &x509.Errors{Errs: []x509.Error{
78 {
79 Summary: "Error",
80 Field: "a.b.c",
81 SpecRef: "RFC5280 s4.1.2.2",
82 },
83 }},
84 want: "Error",
85 wantVerbose: "Error (a.b.c: RFC5280 s4.1.2.2)",
86 },
87 {
88 errs: &x509.Errors{Errs: []x509.Error{
89 {
90 Summary: "Error",
91 Field: "a.b.c",
92 SpecText: "The serial number MUST be a positive integer",
93 },
94 }},
95 want: "Error",
96 wantVerbose: "Error (a.b.c: 'The serial number MUST be a positive integer')",
97 },
98 {
99 errs: &x509.Errors{Errs: []x509.Error{
100 {
101 Summary: "Error",
102 Field: "a.b.c",
103 Category: x509.MalformedCertificate,
104 },
105 }},
106 want: "Error",
107 wantVerbose: "Error (a.b.c: Certificate does not comply with MUST clause in spec)",
108 },
109 {
110 errs: &x509.Errors{Errs: []x509.Error{
111 {Summary: "Error"},
112 }},
113 want: "Error",
114 wantVerbose: "Error",
115 },
116 {
117 errs: &x509.Errors{Errs: []x509.Error{
118 {Summary: "Error\nwith newline", Field: "x", Category: x509.InvalidASN1DER},
119 }},
120 want: "Error\nwith newline",
121 wantVerbose: "Error\nwith newline (x: Invalid ASN.1 distinguished encoding)",
122 },
123 {
124 errs: &x509.Errors{Errs: []x509.Error{
125 {Summary: "Error1", Field: "a.b.c"},
126 {Summary: "Error2", Field: "a.b.c.d"},
127 {Summary: "Error3", Field: "x.y.z"},
128 }},
129 want: "Errors:\n Error1\n Error2\n Error3",
130 wantVerbose: "Errors:\n Error1 (a.b.c)\n Error2 (a.b.c.d)\n Error3 (x.y.z)",
131 },
132 {
133 errs: &x509.Errors{Errs: []x509.Error{
134 {Summary: "Error1", Field: "a.b.c"},
135 {Summary: "Error2", Field: "a.b.c.d", Fatal: true},
136 {Summary: "Error3", Field: "x.y.z"},
137 }},
138 want: "Errors:\n Error1\n Error2\n Error3",
139 wantVerbose: "Errors:\n Error1 (a.b.c)\n Error2 (a.b.c.d)\n Error3 (x.y.z)",
140 wantFatal: true,
141 },
142 }
143
144 for _, test := range tests {
145 if got := test.errs.Error(); got != test.want {
146 t.Errorf("Errors(%+v).Error()=%q; want %q", test.errs, got, test.want)
147 }
148 if got := test.errs.VerboseError(); got != test.wantVerbose {
149 t.Errorf("Errors(%+v).VerboseError()=%q; want %q", test.errs, got, test.wantVerbose)
150 }
151 if got := test.errs.Fatal(); got != test.wantFatal {
152 t.Errorf("Errors(%+v).Fatal()=%v; want %v", test.errs, got, test.wantFatal)
153 }
154 }
155 }
156
157 func TestErrorsRawAppend(t *testing.T) {
158
159 var errs *x509.Errors
160 if got, want := errs.Empty(), true; got != want {
161 t.Errorf("Errors().Empty()=%t; want %t", got, want)
162 }
163
164 errs = &x509.Errors{}
165 if got, want := errs.Error(), ""; got != want {
166 t.Errorf("Errors().Error()=%q; want %q", got, want)
167 }
168 if got, want := errs.Empty(), true; got != want {
169 t.Errorf("Errors().Empty()=%t; want %t", got, want)
170 }
171 errs.Errs = append(errs.Errs, x509.Error{
172 Summary: "Error",
173 Field: "a.b.c",
174 SpecRef: "RFC5280 s4.1.2.2"})
175 if got, want := errs.VerboseError(), "Error (a.b.c: RFC5280 s4.1.2.2)"; got != want {
176 t.Errorf("Errors(%+v).Error=%q; want %q", errs, got, want)
177 }
178 if got, want := errs.Empty(), false; got != want {
179 t.Errorf("Errors().Empty()=%t; want %t", got, want)
180 }
181 }
182
183 func TestErrorsFilter(t *testing.T) {
184 var errs x509.Errors
185 id := x509.ErrMaxID + 2
186 errs.AddID(id, "arg1", 2, "arg3")
187 baseErr := errs.Error()
188
189 errs.AddID(x509.ErrMaxID + 1)
190 if got, want := errs.Error(), fmt.Sprintf("Errors:\n %s\n E%03d: Unknown error ID %v: args []", baseErr, x509.ErrMaxID+1, x509.ErrMaxID+1); got != want {
191 t.Errorf("Errors(%+v).Error=%q; want %q", errs, got, want)
192 }
193
194 errList := fmt.Sprintf("%d, %d", x509.ErrMaxID+1, x509.ErrMaxID+1)
195 filter := x509.ErrorFilter(errList)
196 errs2 := errs.Filter(filter)
197 if got, want := errs2.Error(), baseErr; got != want {
198 t.Errorf("Errors(%+v).Error=%q; want %q", errs, got, want)
199 }
200 }
201
202 func TestErrorsAppend(t *testing.T) {
203 errA := errors.New("A")
204 errB := errors.New("B")
205 errC := errors.New("C")
206 errD := errors.New("D")
207 tests := []struct {
208 left, right, want *x509.NonFatalErrors
209 }{
210 {
211 left: &x509.NonFatalErrors{Errors: []error{errA}},
212 right: &x509.NonFatalErrors{Errors: []error{errB}},
213 want: &x509.NonFatalErrors{Errors: []error{errA, errB}},
214 },
215 {
216 left: &x509.NonFatalErrors{Errors: []error{errA, errB}},
217 right: &x509.NonFatalErrors{Errors: []error{errC, errD}},
218 want: &x509.NonFatalErrors{Errors: []error{errA, errB, errC, errD}},
219 },
220 {
221 left: nil,
222 right: &x509.NonFatalErrors{Errors: []error{errC, errD}},
223 want: &x509.NonFatalErrors{Errors: []error{errC, errD}},
224 },
225 {
226 left: &x509.NonFatalErrors{Errors: []error{errC, errD}},
227 right: nil,
228 want: &x509.NonFatalErrors{Errors: []error{errC, errD}},
229 },
230 {
231 left: nil,
232 right: nil,
233 want: nil,
234 },
235 {
236 left: &x509.NonFatalErrors{Errors: []error{}},
237 right: nil,
238 want: &x509.NonFatalErrors{Errors: []error{}},
239 },
240 }
241 for _, test := range tests {
242 got := test.left.Append(test.right)
243 if !reflect.DeepEqual(got, test.want) {
244 t.Errorf("(%+v).Append(%+v)=%v, want %v", test.left, test.right, got, test.want)
245 }
246 }
247 }
248
View as plain text