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 }