github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/charmstore/client_test.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package charmstore
     5  
     6  import (
     7  	"io/ioutil"
     8  	"strings"
     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  	"gopkg.in/juju/charm.v6-unstable"
    15  	"gopkg.in/juju/charm.v6-unstable/resource"
    16  	"gopkg.in/juju/charmrepo.v2-unstable/csclient"
    17  	"gopkg.in/juju/charmrepo.v2-unstable/csclient/params"
    18  )
    19  
    20  var _ = gc.Suite(&ClientSuite{})
    21  
    22  type ClientSuite struct {
    23  	testing.IsolationSuite
    24  	wrapper *fakeWrapper
    25  	cache   *fakeMacCache
    26  }
    27  
    28  func (s *ClientSuite) SetUpTest(c *gc.C) {
    29  	s.IsolationSuite.SetUpTest(c)
    30  
    31  	s.wrapper = &fakeWrapper{
    32  		stub:       &testing.Stub{},
    33  		stableStub: &testing.Stub{},
    34  		devStub:    &testing.Stub{},
    35  	}
    36  
    37  	s.cache = &fakeMacCache{
    38  		stub: &testing.Stub{},
    39  	}
    40  }
    41  
    42  func (s *ClientSuite) TestLatestRevisions(c *gc.C) {
    43  	s.wrapper.ReturnLatestStable = [][]params.CharmRevision{{{
    44  		Revision: 1,
    45  		Sha256:   "abc",
    46  	}}}
    47  	s.wrapper.ReturnLatestDev = [][]params.CharmRevision{{{
    48  		Revision: 2,
    49  		Sha256:   "cde",
    50  	}}, {{
    51  		Revision: 3,
    52  		Sha256:   "fgh",
    53  	}}}
    54  
    55  	client, err := newCachingClient(s.cache, nil, s.wrapper.makeWrapper)
    56  	c.Assert(err, jc.ErrorIsNil)
    57  
    58  	foo := charm.MustParseURL("cs:quantal/foo-1")
    59  	bar := charm.MustParseURL("cs:quantal/bar-1")
    60  	baz := charm.MustParseURL("cs:quantal/baz-1")
    61  
    62  	ret, err := client.LatestRevisions([]CharmID{{
    63  		URL:     foo,
    64  		Channel: params.StableChannel,
    65  	}, {
    66  		URL:     bar,
    67  		Channel: params.EdgeChannel,
    68  	}, {
    69  		URL:     baz,
    70  		Channel: params.EdgeChannel,
    71  	}}, nil)
    72  	c.Assert(err, jc.ErrorIsNil)
    73  	expected := []CharmRevision{{
    74  		Revision: 1,
    75  	}, {
    76  		Revision: 2,
    77  	}, {
    78  		Revision: 3,
    79  	}}
    80  	c.Check(ret, jc.SameContents, expected)
    81  	s.wrapper.stableStub.CheckCall(c, 0, "Latest", params.StableChannel, []*charm.URL{foo}, map[string][]string(nil))
    82  	s.wrapper.devStub.CheckCall(c, 0, "Latest", params.EdgeChannel, []*charm.URL{bar}, map[string][]string(nil))
    83  	s.wrapper.devStub.CheckCall(c, 1, "Latest", params.EdgeChannel, []*charm.URL{baz}, map[string][]string(nil))
    84  }
    85  
    86  func (s *ClientSuite) TestListResources(c *gc.C) {
    87  	fp, err := resource.GenerateFingerprint(strings.NewReader("data"))
    88  	c.Assert(err, jc.ErrorIsNil)
    89  
    90  	stable := params.Resource{
    91  		Name:        "name",
    92  		Type:        "file",
    93  		Path:        "foo.zip",
    94  		Description: "something",
    95  		Revision:    5,
    96  		Fingerprint: fp.Bytes(),
    97  		Size:        4,
    98  	}
    99  	dev := params.Resource{
   100  		Name:        "name2",
   101  		Type:        "file",
   102  		Path:        "bar.zip",
   103  		Description: "something",
   104  		Revision:    7,
   105  		Fingerprint: fp.Bytes(),
   106  		Size:        4,
   107  	}
   108  	dev2 := params.Resource{
   109  		Name:        "name3",
   110  		Type:        "file",
   111  		Path:        "bar.zip",
   112  		Description: "something",
   113  		Revision:    8,
   114  		Fingerprint: fp.Bytes(),
   115  		Size:        4,
   116  	}
   117  
   118  	s.wrapper.ReturnListResourcesStable = []resourceResult{oneResourceResult(stable), resourceResult{err: params.ErrNotFound}}
   119  	s.wrapper.ReturnListResourcesDev = []resourceResult{oneResourceResult(dev), oneResourceResult(dev2)}
   120  
   121  	client, err := newCachingClient(s.cache, nil, s.wrapper.makeWrapper)
   122  	c.Assert(err, jc.ErrorIsNil)
   123  
   124  	foo := charm.MustParseURL("cs:quantal/foo-1")
   125  	bar := charm.MustParseURL("cs:quantal/bar-1")
   126  	baz := charm.MustParseURL("cs:quantal/baz-1")
   127  
   128  	ret, err := client.ListResources([]CharmID{{
   129  		URL:     foo,
   130  		Channel: params.StableChannel,
   131  	}, {
   132  		URL:     bar,
   133  		Channel: params.EdgeChannel,
   134  	}, {
   135  		URL:     baz,
   136  		Channel: params.EdgeChannel,
   137  	}})
   138  	c.Assert(err, jc.ErrorIsNil)
   139  
   140  	stableOut, err := params.API2Resource(stable)
   141  	c.Assert(err, jc.ErrorIsNil)
   142  
   143  	devOut, err := params.API2Resource(dev)
   144  	c.Assert(err, jc.ErrorIsNil)
   145  
   146  	dev2Out, err := params.API2Resource(dev2)
   147  	c.Assert(err, jc.ErrorIsNil)
   148  
   149  	c.Assert(ret, gc.DeepEquals, [][]resource.Resource{
   150  		{stableOut},
   151  		{devOut},
   152  		{dev2Out},
   153  	})
   154  	s.wrapper.stableStub.CheckCall(c, 0, "ListResources", params.StableChannel, foo)
   155  	s.wrapper.devStub.CheckCall(c, 0, "ListResources", params.EdgeChannel, bar)
   156  	s.wrapper.devStub.CheckCall(c, 1, "ListResources", params.EdgeChannel, baz)
   157  }
   158  
   159  func (s *ClientSuite) TestListResourcesError(c *gc.C) {
   160  	s.wrapper.ReturnListResourcesStable = []resourceResult{resourceResult{err: errors.NotFoundf("another error")}}
   161  	client, err := newCachingClient(s.cache, nil, s.wrapper.makeWrapper)
   162  	c.Assert(err, jc.ErrorIsNil)
   163  
   164  	ret, err := client.ListResources([]CharmID{{
   165  		URL:     charm.MustParseURL("cs:quantal/foo-1"),
   166  		Channel: params.StableChannel,
   167  	}})
   168  	c.Assert(err, gc.ErrorMatches, `another error not found`)
   169  	c.Assert(ret, gc.IsNil)
   170  }
   171  
   172  func (s *ClientSuite) TestGetResource(c *gc.C) {
   173  	fp, err := resource.GenerateFingerprint(strings.NewReader("data"))
   174  	c.Assert(err, jc.ErrorIsNil)
   175  	rc := ioutil.NopCloser(strings.NewReader("data"))
   176  	s.wrapper.ReturnGetResource = csclient.ResourceData{
   177  		ReadCloser: rc,
   178  		Hash:       fp.String(),
   179  		Size:       4,
   180  	}
   181  	apiRes := params.Resource{
   182  		Name:        "name",
   183  		Type:        "file",
   184  		Path:        "foo.zip",
   185  		Description: "something",
   186  		Revision:    5,
   187  		Fingerprint: fp.Bytes(),
   188  		Size:        4,
   189  	}
   190  	s.wrapper.ReturnResourceMeta = apiRes
   191  
   192  	client, err := newCachingClient(s.cache, nil, s.wrapper.makeWrapper)
   193  	c.Assert(err, jc.ErrorIsNil)
   194  
   195  	req := ResourceRequest{
   196  		Charm:    charm.MustParseURL("cs:mysql"),
   197  		Channel:  params.EdgeChannel,
   198  		Name:     "name",
   199  		Revision: 5,
   200  	}
   201  	data, err := client.GetResource(req)
   202  	c.Assert(err, jc.ErrorIsNil)
   203  	expected, err := params.API2Resource(apiRes)
   204  	c.Assert(err, jc.ErrorIsNil)
   205  	c.Check(data.Resource, gc.DeepEquals, expected)
   206  	c.Check(data.ReadCloser, gc.DeepEquals, rc)
   207  	// call #0 is a call to makeWrapper
   208  	s.wrapper.stub.CheckCall(c, 1, "ResourceMeta", params.EdgeChannel, req.Charm, req.Name, req.Revision)
   209  	s.wrapper.stub.CheckCall(c, 2, "GetResource", params.EdgeChannel, req.Charm, req.Name, req.Revision)
   210  }
   211  
   212  func (s *ClientSuite) TestResourceInfo(c *gc.C) {
   213  	fp, err := resource.GenerateFingerprint(strings.NewReader("data"))
   214  	c.Assert(err, jc.ErrorIsNil)
   215  	apiRes := params.Resource{
   216  		Name:        "name",
   217  		Type:        "file",
   218  		Path:        "foo.zip",
   219  		Description: "something",
   220  		Revision:    5,
   221  		Fingerprint: fp.Bytes(),
   222  		Size:        4,
   223  	}
   224  	s.wrapper.ReturnResourceMeta = apiRes
   225  
   226  	client, err := newCachingClient(s.cache, nil, s.wrapper.makeWrapper)
   227  	c.Assert(err, jc.ErrorIsNil)
   228  
   229  	req := ResourceRequest{
   230  		Charm:    charm.MustParseURL("cs:mysql"),
   231  		Channel:  params.StableChannel,
   232  		Name:     "name",
   233  		Revision: 5,
   234  	}
   235  	res, err := client.ResourceInfo(req)
   236  	c.Assert(err, jc.ErrorIsNil)
   237  	expected, err := params.API2Resource(apiRes)
   238  	c.Assert(err, jc.ErrorIsNil)
   239  	c.Check(res, gc.DeepEquals, expected)
   240  	// call #0 is a call to makeWrapper
   241  	s.wrapper.stub.CheckCall(c, 1, "ResourceMeta", params.StableChannel, req.Charm, req.Name, req.Revision)
   242  }