github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/container/lxd/certificate_test.go (about) 1 // Copyright 2018 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package lxd_test 5 6 import ( 7 "bytes" 8 "encoding/pem" 9 10 "github.com/juju/errors" 11 jc "github.com/juju/testing/checkers" 12 gc "gopkg.in/check.v1" 13 14 "github.com/juju/juju/container/lxd" 15 lxdtesting "github.com/juju/juju/container/lxd/testing" 16 ) 17 18 var _ = gc.Suite(&certSuite{}) 19 20 type certSuite struct { 21 lxdtesting.BaseSuite 22 } 23 24 func (s *certSuite) TestGenerateClientCertificate(c *gc.C) { 25 cert, err := lxd.GenerateClientCertificate() 26 c.Assert(err, jc.ErrorIsNil) 27 c.Check(cert.Validate(), jc.ErrorIsNil) 28 } 29 30 func (s *certSuite) TestValidateMissingCertPEM(c *gc.C) { 31 cert := lxd.NewCertificate([]byte(testCertPEM), nil) 32 c.Check(cert.Validate(), jc.Satisfies, errors.IsNotValid) 33 } 34 35 func (s *certSuite) TestValidateMissingKeyPEM(c *gc.C) { 36 cert := lxd.NewCertificate(nil, []byte(testKeyPEM)) 37 c.Check(cert.Validate(), jc.Satisfies, errors.IsNotValid) 38 } 39 40 func (s *certSuite) TestWriteCertPEM(c *gc.C) { 41 cert := lxd.NewCertificate([]byte(testCertPEM), []byte(testKeyPEM)) 42 43 var buf bytes.Buffer 44 err := cert.WriteCertPEM(&buf) 45 c.Assert(err, jc.ErrorIsNil) 46 c.Check(buf.String(), gc.Equals, testCertPEM) 47 } 48 49 func (s *certSuite) TestWriteKeyPEM(c *gc.C) { 50 cert := lxd.NewCertificate([]byte(testCertPEM), []byte(testKeyPEM)) 51 52 var buf bytes.Buffer 53 err := cert.WriteKeyPEM(&buf) 54 c.Assert(err, jc.ErrorIsNil) 55 c.Check(buf.String(), gc.Equals, testKeyPEM) 56 } 57 58 func (s *certSuite) TestFingerprint(c *gc.C) { 59 cert := lxd.NewCertificate([]byte(testCertPEM), []byte(testKeyPEM)) 60 fingerprint, err := cert.Fingerprint() 61 c.Assert(err, jc.ErrorIsNil) 62 63 c.Check(fingerprint, gc.Equals, testCertFingerprint) 64 } 65 66 func (s *certSuite) TestX509Okay(c *gc.C) { 67 cert := lxd.NewCertificate([]byte(testCertPEM), []byte(testKeyPEM)) 68 x509Cert, err := cert.X509() 69 c.Assert(err, jc.ErrorIsNil) 70 71 block, _ := pem.Decode([]byte(testCertPEM)) 72 c.Assert(block, gc.NotNil) 73 c.Check(string(x509Cert.Raw), gc.Equals, string(block.Bytes)) 74 } 75 76 func (s *certSuite) TestX509ZeroValue(c *gc.C) { 77 cert := &lxd.Certificate{} 78 _, err := cert.X509() 79 c.Check(err, gc.ErrorMatches, `invalid cert PEM \(0 bytes\)`) 80 } 81 82 func (s *certSuite) TestX509BadPEM(c *gc.C) { 83 cert := lxd.NewCertificate([]byte("some-invalid-pem"), nil) 84 _, err := cert.X509() 85 c.Check(err, gc.ErrorMatches, `invalid cert PEM \(\d+ bytes\)`) 86 } 87 88 func (s *certSuite) TestAsCreateRequestValidCert(c *gc.C) { 89 cert := lxd.NewCertificate([]byte(testCertPEM), []byte(testKeyPEM)) 90 cert.Name = "juju-client-cert" 91 req, err := cert.AsCreateRequest() 92 c.Assert(err, jc.ErrorIsNil) 93 94 c.Check(req.Name, gc.Equals, "juju-client-cert") 95 c.Check(req.Type, gc.Equals, "client") 96 c.Check(req.Certificate, gc.Not(gc.Equals), "") 97 } 98 99 func (s *certSuite) TestAsCreateReqInvalidCert(c *gc.C) { 100 cert := lxd.NewCertificate([]byte("some-invalid-pem"), nil) 101 cert.Name = "juju-client-cert" 102 103 _, err := cert.AsCreateRequest() 104 c.Assert(err, gc.ErrorMatches, "failed to decode certificate PEM") 105 } 106 107 const ( 108 testCertFingerprint = "1c5156027fe71cfd0f7db807123e6873879f0f9754e08eab151f224783b2bff0" 109 testCertPEM = ` 110 -----BEGIN CERTIFICATE----- 111 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 142 zxBNMbP3 143 -----END CERTIFICATE----- 144 ` 145 testKeyPEM = ` 146 -----BEGIN CERTIFICATE----- 147 MIIF0jCCA7qgAwIBAgIQEFjWOkN8qXNbWKtveG5ddTANBgkqhkiG9w0BAQsFADA2 148 MRwwGgYDVQQKExNsaW51eGNvbnRhaW5lcnMub3JnMRYwFAYDVQQDDA1lc25vd0Bm 149 dXJpb3VzMB4XDTE1MTAwMTIxMjAyMloXDTI1MDkyODIxMjAyMlowNjEcMBoGA1UE 150 ChMTbGludXhjb250YWluZXJzLm9yZzEWMBQGA1UEAwwNZXNub3dAZnVyaW91czCC 151 AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMQgSXXaZMWImOP6IFBy/3E6 152 JFHwrgy5YMqRikoernt5cMr838nNdNLW9woBIVRZfZIFbAjf38PGBQYAs/4G/WIt 153 not+used+for+anything+really+just+make+sure+it+differs+from+cert 154 BmxTLbEvz87PrrsoVR9K5R261ciAFdFiE7Jbh15qUm4qXYHT9QgJeXnDtV/bxO+Y 155 Rrh9WfSP8x0SKrAoO7uhjI9Y276c8+etF0EY8u/+joqS8cZbOLXMuafgtF5E1trd 156 QNRHwiIhEUVqctdguzMHbhFfKthq6vP8qhWNOF6FowZgSg+Q5Tvm1jaU++BNPqWi 157 Zxy0qbMLRW8i/ABuTmzqtS3AHTtIFgdHx+BeT4W9LwU2dsO3Ijni2Rutmuz04rT+ 158 zxBNMbP3 159 -----END CERTIFICATE----- 160 ` 161 )