github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/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  	jc "github.com/juju/testing/checkers"
     8  	gc "launchpad.net/gocheck"
     9  
    10  	"github.com/juju/juju/environs/configstore"
    11  	"github.com/juju/juju/testing"
    12  )
    13  
    14  // interfaceSuite defines a set of tests on a ConfigStorage
    15  // implementation, independent of the implementation itself.
    16  // The NewStore field must be set up to return a ConfigStorage
    17  // instance of the type to be tested.
    18  type interfaceSuite struct {
    19  	testing.BaseSuite
    20  	NewStore func(c *gc.C) configstore.Storage
    21  }
    22  
    23  func (s *interfaceSuite) TestCreate(c *gc.C) {
    24  	store := s.NewStore(c)
    25  	info, err := store.CreateInfo("someenv")
    26  	c.Assert(err, gc.IsNil)
    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  	// Check that we can't create it twice.
    32  	info, err = store.CreateInfo("someenv")
    33  	c.Assert(err, gc.Equals, configstore.ErrEnvironInfoAlreadyExists)
    34  	c.Assert(info, gc.IsNil)
    35  
    36  	// Check that we can read it again.
    37  	info, err = store.ReadInfo("someenv")
    38  	c.Assert(err, gc.IsNil)
    39  	c.Assert(info.Initialized(), jc.IsFalse)
    40  }
    41  
    42  func (s *interfaceSuite) TestSetAPIEndpointAndCredentials(c *gc.C) {
    43  	store := s.NewStore(c)
    44  
    45  	info, err := store.CreateInfo("someenv")
    46  	c.Assert(err, gc.IsNil)
    47  
    48  	expectEndpoint := configstore.APIEndpoint{
    49  		Addresses:   []string{"example.com"},
    50  		CACert:      "a cert",
    51  		EnvironUUID: "dead-beef",
    52  	}
    53  	info.SetAPIEndpoint(expectEndpoint)
    54  	c.Assert(info.APIEndpoint(), gc.DeepEquals, expectEndpoint)
    55  
    56  	expectCreds := configstore.APICredentials{
    57  		User:     "foobie",
    58  		Password: "bletch",
    59  	}
    60  	info.SetAPICredentials(expectCreds)
    61  	c.Assert(info.APICredentials(), gc.DeepEquals, expectCreds)
    62  }
    63  
    64  func (s *interfaceSuite) TestWrite(c *gc.C) {
    65  	store := s.NewStore(c)
    66  
    67  	// Create the info.
    68  	info, err := store.CreateInfo("someenv")
    69  	c.Assert(err, gc.IsNil)
    70  
    71  	// Set it up with some actual data and write it out.
    72  	expectCreds := configstore.APICredentials{
    73  		User:     "foobie",
    74  		Password: "bletch",
    75  	}
    76  	info.SetAPICredentials(expectCreds)
    77  
    78  	expectEndpoint := configstore.APIEndpoint{
    79  		Addresses:   []string{"example.invalid"},
    80  		CACert:      "a cert",
    81  		EnvironUUID: "dead-beef",
    82  	}
    83  	info.SetAPIEndpoint(expectEndpoint)
    84  
    85  	err = info.Write()
    86  	c.Assert(err, gc.IsNil)
    87  	c.Assert(info.Initialized(), jc.IsTrue)
    88  
    89  	// Check we can read the information back
    90  	info, err = store.ReadInfo("someenv")
    91  	c.Assert(err, gc.IsNil)
    92  	c.Assert(info.APICredentials(), gc.DeepEquals, expectCreds)
    93  	c.Assert(info.APIEndpoint(), gc.DeepEquals, expectEndpoint)
    94  
    95  	// Change the information and write it again.
    96  	expectCreds.User = "arble"
    97  	info.SetAPICredentials(expectCreds)
    98  	err = info.Write()
    99  	c.Assert(err, gc.IsNil)
   100  
   101  	// Check we can read the information back
   102  	info, err = store.ReadInfo("someenv")
   103  	c.Assert(err, gc.IsNil)
   104  	c.Assert(info.APICredentials(), gc.DeepEquals, expectCreds)
   105  }
   106  
   107  func (s *interfaceSuite) TestDestroy(c *gc.C) {
   108  	store := s.NewStore(c)
   109  
   110  	info, err := store.CreateInfo("someenv")
   111  	c.Assert(err, gc.IsNil)
   112  
   113  	err = info.Destroy()
   114  	c.Assert(err, gc.IsNil)
   115  
   116  	err = info.Destroy()
   117  	c.Assert(err, gc.ErrorMatches, "environment info has already been removed")
   118  
   119  	info, err = store.CreateInfo("someenv")
   120  	c.Assert(err, gc.IsNil)
   121  }
   122  
   123  func (s *interfaceSuite) TestNoBleedThrough(c *gc.C) {
   124  	store := s.NewStore(c)
   125  
   126  	info, err := store.CreateInfo("someenv")
   127  	c.Assert(err, gc.IsNil)
   128  
   129  	info.SetAPICredentials(configstore.APICredentials{User: "foo"})
   130  	info.SetAPIEndpoint(configstore.APIEndpoint{CACert: "blah"})
   131  	attrs := map[string]interface{}{"foo": "bar"}
   132  	info.SetBootstrapConfig(attrs)
   133  
   134  	info1, err := store.ReadInfo("someenv")
   135  	c.Assert(err, gc.IsNil)
   136  	c.Assert(info1.Initialized(), jc.IsFalse)
   137  	c.Assert(info1.APICredentials(), gc.DeepEquals, configstore.APICredentials{})
   138  	c.Assert(info1.APIEndpoint(), gc.DeepEquals, configstore.APIEndpoint{})
   139  	c.Assert(info1.BootstrapConfig(), gc.HasLen, 0)
   140  
   141  	err = info.Write()
   142  	c.Assert(err, gc.IsNil)
   143  
   144  	attrs["foo"] = "different"
   145  
   146  	info1, err = store.ReadInfo("someenv")
   147  	c.Assert(err, gc.IsNil)
   148  	c.Assert(info1.Initialized(), jc.IsTrue)
   149  	c.Assert(info1.BootstrapConfig(), gc.DeepEquals, map[string]interface{}{"foo": "bar"})
   150  }
   151  
   152  func (s *interfaceSuite) TestSetBootstrapConfigPanicsWhenNotCreated(c *gc.C) {
   153  	store := s.NewStore(c)
   154  
   155  	info, err := store.CreateInfo("someenv")
   156  	c.Assert(err, gc.IsNil)
   157  	info.SetBootstrapConfig(map[string]interface{}{"foo": "bar"})
   158  	err = info.Write()
   159  	c.Assert(err, gc.IsNil)
   160  
   161  	info, err = store.ReadInfo("someenv")
   162  	c.Assert(err, gc.IsNil)
   163  	c.Assert(func() { info.SetBootstrapConfig(nil) }, gc.PanicMatches, "bootstrap config set on environment info that has not just been created")
   164  }