github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/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 "gopkg.in/check.v1"
    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, jc.ErrorIsNil)
    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, jc.ErrorIsNil)
    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, jc.ErrorIsNil)
    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, jc.ErrorIsNil)
    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, jc.ErrorIsNil)
    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, jc.ErrorIsNil)
    88  	defer reader.Close()
    89  	byteContent, err := ioutil.ReadAll(reader)
    90  	c.Assert(err, jc.ErrorIsNil)
    91  	c.Check(string(byteContent), gc.Equals, "Greetings!\n")
    92  }