github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/state/apiserver/common/environwatcher_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package common_test
     5  
     6  import (
     7  	"fmt"
     8  
     9  	gc "launchpad.net/gocheck"
    10  
    11  	"launchpad.net/juju-core/environs"
    12  	"launchpad.net/juju-core/environs/config"
    13  	"launchpad.net/juju-core/environs/configstore"
    14  	"launchpad.net/juju-core/provider/dummy"
    15  	"launchpad.net/juju-core/state"
    16  	"launchpad.net/juju-core/state/api/params"
    17  	"launchpad.net/juju-core/state/apiserver/common"
    18  	apiservertesting "launchpad.net/juju-core/state/apiserver/testing"
    19  	"launchpad.net/juju-core/testing"
    20  	jc "launchpad.net/juju-core/testing/checkers"
    21  	"launchpad.net/juju-core/testing/testbase"
    22  )
    23  
    24  type environWatcherSuite struct {
    25  	testbase.LoggingSuite
    26  
    27  	testingEnvConfig *config.Config
    28  }
    29  
    30  var _ = gc.Suite(&environWatcherSuite{})
    31  
    32  type fakeEnvironAccessor struct {
    33  	envConfig      *config.Config
    34  	envConfigError error
    35  }
    36  
    37  func (*fakeEnvironAccessor) WatchForEnvironConfigChanges() state.NotifyWatcher {
    38  	changes := make(chan struct{}, 1)
    39  	// Simulate initial event.
    40  	changes <- struct{}{}
    41  	return &fakeNotifyWatcher{changes}
    42  }
    43  
    44  func (f *fakeEnvironAccessor) EnvironConfig() (*config.Config, error) {
    45  	if f.envConfigError != nil {
    46  		return nil, f.envConfigError
    47  	}
    48  	return f.envConfig, nil
    49  }
    50  
    51  func (s *environWatcherSuite) TearDownTest(c *gc.C) {
    52  	dummy.Reset()
    53  	s.LoggingSuite.TearDownTest(c)
    54  }
    55  
    56  func (*environWatcherSuite) TestWatchSuccess(c *gc.C) {
    57  	getCanWatch := func() (common.AuthFunc, error) {
    58  		return func(tag string) bool {
    59  			return true
    60  		}, nil
    61  	}
    62  	resources := common.NewResources()
    63  	e := common.NewEnvironWatcher(
    64  		&fakeEnvironAccessor{},
    65  		resources,
    66  		getCanWatch,
    67  		nil,
    68  	)
    69  	result, err := e.WatchForEnvironConfigChanges()
    70  	c.Assert(err, gc.IsNil)
    71  	c.Assert(result, gc.DeepEquals, params.NotifyWatchResult{"1", nil})
    72  	c.Assert(resources.Count(), gc.Equals, 1)
    73  }
    74  
    75  func (*environWatcherSuite) TestWatchGetAuthError(c *gc.C) {
    76  	getCanWatch := func() (common.AuthFunc, error) {
    77  		return nil, fmt.Errorf("pow")
    78  	}
    79  	resources := common.NewResources()
    80  	e := common.NewEnvironWatcher(
    81  		&fakeEnvironAccessor{},
    82  		resources,
    83  		getCanWatch,
    84  		nil,
    85  	)
    86  	_, err := e.WatchForEnvironConfigChanges()
    87  	c.Assert(err, gc.ErrorMatches, "pow")
    88  	c.Assert(resources.Count(), gc.Equals, 0)
    89  }
    90  
    91  func (*environWatcherSuite) TestWatchAuthError(c *gc.C) {
    92  	getCanWatch := func() (common.AuthFunc, error) {
    93  		return func(tag string) bool {
    94  			return false
    95  		}, nil
    96  	}
    97  	resources := common.NewResources()
    98  	e := common.NewEnvironWatcher(
    99  		&fakeEnvironAccessor{},
   100  		resources,
   101  		getCanWatch,
   102  		nil,
   103  	)
   104  	result, err := e.WatchForEnvironConfigChanges()
   105  	c.Assert(err, gc.ErrorMatches, "permission denied")
   106  	c.Assert(result.Error, jc.DeepEquals, apiservertesting.ErrUnauthorized)
   107  	c.Assert(resources.Count(), gc.Equals, 0)
   108  }
   109  
   110  func (*environWatcherSuite) TestEnvironConfigSuccess(c *gc.C) {
   111  	getCanReadSecrets := func() (common.AuthFunc, error) {
   112  		return func(tag string) bool {
   113  			return true
   114  		}, nil
   115  	}
   116  
   117  	testingEnvConfig := testingEnvConfig(c)
   118  	e := common.NewEnvironWatcher(
   119  		&fakeEnvironAccessor{envConfig: testingEnvConfig},
   120  		nil,
   121  		nil,
   122  		getCanReadSecrets,
   123  	)
   124  	result, err := e.EnvironConfig()
   125  	c.Assert(err, gc.IsNil)
   126  	c.Assert(result.Error, gc.IsNil)
   127  	// Make sure we can read the secret attribute (i.e. it's not masked).
   128  	c.Check(result.Config["secret"], gc.Equals, "pork")
   129  	c.Check(map[string]interface{}(result.Config), jc.DeepEquals, testingEnvConfig.AllAttrs())
   130  }
   131  
   132  func (*environWatcherSuite) TestEnvironConfigFetchError(c *gc.C) {
   133  	getCanReadSecrets := func() (common.AuthFunc, error) {
   134  		return func(tag string) bool {
   135  			return true
   136  		}, nil
   137  	}
   138  	e := common.NewEnvironWatcher(
   139  		&fakeEnvironAccessor{
   140  			envConfigError: fmt.Errorf("pow"),
   141  		},
   142  		nil,
   143  		nil,
   144  		getCanReadSecrets,
   145  	)
   146  	_, err := e.EnvironConfig()
   147  	c.Assert(err, gc.ErrorMatches, "pow")
   148  }
   149  
   150  func (*environWatcherSuite) TestEnvironConfigGetAuthError(c *gc.C) {
   151  	getCanReadSecrets := func() (common.AuthFunc, error) {
   152  		return nil, fmt.Errorf("pow")
   153  	}
   154  	e := common.NewEnvironWatcher(
   155  		&fakeEnvironAccessor{envConfig: testingEnvConfig(c)},
   156  		nil,
   157  		nil,
   158  		getCanReadSecrets,
   159  	)
   160  	_, err := e.EnvironConfig()
   161  	c.Assert(err, gc.ErrorMatches, "pow")
   162  }
   163  
   164  func (*environWatcherSuite) TestEnvironConfigReadSecretsFalse(c *gc.C) {
   165  	getCanReadSecrets := func() (common.AuthFunc, error) {
   166  		return func(tag string) bool {
   167  			return false
   168  		}, nil
   169  	}
   170  
   171  	testingEnvConfig := testingEnvConfig(c)
   172  	e := common.NewEnvironWatcher(
   173  		&fakeEnvironAccessor{envConfig: testingEnvConfig},
   174  		nil,
   175  		nil,
   176  		getCanReadSecrets,
   177  	)
   178  	result, err := e.EnvironConfig()
   179  	c.Assert(err, gc.IsNil)
   180  	c.Assert(result.Error, gc.IsNil)
   181  	// Make sure the secret attribute is masked.
   182  	c.Check(result.Config["secret"], gc.Equals, "not available")
   183  	// And only that is masked.
   184  	result.Config["secret"] = "pork"
   185  	c.Check(map[string]interface{}(result.Config), jc.DeepEquals, testingEnvConfig.AllAttrs())
   186  }
   187  
   188  func testingEnvConfig(c *gc.C) *config.Config {
   189  	cfg, err := config.New(config.NoDefaults, dummy.SampleConfig())
   190  	c.Assert(err, gc.IsNil)
   191  	env, err := environs.Prepare(cfg, testing.Context(c), configstore.NewMem())
   192  	c.Assert(err, gc.IsNil)
   193  	return env.Config()
   194  }