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  }