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  )