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  }