github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/state/api/common/testing/environwatcher.go (about) 1 // Copyright 2014 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package testing 5 6 import ( 7 gc "launchpad.net/gocheck" 8 9 "launchpad.net/juju-core/environs" 10 "launchpad.net/juju-core/environs/config" 11 "launchpad.net/juju-core/state" 12 "launchpad.net/juju-core/state/api/watcher" 13 statetesting "launchpad.net/juju-core/state/testing" 14 jc "launchpad.net/juju-core/testing/checkers" 15 ) 16 17 const ( 18 HasSecrets = true 19 NoSecrets = false 20 ) 21 22 type Façade interface { 23 WatchForEnvironConfigChanges() (watcher.NotifyWatcher, error) 24 EnvironConfig() (*config.Config, error) 25 } 26 27 type EnvironWatcherTest struct { 28 facade Façade 29 st *state.State 30 backing *state.State 31 hasSecrets bool 32 } 33 34 func NewEnvironWatcherTest( 35 facade Façade, 36 st *state.State, 37 backing *state.State, 38 hasSecrets bool) *EnvironWatcherTest { 39 return &EnvironWatcherTest{facade, st, backing, hasSecrets} 40 } 41 42 func (s *EnvironWatcherTest) TestEnvironConfig(c *gc.C) { 43 envConfig, err := s.st.EnvironConfig() 44 c.Assert(err, gc.IsNil) 45 46 conf, err := s.facade.EnvironConfig() 47 c.Assert(err, gc.IsNil) 48 49 // If the facade doesn't have secrets, we need to replace the config 50 // values in our environment to compare against with the secrets replaced. 51 if !s.hasSecrets { 52 env, err := environs.New(envConfig) 53 c.Assert(err, gc.IsNil) 54 secretAttrs, err := env.Provider().SecretAttrs(envConfig) 55 c.Assert(err, gc.IsNil) 56 secrets := make(map[string]interface{}) 57 for key := range secretAttrs { 58 secrets[key] = "not available" 59 } 60 envConfig, err = envConfig.Apply(secrets) 61 c.Assert(err, gc.IsNil) 62 } 63 64 c.Assert(conf, jc.DeepEquals, envConfig) 65 } 66 67 func (s *EnvironWatcherTest) TestWatchForEnvironConfigChanges(c *gc.C) { 68 envConfig, err := s.st.EnvironConfig() 69 c.Assert(err, gc.IsNil) 70 71 w, err := s.facade.WatchForEnvironConfigChanges() 72 c.Assert(err, gc.IsNil) 73 defer statetesting.AssertStop(c, w) 74 wc := statetesting.NewNotifyWatcherC(c, s.backing, w) 75 76 // Initial event. 77 wc.AssertOneChange() 78 79 // Change the environment configuration, check it's detected. 80 attrs := envConfig.AllAttrs() 81 attrs["type"] = "blah" 82 newConfig, err := config.New(config.NoDefaults, attrs) 83 c.Assert(err, gc.IsNil) 84 err = s.st.SetEnvironConfig(newConfig, envConfig) 85 c.Assert(err, gc.IsNil) 86 wc.AssertOneChange() 87 88 // Change it back to the original config. 89 err = s.st.SetEnvironConfig(envConfig, newConfig) 90 c.Assert(err, gc.IsNil) 91 wc.AssertOneChange() 92 93 statetesting.AssertStop(c, w) 94 wc.AssertClosed() 95 }