1
1
package certificate
2
2
3
3
import (
4
- "fmt"
5
4
"testing"
6
5
time "time"
7
6
@@ -10,6 +9,7 @@ import (
10
9
tassert "github.com/stretchr/testify/assert"
11
10
12
11
"github.com/openservicemesh/osm/pkg/announcements"
12
+ "github.com/openservicemesh/osm/pkg/certificate/pem"
13
13
"github.com/openservicemesh/osm/pkg/messaging"
14
14
)
15
15
@@ -70,11 +70,8 @@ func TestRotor(t *testing.T) {
70
70
assert .NoError (err )
71
71
certRotateChan := msgBroker .GetCertPubSub ().Sub (announcements .CertificateRotated .String ())
72
72
73
- start := time .Now ()
74
- // Wait for one certificate rotation to be announced and terminate
73
+ // Wait for two certificate rotations to be announced and terminate
75
74
<- certRotateChan
76
-
77
- fmt .Printf ("It took %+v to rotate certificate %s\n " , time .Since (start ), cn )
78
75
newCert , err := certManager .IssueCertificate (cn , validityPeriod )
79
76
assert .NoError (err )
80
77
assert .NotEqual (certA .GetExpiration (), newCert .GetExpiration ())
@@ -216,9 +213,127 @@ func TestListCertificate(t *testing.T) {
216
213
func TestGetRootCertificate (t * testing.T ) {
217
214
assert := tassert .New (t )
218
215
219
- manager := & Manager {clients : []Issuer {& fakeIssuer {}}}
216
+ manager := & Manager {
217
+ keyIssuer : & issuer {ID : "fake-1" , Issuer : & fakeIssuer {}},
218
+ pubIssuer : & issuer {ID : "fake-1" , Issuer : & fakeIssuer {}},
219
+ }
220
220
221
221
got := manager .GetRootCertificate ()
222
222
223
223
assert .Equal (caCert , got )
224
224
}
225
+
226
+ func TestIssueCertificate (t * testing.T ) {
227
+ cn := CommonName ("fake-cert-cn" )
228
+ assert := tassert .New (t )
229
+
230
+ t .Run ("single key issuer" , func (t * testing.T ) {
231
+ cm := & Manager {
232
+ // The root certificate signing all newly issued certificates
233
+ keyIssuer : & issuer {ID : "id1" , Issuer : & fakeIssuer {id : "id1" }},
234
+ pubIssuer : & issuer {ID : "id1" , Issuer : & fakeIssuer {id : "id1" }},
235
+ }
236
+ // single keyIssuer, not cached
237
+ cert1 , err := cm .IssueCertificate (cn , time .Minute )
238
+ assert .NoError (err )
239
+ assert .NotNil (cert1 )
240
+ assert .Equal (cert1 .keyIssuer , "id1" )
241
+ assert .Equal (cert1 .pubIssuer , "id1" )
242
+ assert .Equal (cert1 .GetIssuingCA (), pem .RootCertificate ("id1" ))
243
+
244
+ // single keyIssuer cached
245
+ cert2 , err := cm .IssueCertificate (cn , time .Minute )
246
+ assert .NoError (err )
247
+ assert .Equal (cert1 , cert2 )
248
+
249
+ // single key issuer, old version cached
250
+ // TODO: could use informer logic to test mrc updates instead of just manually making changes.
251
+ cm .keyIssuer = & issuer {ID : "id2" , Issuer : & fakeIssuer {id : "id2" }}
252
+ cm .pubIssuer = & issuer {ID : "id2" , Issuer : & fakeIssuer {id : "id2" }}
253
+
254
+ cert3 , err := cm .IssueCertificate (cn , time .Minute )
255
+ assert .NoError (err )
256
+ assert .NotNil (cert3 )
257
+ assert .Equal (cert3 .keyIssuer , "id2" )
258
+ assert .Equal (cert3 .pubIssuer , "id2" )
259
+ assert .NotEqual (cert2 , cert3 )
260
+ assert .Equal (cert3 .GetIssuingCA (), pem .RootCertificate ("id2" ))
261
+ })
262
+
263
+ t .Run ("2 issuers" , func (t * testing.T ) {
264
+ cm := & Manager {
265
+ // The root certificate signing all newly issued certificates
266
+ keyIssuer : & issuer {ID : "id1" , Issuer : & fakeIssuer {id : "id1" }},
267
+ pubIssuer : & issuer {ID : "id2" , Issuer : & fakeIssuer {id : "id2" }},
268
+ }
269
+
270
+ // Not cached
271
+ cert1 , err := cm .IssueCertificate (cn , time .Minute )
272
+ assert .NoError (err )
273
+ assert .NotNil (cert1 )
274
+ assert .Equal (cert1 .keyIssuer , "id1" )
275
+ assert .Equal (cert1 .pubIssuer , "id2" )
276
+ assert .Equal (cert1 .GetIssuingCA (), pem .RootCertificate ("idid2" ))
277
+
278
+ // cached
279
+ cert2 , err := cm .IssueCertificate (cn , time .Minute )
280
+ assert .NoError (err )
281
+ assert .Equal (cert1 , cert2 )
282
+
283
+ // cached, but pubIssuer is removed
284
+ cm .pubIssuer = cm .keyIssuer
285
+ cert3 , err := cm .IssueCertificate (cn , time .Minute )
286
+ assert .NoError (err )
287
+ assert .NotEqual (cert1 , cert3 )
288
+ assert .Equal (cert3 .keyIssuer , "id1" )
289
+ assert .Equal (cert3 .pubIssuer , "id1" )
290
+ assert .Equal (cert3 .GetIssuingCA (), pem .RootCertificate ("id1" ))
291
+
292
+ // cached, but keyIssuer is old
293
+ cm .keyIssuer = & issuer {ID : "id2" , Issuer : & fakeIssuer {id : "id2" }}
294
+ cert4 , err := cm .IssueCertificate (cn , time .Minute )
295
+ assert .NoError (err )
296
+ assert .NotEqual (cert3 , cert4 )
297
+ assert .Equal (cert4 .keyIssuer , "id2" )
298
+ assert .Equal (cert4 .pubIssuer , "id1" )
299
+ assert .Equal (cert4 .GetIssuingCA (), pem .RootCertificate ("idid1" ))
300
+
301
+ // cached, but pubIssuer is old
302
+ cm .pubIssuer = & issuer {ID : "id3" , Issuer : & fakeIssuer {id : "id3" }}
303
+ cert5 , err := cm .IssueCertificate (cn , time .Minute )
304
+ assert .NoError (err )
305
+ assert .NotEqual (cert4 , cert5 )
306
+ assert .Equal (cert5 .keyIssuer , "id2" )
307
+ assert .Equal (cert5 .pubIssuer , "id3" )
308
+ assert .Equal (cert5 .GetIssuingCA (), pem .RootCertificate ("idid3" ))
309
+ })
310
+
311
+ t .Run ("bad issuers" , func (t * testing.T ) {
312
+ cm := & Manager {
313
+ // The root certificate signing all newly issued certificates
314
+ keyIssuer : & issuer {ID : "id1" , Issuer : & fakeIssuer {id : "id1" , err : true }},
315
+ pubIssuer : & issuer {ID : "id2" , Issuer : & fakeIssuer {id : "id2" , err : true }},
316
+ }
317
+
318
+ // bad private key
319
+ cert , err := cm .IssueCertificate (cn , time .Minute )
320
+ assert .Nil (cert )
321
+ assert .EqualError (err , "id1 failed" )
322
+
323
+ // bad public key
324
+ cm .keyIssuer = & issuer {ID : "id3" , Issuer : & fakeIssuer {id : "id3" }}
325
+ cert , err = cm .IssueCertificate (cn , time .Minute )
326
+ assert .Nil (cert )
327
+ assert .EqualError (err , "id2 failed" )
328
+
329
+ // insert a cached cert
330
+ cm .pubIssuer = cm .keyIssuer
331
+ cert , err = cm .IssueCertificate (cn , time .Minute )
332
+ assert .NoError (err )
333
+
334
+ // bad public key on an existing cached cert, because the pubIssuer is new
335
+ cm .pubIssuer = & issuer {ID : "id1" , Issuer : & fakeIssuer {id : "id1" , err : true }}
336
+ cert , err = cm .IssueCertificate (cn , time .Minute )
337
+ assert .EqualError (err , "id1 failed" )
338
+ })
339
+ }
0 commit comments