1
// Copyright 2016 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
12
"github.com/juju/errors"
13
"github.com/juju/testing"
14
jc "github.com/juju/testing/checkers"
15
"github.com/juju/testing/filetesting"
16
gc "gopkg.in/check.v1"
17
charmresource "gopkg.in/juju/charm.v6-unstable/resource"
19
"github.com/juju/juju/resource/context"
22
var _ = gc.Suite(&UtilsSuite{})
24
type UtilsSuite struct {
25
testing.IsolationSuite
31
func (s *UtilsSuite) SetUpTest(c *gc.C) {
32
s.IsolationSuite.SetUpTest(c)
34
s.stub = &testing.Stub{}
35
s.matcher = &stubMatcher{stub: s.stub}
38
func (s *UtilsSuite) newReader(c *gc.C, content string) (io.ReadCloser, charmresource.Fingerprint) {
39
r := filetesting.NewStubFile(s.stub, bytes.NewBufferString(content))
41
tmpReader := strings.NewReader(content)
42
fp, err := charmresource.GenerateFingerprint(tmpReader)
43
c.Assert(err, jc.ErrorIsNil)
48
func (s *UtilsSuite) TestFingerprintMatchesOkay(c *gc.C) {
49
r, expected := s.newReader(c, "spam")
50
s.matcher.ReturnOpen = r
51
s.matcher.ReturnGenerateFingerprint = expected
52
matcher := context.FingerprintMatcher{
54
GenerateFingerprint: s.matcher.GenerateFingerprint,
57
matches, err := matcher.FingerprintMatches("some/filename.txt", expected)
58
c.Assert(err, jc.ErrorIsNil)
60
c.Check(matches, jc.IsTrue)
63
func (s *UtilsSuite) TestFingerprintMatchesDepCalls(c *gc.C) {
64
r, expected := s.newReader(c, "spam")
65
s.matcher.ReturnOpen = r
66
s.matcher.ReturnGenerateFingerprint = expected
67
matcher := context.FingerprintMatcher{
69
GenerateFingerprint: s.matcher.GenerateFingerprint,
72
matches, err := matcher.FingerprintMatches("some/filename.txt", expected)
73
c.Assert(matches, jc.IsTrue)
74
c.Assert(err, jc.ErrorIsNil)
76
s.stub.CheckCallNames(c, "Open", "GenerateFingerprint", "Close")
77
s.stub.CheckCall(c, 0, "Open", "some/filename.txt")
78
s.stub.CheckCall(c, 1, "GenerateFingerprint", r)
81
func (s *UtilsSuite) TestFingerprintMatchesNotFound(c *gc.C) {
82
_, expected := s.newReader(c, "spam")
83
matcher := context.FingerprintMatcher{
86
s.stub.SetErrors(os.ErrNotExist)
88
matches, err := matcher.FingerprintMatches("some/filename.txt", expected)
89
c.Assert(err, jc.ErrorIsNil)
91
c.Check(matches, jc.IsFalse)
92
s.stub.CheckCallNames(c, "Open")
95
func (s *UtilsSuite) TestFingerprintMatchesOpenFailed(c *gc.C) {
96
_, expected := s.newReader(c, "spam")
97
matcher := context.FingerprintMatcher{
100
failure := errors.New("<failed>")
101
s.stub.SetErrors(failure)
103
_, err := matcher.FingerprintMatches("some/filename.txt", expected)
105
c.Check(errors.Cause(err), gc.Equals, failure)
106
s.stub.CheckCallNames(c, "Open")
109
func (s *UtilsSuite) TestFingerprintMatchesGenerateFingerprintFailed(c *gc.C) {
110
r, expected := s.newReader(c, "spam")
111
s.matcher.ReturnOpen = r
112
matcher := context.FingerprintMatcher{
113
Open: s.matcher.Open,
114
GenerateFingerprint: s.matcher.GenerateFingerprint,
116
failure := errors.New("<failed>")
117
s.stub.SetErrors(nil, failure)
119
_, err := matcher.FingerprintMatches("some/filename.txt", expected)
121
c.Check(errors.Cause(err), gc.Equals, failure)
122
s.stub.CheckCallNames(c, "Open", "GenerateFingerprint", "Close")
125
type stubMatcher struct {
128
ReturnOpen io.ReadCloser
129
ReturnGenerateFingerprint charmresource.Fingerprint
132
func (s *stubMatcher) Open(filename string) (io.ReadCloser, error) {
133
s.stub.AddCall("Open", filename)
134
if err := s.stub.NextErr(); err != nil {
135
return nil, errors.Trace(err)
138
return s.ReturnOpen, nil
141
func (s *stubMatcher) GenerateFingerprint(r io.Reader) (charmresource.Fingerprint, error) {
142
s.stub.AddCall("GenerateFingerprint", r)
143
if err := s.stub.NextErr(); err != nil {
144
return charmresource.Fingerprint{}, errors.Trace(err)
147
return s.ReturnGenerateFingerprint, nil