4
4
"crypto"
5
5
"crypto/rsa"
6
6
"encoding/json"
7
+ "errors"
7
8
"fmt"
8
9
"reflect"
9
10
"testing"
@@ -51,6 +52,7 @@ var jwtTestData = []struct {
51
52
claims jwt.Claims
52
53
valid bool
53
54
errors uint32
55
+ err []error
54
56
parser * jwt.Parser
55
57
signingMethod jwt.SigningMethod // The method to sign the JWT token for test purpose
56
58
}{
@@ -62,6 +64,7 @@ var jwtTestData = []struct {
62
64
true ,
63
65
0 ,
64
66
nil ,
67
+ nil ,
65
68
jwt .SigningMethodRS256 ,
66
69
},
67
70
{
@@ -71,6 +74,7 @@ var jwtTestData = []struct {
71
74
jwt.MapClaims {"foo" : "bar" , "exp" : float64 (time .Now ().Unix () - 100 )},
72
75
false ,
73
76
jwt .ValidationErrorExpired ,
77
+ []error {jwt .ErrTokenExpired },
74
78
nil ,
75
79
jwt .SigningMethodRS256 ,
76
80
},
@@ -81,6 +85,7 @@ var jwtTestData = []struct {
81
85
jwt.MapClaims {"foo" : "bar" , "nbf" : float64 (time .Now ().Unix () + 100 )},
82
86
false ,
83
87
jwt .ValidationErrorNotValidYet ,
88
+ []error {jwt .ErrTokenNotValidYet },
84
89
nil ,
85
90
jwt .SigningMethodRS256 ,
86
91
},
@@ -91,6 +96,7 @@ var jwtTestData = []struct {
91
96
jwt.MapClaims {"foo" : "bar" , "nbf" : float64 (time .Now ().Unix () + 100 ), "exp" : float64 (time .Now ().Unix () - 100 )},
92
97
false ,
93
98
jwt .ValidationErrorNotValidYet | jwt .ValidationErrorExpired ,
99
+ []error {jwt .ErrTokenNotValidYet },
94
100
nil ,
95
101
jwt .SigningMethodRS256 ,
96
102
},
@@ -101,6 +107,7 @@ var jwtTestData = []struct {
101
107
jwt.MapClaims {"foo" : "bar" },
102
108
false ,
103
109
jwt .ValidationErrorSignatureInvalid ,
110
+ []error {jwt .ErrTokenSignatureInvalid , rsa .ErrVerification },
104
111
nil ,
105
112
jwt .SigningMethodRS256 ,
106
113
},
@@ -111,6 +118,7 @@ var jwtTestData = []struct {
111
118
jwt.MapClaims {"foo" : "bar" },
112
119
false ,
113
120
jwt .ValidationErrorUnverifiable ,
121
+ []error {jwt .ErrTokenUnverifiable },
114
122
nil ,
115
123
jwt .SigningMethodRS256 ,
116
124
},
@@ -121,6 +129,7 @@ var jwtTestData = []struct {
121
129
jwt.MapClaims {"foo" : "bar" },
122
130
false ,
123
131
jwt .ValidationErrorSignatureInvalid ,
132
+ []error {jwt .ErrTokenSignatureInvalid },
124
133
nil ,
125
134
jwt .SigningMethodRS256 ,
126
135
},
@@ -131,6 +140,7 @@ var jwtTestData = []struct {
131
140
jwt.MapClaims {"foo" : "bar" },
132
141
false ,
133
142
jwt .ValidationErrorUnverifiable ,
143
+ []error {jwt .ErrTokenUnverifiable , errKeyFuncError },
134
144
nil ,
135
145
jwt .SigningMethodRS256 ,
136
146
},
@@ -141,6 +151,7 @@ var jwtTestData = []struct {
141
151
jwt.MapClaims {"foo" : "bar" },
142
152
false ,
143
153
jwt .ValidationErrorSignatureInvalid ,
154
+ []error {jwt .ErrTokenSignatureInvalid },
144
155
& jwt.Parser {ValidMethods : []string {"HS256" }},
145
156
jwt .SigningMethodRS256 ,
146
157
},
@@ -151,6 +162,7 @@ var jwtTestData = []struct {
151
162
jwt.MapClaims {"foo" : "bar" },
152
163
true ,
153
164
0 ,
165
+ nil ,
154
166
& jwt.Parser {ValidMethods : []string {"RS256" , "HS256" }},
155
167
jwt .SigningMethodRS256 ,
156
168
},
@@ -161,6 +173,7 @@ var jwtTestData = []struct {
161
173
jwt.MapClaims {"foo" : "bar" },
162
174
false ,
163
175
jwt .ValidationErrorSignatureInvalid ,
176
+ []error {jwt .ErrTokenSignatureInvalid },
164
177
& jwt.Parser {ValidMethods : []string {"RS256" , "HS256" }},
165
178
jwt .SigningMethodES256 ,
166
179
},
@@ -171,6 +184,7 @@ var jwtTestData = []struct {
171
184
jwt.MapClaims {"foo" : "bar" },
172
185
true ,
173
186
0 ,
187
+ nil ,
174
188
& jwt.Parser {ValidMethods : []string {"HS256" , "ES256" }},
175
189
jwt .SigningMethodES256 ,
176
190
},
@@ -181,6 +195,7 @@ var jwtTestData = []struct {
181
195
jwt.MapClaims {"foo" : json .Number ("123.4" )},
182
196
true ,
183
197
0 ,
198
+ nil ,
184
199
& jwt.Parser {UseJSONNumber : true },
185
200
jwt .SigningMethodRS256 ,
186
201
},
@@ -193,6 +208,7 @@ var jwtTestData = []struct {
193
208
},
194
209
true ,
195
210
0 ,
211
+ nil ,
196
212
& jwt.Parser {UseJSONNumber : true },
197
213
jwt .SigningMethodRS256 ,
198
214
},
@@ -203,6 +219,7 @@ var jwtTestData = []struct {
203
219
jwt.MapClaims {"foo" : "bar" , "exp" : json .Number (fmt .Sprintf ("%v" , time .Now ().Unix ()- 100 ))},
204
220
false ,
205
221
jwt .ValidationErrorExpired ,
222
+ []error {jwt .ErrTokenExpired },
206
223
& jwt.Parser {UseJSONNumber : true },
207
224
jwt .SigningMethodRS256 ,
208
225
},
@@ -213,6 +230,7 @@ var jwtTestData = []struct {
213
230
jwt.MapClaims {"foo" : "bar" , "nbf" : json .Number (fmt .Sprintf ("%v" , time .Now ().Unix ()+ 100 ))},
214
231
false ,
215
232
jwt .ValidationErrorNotValidYet ,
233
+ []error {jwt .ErrTokenNotValidYet },
216
234
& jwt.Parser {UseJSONNumber : true },
217
235
jwt .SigningMethodRS256 ,
218
236
},
@@ -223,6 +241,7 @@ var jwtTestData = []struct {
223
241
jwt.MapClaims {"foo" : "bar" , "nbf" : json .Number (fmt .Sprintf ("%v" , time .Now ().Unix ()+ 100 )), "exp" : json .Number (fmt .Sprintf ("%v" , time .Now ().Unix ()- 100 ))},
224
242
false ,
225
243
jwt .ValidationErrorNotValidYet | jwt .ValidationErrorExpired ,
244
+ []error {jwt .ErrTokenNotValidYet },
226
245
& jwt.Parser {UseJSONNumber : true },
227
246
jwt .SigningMethodRS256 ,
228
247
},
@@ -233,6 +252,7 @@ var jwtTestData = []struct {
233
252
jwt.MapClaims {"foo" : "bar" , "nbf" : json .Number (fmt .Sprintf ("%v" , time .Now ().Unix ()+ 100 ))},
234
253
true ,
235
254
0 ,
255
+ nil ,
236
256
& jwt.Parser {UseJSONNumber : true , SkipClaimsValidation : true },
237
257
jwt .SigningMethodRS256 ,
238
258
},
@@ -245,6 +265,7 @@ var jwtTestData = []struct {
245
265
},
246
266
true ,
247
267
0 ,
268
+ nil ,
248
269
& jwt.Parser {UseJSONNumber : true },
249
270
jwt .SigningMethodRS256 ,
250
271
},
@@ -257,6 +278,7 @@ var jwtTestData = []struct {
257
278
},
258
279
true ,
259
280
0 ,
281
+ nil ,
260
282
& jwt.Parser {UseJSONNumber : true },
261
283
jwt .SigningMethodRS256 ,
262
284
},
@@ -269,6 +291,7 @@ var jwtTestData = []struct {
269
291
},
270
292
true ,
271
293
0 ,
294
+ nil ,
272
295
& jwt.Parser {UseJSONNumber : true },
273
296
jwt .SigningMethodRS256 ,
274
297
},
@@ -281,6 +304,7 @@ var jwtTestData = []struct {
281
304
},
282
305
false ,
283
306
jwt .ValidationErrorMalformed ,
307
+ []error {jwt .ErrTokenMalformed },
284
308
& jwt.Parser {UseJSONNumber : true },
285
309
jwt .SigningMethodRS256 ,
286
310
},
@@ -293,6 +317,7 @@ var jwtTestData = []struct {
293
317
},
294
318
false ,
295
319
jwt .ValidationErrorMalformed ,
320
+ []error {jwt .ErrTokenMalformed },
296
321
& jwt.Parser {UseJSONNumber : true },
297
322
jwt .SigningMethodRS256 ,
298
323
},
@@ -325,6 +350,7 @@ func TestParser_Parse(t *testing.T) {
325
350
326
351
// Parse the token
327
352
var token * jwt.Token
353
+ var ve * jwt.ValidationError
328
354
var err error
329
355
var parser = data .parser
330
356
if parser == nil {
@@ -361,18 +387,34 @@ func TestParser_Parse(t *testing.T) {
361
387
if err == nil {
362
388
t .Errorf ("[%v] Expecting error. Didn't get one." , data .name )
363
389
} else {
390
+ if errors .As (err , & ve ) {
391
+ // compare the bitfield part of the error
392
+ if e := ve .Errors ; e != data .errors {
393
+ t .Errorf ("[%v] Errors don't match expectation. %v != %v" , data .name , e , data .errors )
394
+ }
395
+
396
+ if err .Error () == errKeyFuncError .Error () && ve .Inner != errKeyFuncError {
397
+ t .Errorf ("[%v] Inner error does not match expectation. %v != %v" , data .name , ve .Inner , errKeyFuncError )
398
+ }
399
+ }
400
+ }
401
+ }
364
402
365
- ve := err .(* jwt.ValidationError )
366
- // compare the bitfield part of the error
367
- if e := ve .Errors ; e != data .errors {
368
- t .Errorf ("[%v] Errors don't match expectation. %v != %v" , data .name , e , data .errors )
403
+ if data .err != nil {
404
+ if err == nil {
405
+ t .Errorf ("[%v] Expecting error(s). Didn't get one." , data .name )
406
+ } else {
407
+ var all = false
408
+ for _ , e := range data .err {
409
+ all = errors .Is (err , e )
369
410
}
370
411
371
- if err . Error () == errKeyFuncError . Error () && ve . Inner != errKeyFuncError {
372
- t .Errorf ("[%v] Inner error does not match expectation. %v != %v" , data .name , ve . Inner , errKeyFuncError )
412
+ if ! all {
413
+ t .Errorf ("[%v] Errors don't match expectation. %v should contain all of %v" , data .name , err , data . err )
373
414
}
374
415
}
375
416
}
417
+
376
418
if data .valid {
377
419
if token .Signature == "" {
378
420
t .Errorf ("[%v] Signature is left unpopulated after parsing" , data .name )
0 commit comments