github.com/juju/charm/v11@v11.2.0/resource/fingerprint_test.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the LGPLv3, see LICENCE file for details.
     3  
     4  package resource_test
     5  
     6  import (
     7  	"crypto/sha512"
     8  	"encoding/hex"
     9  	"strings"
    10  
    11  	"github.com/juju/errors"
    12  	jc "github.com/juju/testing/checkers"
    13  	gc "gopkg.in/check.v1"
    14  
    15  	"github.com/juju/charm/v11/resource"
    16  )
    17  
    18  func newFingerprint(c *gc.C, data string) ([]byte, string) {
    19  	hash := sha512.New384()
    20  	_, err := hash.Write([]byte(data))
    21  	c.Assert(err, jc.ErrorIsNil)
    22  	raw := hash.Sum(nil)
    23  
    24  	hexStr := hex.EncodeToString(raw)
    25  	return raw, hexStr
    26  }
    27  
    28  var _ = gc.Suite(&FingerprintSuite{})
    29  
    30  type FingerprintSuite struct{}
    31  
    32  func (s *FingerprintSuite) TestNewFingerprintOkay(c *gc.C) {
    33  	expected, _ := newFingerprint(c, "spamspamspam")
    34  
    35  	fp, err := resource.NewFingerprint(expected)
    36  	c.Assert(err, jc.ErrorIsNil)
    37  	raw := fp.Bytes()
    38  
    39  	c.Check(raw, jc.DeepEquals, expected)
    40  }
    41  
    42  func (s *FingerprintSuite) TestNewFingerprintTooSmall(c *gc.C) {
    43  	expected, _ := newFingerprint(c, "spamspamspam")
    44  
    45  	_, err := resource.NewFingerprint(expected[:10])
    46  
    47  	c.Check(err, jc.Satisfies, errors.IsNotValid)
    48  	c.Check(err, gc.ErrorMatches, `.*too small.*`)
    49  }
    50  
    51  func (s *FingerprintSuite) TestNewFingerprintTooBig(c *gc.C) {
    52  	expected, _ := newFingerprint(c, "spamspamspam")
    53  
    54  	_, err := resource.NewFingerprint(append(expected, 1, 2, 3))
    55  
    56  	c.Check(err, jc.Satisfies, errors.IsNotValid)
    57  	c.Check(err, gc.ErrorMatches, `.*too big.*`)
    58  }
    59  
    60  func (s *FingerprintSuite) TestParseFingerprintOkay(c *gc.C) {
    61  	_, expected := newFingerprint(c, "spamspamspam")
    62  
    63  	fp, err := resource.ParseFingerprint(expected)
    64  	c.Assert(err, jc.ErrorIsNil)
    65  	hex := fp.String()
    66  
    67  	c.Check(hex, jc.DeepEquals, expected)
    68  }
    69  
    70  func (s *FingerprintSuite) TestParseFingerprintNonHex(c *gc.C) {
    71  	_, err := resource.ParseFingerprint("abc") // not hex
    72  
    73  	c.Check(err, gc.ErrorMatches, `.*odd length hex string.*`)
    74  }
    75  
    76  func (s *FingerprintSuite) TestGenerateFingerprint(c *gc.C) {
    77  	expected, _ := newFingerprint(c, "spamspamspam")
    78  	data := strings.NewReader("spamspamspam")
    79  
    80  	fp, err := resource.GenerateFingerprint(data)
    81  	c.Assert(err, jc.ErrorIsNil)
    82  	raw := fp.Bytes()
    83  
    84  	c.Check(raw, jc.DeepEquals, expected)
    85  }
    86  
    87  func (s *FingerprintSuite) TestString(c *gc.C) {
    88  	raw, expected := newFingerprint(c, "spamspamspam")
    89  	fp, err := resource.NewFingerprint(raw)
    90  	c.Assert(err, jc.ErrorIsNil)
    91  
    92  	hex := fp.String()
    93  
    94  	c.Check(hex, gc.Equals, expected)
    95  }
    96  
    97  func (s *FingerprintSuite) TestRoundtripString(c *gc.C) {
    98  	_, expected := newFingerprint(c, "spamspamspam")
    99  
   100  	fp, err := resource.ParseFingerprint(expected)
   101  	c.Assert(err, jc.ErrorIsNil)
   102  	hex := fp.String()
   103  
   104  	c.Check(hex, gc.Equals, expected)
   105  }
   106  
   107  func (s *FingerprintSuite) TestBytes(c *gc.C) {
   108  	expected, _ := newFingerprint(c, "spamspamspam")
   109  	fp, err := resource.NewFingerprint(expected)
   110  	c.Assert(err, jc.ErrorIsNil)
   111  
   112  	raw := fp.Bytes()
   113  
   114  	c.Check(raw, jc.DeepEquals, expected)
   115  }
   116  
   117  func (s *FingerprintSuite) TestRoundtripBytes(c *gc.C) {
   118  	expected, _ := newFingerprint(c, "spamspamspam")
   119  
   120  	fp, err := resource.NewFingerprint(expected)
   121  	c.Assert(err, jc.ErrorIsNil)
   122  	raw := fp.Bytes()
   123  
   124  	c.Check(raw, jc.DeepEquals, expected)
   125  }
   126  
   127  func (s *FingerprintSuite) TestValidateOkay(c *gc.C) {
   128  	raw, _ := newFingerprint(c, "spamspamspam")
   129  	fp, err := resource.NewFingerprint(raw)
   130  	c.Assert(err, jc.ErrorIsNil)
   131  
   132  	err = fp.Validate()
   133  
   134  	c.Check(err, jc.ErrorIsNil)
   135  }
   136  
   137  func (s *FingerprintSuite) TestValidateZero(c *gc.C) {
   138  	var fp resource.Fingerprint
   139  	err := fp.Validate()
   140  
   141  	c.Check(err, jc.Satisfies, errors.IsNotValid)
   142  	c.Check(err, gc.ErrorMatches, `zero-value fingerprint not valid`)
   143  }