github.com/mwhudson/juju@v0.0.0-20160512215208-90ff01f3497f/environs/tools/urls_test.go (about)

     1  // Copyright 2012, 2013, 2014 Canonical Ltd.
     2  // Copyright 2014 Cloudbase Solutions SRL
     3  // Licensed under the AGPLv3, see LICENCE file for details.
     4  
     5  package tools_test
     6  
     7  import (
     8  	"fmt"
     9  
    10  	"github.com/juju/errors"
    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"
    16  	"github.com/juju/juju/environs/simplestreams"
    17  	sstesting "github.com/juju/juju/environs/simplestreams/testing"
    18  	envtesting "github.com/juju/juju/environs/testing"
    19  	"github.com/juju/juju/environs/tools"
    20  	"github.com/juju/juju/juju"
    21  	"github.com/juju/juju/jujuclient/jujuclienttesting"
    22  	"github.com/juju/juju/provider/dummy"
    23  	"github.com/juju/juju/testing"
    24  	coretesting "github.com/juju/juju/testing"
    25  )
    26  
    27  type URLsSuite struct {
    28  	coretesting.BaseSuite
    29  }
    30  
    31  var _ = gc.Suite(&URLsSuite{})
    32  
    33  func (s *URLsSuite) TearDownTest(c *gc.C) {
    34  	dummy.Reset(c)
    35  
    36  	s.BaseSuite.TearDownTest(c)
    37  }
    38  
    39  func (s *URLsSuite) env(c *gc.C, toolsMetadataURL string) environs.Environ {
    40  	attrs := dummy.SampleConfig()
    41  	if toolsMetadataURL != "" {
    42  		attrs = attrs.Merge(testing.Attrs{
    43  			"agent-metadata-url": toolsMetadataURL,
    44  		})
    45  	}
    46  	env, err := environs.Prepare(envtesting.BootstrapContext(c),
    47  		jujuclienttesting.NewMemStore(),
    48  		environs.PrepareParams{
    49  			ControllerName: attrs["name"].(string),
    50  			BaseConfig:     attrs,
    51  			CloudName:      "dummy",
    52  		},
    53  	)
    54  	c.Assert(err, jc.ErrorIsNil)
    55  	return env
    56  }
    57  
    58  func (s *URLsSuite) TestToolsURLsNoConfigURL(c *gc.C) {
    59  	env := s.env(c, "")
    60  	sources, err := tools.GetMetadataSources(env)
    61  	c.Assert(err, jc.ErrorIsNil)
    62  	sstesting.AssertExpectedSources(c, sources, []sstesting.SourceDetails{{"https://streams.canonical.com/juju/tools/", juju.JujuPublicKey}})
    63  }
    64  
    65  func (s *URLsSuite) TestToolsSources(c *gc.C) {
    66  	env := s.env(c, "config-tools-metadata-url")
    67  	sources, err := tools.GetMetadataSources(env)
    68  	c.Assert(err, jc.ErrorIsNil)
    69  	sstesting.AssertExpectedSources(c, sources, []sstesting.SourceDetails{
    70  		{"config-tools-metadata-url/", juju.JujuPublicKey},
    71  		{"https://streams.canonical.com/juju/tools/", juju.JujuPublicKey},
    72  	})
    73  }
    74  
    75  func (s *URLsSuite) TestToolsMetadataURLsRegisteredFuncs(c *gc.C) {
    76  	tools.RegisterToolsDataSourceFunc("id0", func(environs.Environ) (simplestreams.DataSource, error) {
    77  		return simplestreams.NewURLDataSource("id0", "betwixt/releases", utils.NoVerifySSLHostnames, simplestreams.DEFAULT_CLOUD_DATA, false), nil
    78  	})
    79  	tools.RegisterToolsDataSourceFunc("id1", func(environs.Environ) (simplestreams.DataSource, error) {
    80  		return simplestreams.NewURLDataSource("id1", "yoink", utils.NoVerifySSLHostnames, simplestreams.SPECIFIC_CLOUD_DATA, false), nil
    81  	})
    82  	// overwrite the one previously registered against id1
    83  	tools.RegisterToolsDataSourceFunc("id1", func(environs.Environ) (simplestreams.DataSource, error) {
    84  		// NotSupported errors do not cause GetMetadataSources to fail,
    85  		// they just cause the datasource function to be ignored.
    86  		return nil, errors.NewNotSupported(nil, "oyvey")
    87  	})
    88  	defer tools.UnregisterToolsDataSourceFunc("id0")
    89  	defer tools.UnregisterToolsDataSourceFunc("id1")
    90  
    91  	env := s.env(c, "config-tools-metadata-url")
    92  	sources, err := tools.GetMetadataSources(env)
    93  	c.Assert(err, jc.ErrorIsNil)
    94  	sstesting.AssertExpectedSources(c, sources, []sstesting.SourceDetails{
    95  		{"config-tools-metadata-url/", juju.JujuPublicKey},
    96  		{"betwixt/releases/", ""},
    97  		{"https://streams.canonical.com/juju/tools/", juju.JujuPublicKey},
    98  	})
    99  }
   100  
   101  func (s *URLsSuite) TestToolsMetadataURLsRegisteredFuncsError(c *gc.C) {
   102  	tools.RegisterToolsDataSourceFunc("id0", func(environs.Environ) (simplestreams.DataSource, error) {
   103  		// Non-NotSupported errors cause GetMetadataSources to fail.
   104  		return nil, errors.New("oyvey!")
   105  	})
   106  	defer tools.UnregisterToolsDataSourceFunc("id0")
   107  
   108  	env := s.env(c, "config-tools-metadata-url")
   109  	_, err := tools.GetMetadataSources(env)
   110  	c.Assert(err, gc.ErrorMatches, "oyvey!")
   111  }
   112  
   113  func (s *URLsSuite) TestToolsURL(c *gc.C) {
   114  	var toolsTests = []struct {
   115  		in          string
   116  		expected    string
   117  		expectedErr error
   118  	}{{
   119  		in:          "",
   120  		expected:    "",
   121  		expectedErr: nil,
   122  	}, {
   123  		in:          "file://foo",
   124  		expected:    "file://foo",
   125  		expectedErr: nil,
   126  	}, {
   127  		in:          "http://foo",
   128  		expected:    "http://foo",
   129  		expectedErr: nil,
   130  	}, {
   131  		in:          "foo",
   132  		expected:    "",
   133  		expectedErr: fmt.Errorf("foo is not an absolute path"),
   134  	}}
   135  	toolsTests = append(toolsTests, toolsTestsPlatformSpecific...)
   136  	for i, t := range toolsTests {
   137  		c.Logf("Test %d:", i)
   138  
   139  		out, err := tools.ToolsURL(t.in)
   140  		c.Assert(err, gc.DeepEquals, t.expectedErr)
   141  		c.Assert(out, gc.Equals, t.expected)
   142  	}
   143  }