github.com/rogpeppe/juju@v0.0.0-20140613142852-6337964b789e/environs/simplestreams/datasource_test.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package simplestreams_test 5 6 import ( 7 "io/ioutil" 8 "net/http" 9 "net/http/httptest" 10 11 jc "github.com/juju/testing/checkers" 12 "github.com/juju/utils" 13 gc "launchpad.net/gocheck" 14 15 "github.com/juju/juju/environs/imagemetadata" 16 "github.com/juju/juju/environs/simplestreams" 17 "github.com/juju/juju/environs/simplestreams/testing" 18 ) 19 20 var _ = gc.Suite(&datasourceSuite{}) 21 var _ = gc.Suite(&datasourceHTTPSSuite{}) 22 23 type datasourceSuite struct { 24 testing.TestDataSuite 25 } 26 27 func (s *datasourceSuite) TestFetch(c *gc.C) { 28 ds := simplestreams.NewURLDataSource("test", "test:", utils.VerifySSLHostnames) 29 rc, url, err := ds.Fetch("streams/v1/tools_metadata.json") 30 c.Assert(err, gc.IsNil) 31 defer rc.Close() 32 c.Assert(url, gc.Equals, "test:/streams/v1/tools_metadata.json") 33 data, err := ioutil.ReadAll(rc) 34 cloudMetadata, err := simplestreams.ParseCloudMetadata(data, "products:1.0", url, imagemetadata.ImageMetadata{}) 35 c.Assert(err, gc.IsNil) 36 c.Assert(len(cloudMetadata.Products), jc.GreaterThan, 0) 37 } 38 39 func (s *datasourceSuite) TestURL(c *gc.C) { 40 ds := simplestreams.NewURLDataSource("test", "foo", utils.VerifySSLHostnames) 41 url, err := ds.URL("bar") 42 c.Assert(err, gc.IsNil) 43 c.Assert(url, gc.Equals, "foo/bar") 44 } 45 46 type datasourceHTTPSSuite struct { 47 Server *httptest.Server 48 } 49 50 func (s *datasourceHTTPSSuite) SetUpTest(c *gc.C) { 51 mux := http.NewServeMux() 52 mux.HandleFunc("/", func(resp http.ResponseWriter, req *http.Request) { 53 req.Body.Close() 54 resp.WriteHeader(200) 55 resp.Write([]byte("Greetings!\n")) 56 }) 57 s.Server = httptest.NewTLSServer(mux) 58 } 59 60 func (s *datasourceHTTPSSuite) TearDownTest(c *gc.C) { 61 if s.Server != nil { 62 s.Server.Close() 63 s.Server = nil 64 } 65 } 66 67 func (s *datasourceHTTPSSuite) TestNormalClientFails(c *gc.C) { 68 ds := simplestreams.NewURLDataSource("test", s.Server.URL, utils.VerifySSLHostnames) 69 url, err := ds.URL("bar") 70 c.Assert(err, gc.IsNil) 71 c.Check(url, gc.Equals, s.Server.URL+"/bar") 72 reader, _, err := ds.Fetch("bar") 73 // The underlying failure is a x509: certificate signed by unknown authority 74 // However, the urlDataSource abstraction hides that as a simple NotFound 75 c.Assert(err, gc.ErrorMatches, "invalid URL \".*/bar\" not found") 76 c.Check(reader, gc.IsNil) 77 } 78 79 func (s *datasourceHTTPSSuite) TestNonVerifyingClientSucceeds(c *gc.C) { 80 ds := simplestreams.NewURLDataSource("test", s.Server.URL, utils.NoVerifySSLHostnames) 81 url, err := ds.URL("bar") 82 c.Assert(err, gc.IsNil) 83 c.Check(url, gc.Equals, s.Server.URL+"/bar") 84 reader, _, err := ds.Fetch("bar") 85 // The underlying failure is a x509: certificate signed by unknown authority 86 // However, the urlDataSource abstraction hides that as a simple NotFound 87 c.Assert(err, gc.IsNil) 88 defer reader.Close() 89 byteContent, err := ioutil.ReadAll(reader) 90 c.Assert(err, gc.IsNil) 91 c.Check(string(byteContent), gc.Equals, "Greetings!\n") 92 }