github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/resource/resourceadapters/charmstore_test.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package resourceadapters_test 5 6 import ( 7 "fmt" 8 "sync/atomic" 9 10 "github.com/juju/errors" 11 "github.com/juju/testing" 12 jc "github.com/juju/testing/checkers" 13 gc "gopkg.in/check.v1" 14 15 "github.com/juju/juju/charmstore" 16 "github.com/juju/juju/resource/resourceadapters" 17 ) 18 19 type CharmStoreSuite struct { 20 testing.IsolationSuite 21 22 resourceClient *testResourceClient 23 } 24 25 var _ = gc.Suite(&CharmStoreSuite{}) 26 27 func (s *CharmStoreSuite) SetUpTest(c *gc.C) { 28 s.IsolationSuite.SetUpTest(c) 29 s.resourceClient = &testResourceClient{ 30 stub: &testing.Stub{}, 31 } 32 } 33 34 func (s *CharmStoreSuite) TestGetResourceTerminates(c *gc.C) { 35 msg := "trust" 36 attempts := int32(0) 37 s.resourceClient.getResourceF = func(req charmstore.ResourceRequest) (data charmstore.ResourceData, err error) { 38 atomic.AddInt32(&attempts, 1) 39 return charmstore.ResourceData{}, errors.New(msg) 40 } 41 csRes := resourceadapters.NewCSRetryClientForTest(s.resourceClient) 42 43 _, err := csRes.GetResource(charmstore.ResourceRequest{}) 44 c.Assert(err, gc.ErrorMatches, fmt.Sprintf("failed after retrying: %v", msg)) 45 // Ensure we logged attempts @ WARNING. 46 c.Assert(c.GetTestLog(), jc.Contains, fmt.Sprintf("WARNING juju.resource.resourceadapters attempt %d/%d to download resource ", attempts, attempts)) 47 48 callsMade := []string{} 49 for i := int32(0); i < attempts; i++ { 50 callsMade = append(callsMade, "GetResource") 51 } 52 c.Assert(attempts, jc.GreaterThan, 1) 53 s.resourceClient.stub.CheckCallNames(c, callsMade...) 54 } 55 56 func (s *CharmStoreSuite) TestGetResourceAbortedOnNotFound(c *gc.C) { 57 msg := "trust" 58 s.assertAbortedGetResourceOnError(c, 59 resourceadapters.NewCSRetryClientForTest(s.resourceClient), 60 errors.NotFoundf(msg), 61 fmt.Sprintf("%v not found", msg), 62 ) 63 } 64 65 func (s *CharmStoreSuite) TestGetResourceAbortedOnNotValid(c *gc.C) { 66 msg := "trust" 67 s.assertAbortedGetResourceOnError(c, 68 resourceadapters.NewCSRetryClientForTest(s.resourceClient), 69 errors.NotValidf(msg), 70 fmt.Sprintf("%v not valid", msg), 71 ) 72 } 73 74 func (s *CharmStoreSuite) assertAbortedGetResourceOnError(c *gc.C, csRes *resourceadapters.CSRetryClient, expectedError error, expectedMessage string) { 75 s.resourceClient.getResourceF = func(req charmstore.ResourceRequest) (data charmstore.ResourceData, err error) { 76 return charmstore.ResourceData{}, expectedError 77 } 78 _, err := csRes.GetResource(charmstore.ResourceRequest{}) 79 c.Assert(err, gc.ErrorMatches, expectedMessage) 80 c.Assert(c.GetTestLog(), gc.Not(jc.Contains), "WARNING juju.resource.resourceadapters") 81 // Since we have aborted re-tries, we should only call GetResources once. 82 s.resourceClient.stub.CheckCallNames(c, "GetResource") 83 } 84 85 type testResourceClient struct { 86 stub *testing.Stub 87 88 getResourceF func(req charmstore.ResourceRequest) (data charmstore.ResourceData, err error) 89 } 90 91 func (f *testResourceClient) GetResource(req charmstore.ResourceRequest) (data charmstore.ResourceData, err error) { 92 f.stub.AddCall("GetResource", req) 93 return f.getResourceF(req) 94 }