1
// Copyright 2016 Canonical Ltd.
2
// Licensed under the LGPLv3, see LICENCE file for details.
14
"github.com/juju/testing"
15
jc "github.com/juju/testing/checkers"
16
gc "gopkg.in/check.v1"
17
"gopkg.in/juju/charm.v6-unstable"
18
"gopkg.in/juju/charm.v6-unstable/resource"
20
"gopkg.in/juju/charmrepo.v2-unstable/csclient/params"
23
type ResourceSuite struct{}
25
var _ = gc.Suite(ResourceSuite{})
27
func (ResourceSuite) TestListResources(c *gc.C) {
29
fp, err := resource.GenerateFingerprint(strings.NewReader(data))
30
c.Assert(err, jc.ErrorIsNil)
32
results := map[string][]params.Resource{
33
"cs:quantal/starsay": []params.Resource{
39
Description: "some zip file",
41
Fingerprint: fp.Bytes(),
42
Size: int64(len(data)),
47
b, err := json.Marshal(results)
48
c.Assert(err, jc.ErrorIsNil)
51
Stub: &testing.Stub{},
52
ReturnDoWithBody: &http.Response{
54
Body: ioutil.NopCloser(bytes.NewReader(b)),
58
client := Client{bclient: f}
59
url := charm.MustParseURL("cs:quantal/starsay")
60
ret, err := client.ListResources([]*charm.URL{url})
61
c.Assert(err, jc.ErrorIsNil)
62
c.Assert(ret, gc.DeepEquals, results)
65
func (ResourceSuite) TestUploadResource(c *gc.C) {
66
data := []byte("boo!")
67
reader := bytes.NewReader(data)
69
result := params.ResourceUploadResponse{Revision: 1}
70
b, err := json.Marshal(result)
71
c.Assert(err, jc.ErrorIsNil)
74
Stub: &testing.Stub{},
75
ReturnDoWithBody: &http.Response{
77
Body: ioutil.NopCloser(bytes.NewReader(b)),
78
ContentLength: int64(len(b)),
82
client := Client{bclient: f}
83
id := charm.MustParseURL("cs:quantal/starsay")
84
rev, err := client.UploadResource(id, "resname", "data.zip", reader)
85
c.Assert(err, jc.ErrorIsNil)
86
c.Assert(rev, gc.Equals, 1)
87
f.CheckCallNames(c, "DoWithBody")
88
req := f.Calls()[0].Args[0].(*http.Request)
89
body := f.Calls()[0].Args[1].(io.ReadSeeker)
91
hash, size, err := readerHashAndSize(reader)
92
c.Assert(err, jc.ErrorIsNil)
94
c.Assert(req.URL.String(), gc.Equals, "/v5/quantal/starsay/resources/resname?hash="+hash+"&filename=data.zip")
95
c.Assert(req.ContentLength, gc.Equals, size)
96
c.Assert(body, gc.DeepEquals, reader)
99
func (ResourceSuite) TestGetResource(c *gc.C) {
100
data := []byte("boo!")
101
fp, err := resource.GenerateFingerprint(bytes.NewReader(data))
102
c.Assert(err, jc.ErrorIsNil)
103
body := ioutil.NopCloser(bytes.NewReader(data))
105
resp := &http.Response{
109
params.ResourceRevisionHeader: []string{"1"},
110
params.ContentHashHeader: []string{fp.String()},
112
ContentLength: int64(len(data)),
116
Stub: &testing.Stub{},
117
ReturnDoWithBody: resp,
120
client := Client{bclient: f}
121
id := charm.MustParseURL("cs:quantal/starsay")
122
resdata, err := client.GetResource(id, 1, "data")
123
c.Assert(err, jc.ErrorIsNil)
124
c.Check(resdata, gc.DeepEquals, ResourceData{
128
Size: int64(len(data)),
132
type fakeClient struct {
134
ReturnDoWithBody *http.Response
137
func (f *fakeClient) DoWithBody(req *http.Request, r io.ReadSeeker) (*http.Response, error) {
138
f.AddCall("DoWithBody", req, r)
139
return f.ReturnDoWithBody, f.NextErr()