10
"gopkg.in/juju/charm.v6-unstable"
13
type IconFetcherSuite struct{}
15
var _ = gc.Suite(&IconFetcherSuite{})
17
func (s *IconFetcherSuite) TestLinkFetchIcons(c *gc.C) {
18
tests := map[string][]byte{
19
"~charming-devs/precise/elasticsearch-2": []byte(`
20
<svg xmlns:xlink="http://www.w3.org/1999/xlink">
21
<image width="96" height="96" xlink:href="/~charming-devs/precise/elasticsearch-2.svg" />
23
"~juju-jitsu/precise/charmworld-58": []byte(`
24
<svg xmlns:xlink="http://www.w3.org/1999/xlink">
25
<image width="96" height="96" xlink:href="/~juju-jitsu/precise/charmworld-58.svg" />
27
"precise/mongodb-21": []byte(`
28
<svg xmlns:xlink="http://www.w3.org/1999/xlink">
29
<image width="96" height="96" xlink:href="/precise/mongodb-21.svg" />
32
iconURL := func(ref *charm.URL) string {
33
return "/" + ref.Path() + ".svg"
35
b, err := charm.ReadBundleData(strings.NewReader(bundle))
36
c.Assert(err, gc.IsNil)
37
err = b.Verify(nil, nil)
38
c.Assert(err, gc.IsNil)
39
fetcher := LinkFetcher{
42
iconMap, err := fetcher.FetchIcons(b)
43
c.Assert(err, gc.IsNil)
44
for charm, link := range tests {
45
assertXMLEqual(c, []byte(iconMap[charm]), []byte(link))
49
func (s *IconFetcherSuite) TestHTTPFetchIcons(c *gc.C) {
51
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
53
fmt.Fprintln(w, fmt.Sprintf("<svg>%s</svg>", r.URL.Path))
57
tsIconURL := func(ref *charm.URL) string {
58
return ts.URL + "/" + ref.Path() + ".svg"
60
b, err := charm.ReadBundleData(strings.NewReader(bundle))
61
c.Assert(err, gc.IsNil)
62
err = b.Verify(nil, nil)
63
c.Assert(err, gc.IsNil)
64
// Only one copy of precise/mongodb-21
65
b.Applications["duplicateApplication"] = &charm.ApplicationSpec{
66
Charm: "cs:precise/mongodb-21",
69
fetcher := HTTPFetcher{
73
iconMap, err := fetcher.FetchIcons(b)
74
c.Assert(err, gc.IsNil)
75
c.Assert(iconMap, gc.DeepEquals, map[string][]byte{
76
"~charming-devs/precise/elasticsearch-2": []byte("<svg>/~charming-devs/precise/elasticsearch-2.svg</svg>\n"),
77
"~juju-jitsu/precise/charmworld-58": []byte("<svg>/~juju-jitsu/precise/charmworld-58.svg</svg>\n"),
78
"precise/mongodb-21": []byte("<svg>/precise/mongodb-21.svg</svg>\n"),
81
fetcher.Concurrency = 10
82
iconMap, err = fetcher.FetchIcons(b)
83
c.Assert(err, gc.IsNil)
84
c.Assert(iconMap, gc.DeepEquals, map[string][]byte{
85
"~charming-devs/precise/elasticsearch-2": []byte("<svg>/~charming-devs/precise/elasticsearch-2.svg</svg>\n"),
86
"~juju-jitsu/precise/charmworld-58": []byte("<svg>/~juju-jitsu/precise/charmworld-58.svg</svg>\n"),
87
"precise/mongodb-21": []byte("<svg>/precise/mongodb-21.svg</svg>\n"),
89
c.Assert(fetchCount, gc.Equals, 6)
92
func (s *IconFetcherSuite) TestHTTPBadIconURL(c *gc.C) {
93
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
94
http.Error(w, "bad-wolf", http.StatusForbidden)
99
tsIconURL := func(ref *charm.URL) string {
100
return ts.URL + "/" + ref.Path() + ".svg"
103
b, err := charm.ReadBundleData(strings.NewReader(bundle))
104
c.Assert(err, gc.IsNil)
105
err = b.Verify(nil, nil)
106
c.Assert(err, gc.IsNil)
107
fetcher := HTTPFetcher{
111
iconMap, err := fetcher.FetchIcons(b)
112
c.Assert(err, gc.ErrorMatches, fmt.Sprintf("cannot retrieve icon from %s.+\\.svg: 403 Forbidden.*", ts.URL))
113
c.Assert(iconMap, gc.IsNil)
115
fetcher.Concurrency = 10
116
iconMap, err = fetcher.FetchIcons(b)
117
c.Assert(err, gc.ErrorMatches, fmt.Sprintf("cannot retrieve icon from %s.+\\.svg: 403 Forbidden.*", ts.URL))
118
c.Assert(iconMap, gc.IsNil)