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 }