github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/environs/configstore/interface_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package configstore_test
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  	jc "github.com/juju/testing/checkers"
     9  	gc "gopkg.in/check.v1"
    10  
    11  	"github.com/juju/juju/environs/configstore"
    12  	"github.com/juju/juju/testing"
    13  )
    14  
    15  // interfaceSuite defines a set of tests on a ConfigStorage
    16  // implementation, independent of the implementation itself.
    17  // The NewStore field must be set up to return a ConfigStorage
    18  // instance of the type to be tested.
    19  type interfaceSuite struct {
    20  	testing.BaseSuite
    21  	NewStore func(c *gc.C) configstore.Storage
    22  }
    23  
    24  func (s *interfaceSuite) TestCreate(c *gc.C) {
    25  	store := s.NewStore(c)
    26  	info := store.CreateInfo("someenv")
    27  	c.Assert(info.APIEndpoint(), gc.DeepEquals, configstore.APIEndpoint{})
    28  	c.Assert(info.APICredentials(), gc.DeepEquals, configstore.APICredentials{})
    29  	c.Assert(info.Initialized(), jc.IsFalse)
    30  
    31  	// The info isn't written until you call Write
    32  	_, err := store.ReadInfo("someenv")
    33  	c.Assert(err, gc.ErrorMatches, `environment "someenv" not found`)
    34  
    35  	err = info.Write()
    36  	c.Assert(err, jc.ErrorIsNil)
    37  
    38  	// Check that we can read it again.
    39  	info, err = store.ReadInfo("someenv")
    40  	c.Assert(err, jc.ErrorIsNil)
    41  
    42  	// Now that it exists, we cannot write a newly created info again.
    43  	info = store.CreateInfo("someenv")
    44  	err = info.Write()
    45  	c.Assert(errors.Cause(err), gc.Equals, configstore.ErrEnvironInfoAlreadyExists)
    46  }
    47  
    48  func (s *interfaceSuite) createInitialisedEnvironment(c *gc.C, store configstore.Storage, envName string) {
    49  	info := store.CreateInfo(envName)
    50  	err := info.Write()
    51  	c.Assert(err, jc.ErrorIsNil)
    52  }
    53  
    54  func (s *interfaceSuite) TestList(c *gc.C) {
    55  	store := s.NewStore(c)
    56  	s.createInitialisedEnvironment(c, store, "enva")
    57  	s.createInitialisedEnvironment(c, store, "envb")
    58  	s.createInitialisedEnvironment(c, store, "envc")
    59  
    60  	environs, err := store.List()
    61  	c.Assert(err, jc.ErrorIsNil)
    62  	c.Assert(environs, jc.SameContents, []string{"enva", "envb", "envc"})
    63  }
    64  
    65  func (s *interfaceSuite) TestSetAPIEndpointAndCredentials(c *gc.C) {
    66  	store := s.NewStore(c)
    67  
    68  	info := store.CreateInfo("someenv")
    69  
    70  	expectEndpoint := configstore.APIEndpoint{
    71  		Addresses:   []string{"0.1.2.3"},
    72  		Hostnames:   []string{"example.com"},
    73  		CACert:      "a cert",
    74  		EnvironUUID: "dead-beef",
    75  	}
    76  	info.SetAPIEndpoint(expectEndpoint)
    77  	c.Assert(info.APIEndpoint(), gc.DeepEquals, expectEndpoint)
    78  
    79  	expectCreds := configstore.APICredentials{
    80  		User:     "foobie",
    81  		Password: "bletch",
    82  	}
    83  	info.SetAPICredentials(expectCreds)
    84  	c.Assert(info.APICredentials(), gc.DeepEquals, expectCreds)
    85  }
    86  
    87  func (s *interfaceSuite) TestWrite(c *gc.C) {
    88  	store := s.NewStore(c)
    89  
    90  	// Create the info.
    91  	info := store.CreateInfo("someenv")
    92  
    93  	// Set it up with some actual data and write it out.
    94  	expectCreds := configstore.APICredentials{
    95  		User:     "foobie",
    96  		Password: "bletch",
    97  	}
    98  	info.SetAPICredentials(expectCreds)
    99  
   100  	expectEndpoint := configstore.APIEndpoint{
   101  		Addresses:   []string{"0.1.2.3"},
   102  		Hostnames:   []string{"example.invalid"},
   103  		CACert:      "a cert",
   104  		EnvironUUID: "dead-beef",
   105  	}
   106  	info.SetAPIEndpoint(expectEndpoint)
   107  
   108  	err := info.Write()
   109  	c.Assert(err, jc.ErrorIsNil)
   110  	c.Assert(info.Initialized(), jc.IsTrue)
   111  
   112  	// Check we can read the information back
   113  	info, err = store.ReadInfo("someenv")
   114  	c.Assert(err, jc.ErrorIsNil)
   115  	c.Assert(info.APICredentials(), gc.DeepEquals, expectCreds)
   116  	c.Assert(info.APIEndpoint(), gc.DeepEquals, expectEndpoint)
   117  
   118  	// Change the information and write it again.
   119  	expectCreds.User = "arble"
   120  	info.SetAPICredentials(expectCreds)
   121  	err = info.Write()
   122  	c.Assert(err, jc.ErrorIsNil)
   123  
   124  	// Check we can read the information back
   125  	info, err = store.ReadInfo("someenv")
   126  	c.Assert(err, jc.ErrorIsNil)
   127  	c.Assert(info.APICredentials(), gc.DeepEquals, expectCreds)
   128  }
   129  
   130  func (s *interfaceSuite) TestDestroy(c *gc.C) {
   131  	store := s.NewStore(c)
   132  
   133  	info := store.CreateInfo("someenv")
   134  	// Destroying something that hasn't been written is fine.
   135  	err := info.Destroy()
   136  	c.Assert(err, jc.ErrorIsNil)
   137  
   138  	err = info.Write()
   139  	c.Assert(err, jc.ErrorIsNil)
   140  
   141  	err = info.Destroy()
   142  	c.Assert(err, jc.ErrorIsNil)
   143  
   144  	err = info.Destroy()
   145  	c.Assert(err, gc.ErrorMatches, "environment info has already been removed")
   146  }
   147  
   148  func (s *interfaceSuite) TestNoBleedThrough(c *gc.C) {
   149  	store := s.NewStore(c)
   150  
   151  	info := store.CreateInfo("someenv")
   152  
   153  	info.SetAPICredentials(configstore.APICredentials{User: "foo"})
   154  	info.SetAPIEndpoint(configstore.APIEndpoint{CACert: "blah"})
   155  	attrs := map[string]interface{}{"foo": "bar"}
   156  	info.SetBootstrapConfig(attrs)
   157  
   158  	err := info.Write()
   159  	c.Assert(err, jc.ErrorIsNil)
   160  
   161  	attrs["foo"] = "different"
   162  
   163  	info1, err := store.ReadInfo("someenv")
   164  	c.Assert(err, jc.ErrorIsNil)
   165  	c.Assert(info1.Initialized(), jc.IsTrue)
   166  	c.Assert(info1.BootstrapConfig(), gc.DeepEquals, map[string]interface{}{"foo": "bar"})
   167  }
   168  
   169  func (s *interfaceSuite) TestSetBootstrapConfigPanicsWhenNotCreated(c *gc.C) {
   170  	store := s.NewStore(c)
   171  
   172  	info := store.CreateInfo("someenv")
   173  	info.SetBootstrapConfig(map[string]interface{}{"foo": "bar"})
   174  	err := info.Write()
   175  	c.Assert(err, jc.ErrorIsNil)
   176  
   177  	info, err = store.ReadInfo("someenv")
   178  	c.Assert(err, jc.ErrorIsNil)
   179  	c.Assert(func() { info.SetBootstrapConfig(nil) }, gc.PanicMatches, "bootstrap config set on environment info that has not just been created")
   180  }