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 }