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 }