github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/apiserver/facade/registry_test.go (about) 1 // Copyright 2014-2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package facade_test 5 6 import ( 7 "reflect" 8 9 "github.com/juju/errors" 10 jc "github.com/juju/testing/checkers" 11 gc "gopkg.in/check.v1" 12 13 "github.com/juju/juju/apiserver/facade" 14 "github.com/juju/juju/testing" 15 ) 16 17 type RegistrySuite struct { 18 testing.BaseSuite 19 } 20 21 var _ = gc.Suite(&RegistrySuite{}) 22 23 var ( 24 interfaceType = reflect.TypeOf((*interface{})(nil)).Elem() 25 intPtrType = reflect.TypeOf((*int)(nil)) 26 ) 27 28 func (s *RegistrySuite) TestRegister(c *gc.C) { 29 registry := &facade.Registry{} 30 err := registry.Register("myfacade", 123, testFacade, interfaceType) 31 c.Assert(err, jc.ErrorIsNil) 32 33 factory, err := registry.GetFactory("myfacade", 123) 34 c.Assert(err, jc.ErrorIsNil) 35 val, err := factory(nil) 36 c.Assert(err, jc.ErrorIsNil) 37 c.Check(val, gc.Equals, "myobject") 38 } 39 40 func (s *RegistrySuite) TestListDetails(c *gc.C) { 41 registry := &facade.Registry{} 42 err := registry.Register("f2", 6, testFacade, interfaceType) 43 c.Assert(err, jc.ErrorIsNil) 44 45 err = registry.Register("f1", 9, validIdFactory, intPtrType) 46 c.Assert(err, jc.ErrorIsNil) 47 48 details := registry.ListDetails() 49 c.Assert(details, gc.HasLen, 2) 50 c.Assert(details[0].Name, gc.Equals, "f1") 51 c.Assert(details[0].Version, gc.Equals, 9) 52 v, _ := details[0].Factory(nil) 53 c.Assert(v, gc.FitsTypeOf, new(int)) 54 c.Assert(details[0].Type, gc.Equals, intPtrType) 55 56 c.Assert(details[1].Name, gc.Equals, "f2") 57 c.Assert(details[1].Version, gc.Equals, 6) 58 v, _ = details[1].Factory(nil) 59 c.Assert(v, gc.Equals, "myobject") 60 c.Assert(details[1].Type, gc.Equals, interfaceType) 61 } 62 63 func (*RegistrySuite) TestGetFactoryUnknown(c *gc.C) { 64 registry := &facade.Registry{} 65 factory, err := registry.GetFactory("name", 0) 66 c.Check(err, jc.Satisfies, errors.IsNotFound) 67 c.Check(err, gc.ErrorMatches, `name\(0\) not found`) 68 c.Check(factory, gc.IsNil) 69 } 70 71 func (*RegistrySuite) TestGetFactoryUnknownVersion(c *gc.C) { 72 registry := &facade.Registry{} 73 assertRegister(c, registry, "name", 0) 74 75 factory, err := registry.GetFactory("name", 1) 76 c.Check(err, jc.Satisfies, errors.IsNotFound) 77 c.Check(err, gc.ErrorMatches, `name\(1\) not found`) 78 c.Check(factory, gc.IsNil) 79 } 80 81 func (*RegistrySuite) TestRegisterAndList(c *gc.C) { 82 registry := &facade.Registry{} 83 assertRegister(c, registry, "name", 0) 84 85 c.Check(registry.List(), jc.DeepEquals, []facade.Description{ 86 {Name: "name", Versions: []int{0}}, 87 }) 88 } 89 90 func (*RegistrySuite) TestRegisterAndListSorted(c *gc.C) { 91 registry := &facade.Registry{} 92 assertRegister(c, registry, "name", 10) 93 assertRegister(c, registry, "name", 0) 94 assertRegister(c, registry, "name", 101) 95 96 c.Check(registry.List(), jc.DeepEquals, []facade.Description{ 97 {Name: "name", Versions: []int{0, 10, 101}}, 98 }) 99 } 100 101 func (*RegistrySuite) TestRegisterAndListMultiple(c *gc.C) { 102 registry := &facade.Registry{} 103 assertRegister(c, registry, "other", 0) 104 assertRegister(c, registry, "name", 0) 105 assertRegister(c, registry, "third", 2) 106 assertRegister(c, registry, "third", 3) 107 108 c.Check(registry.List(), jc.DeepEquals, []facade.Description{ 109 {Name: "name", Versions: []int{0}}, 110 {Name: "other", Versions: []int{0}}, 111 {Name: "third", Versions: []int{2, 3}}, 112 }) 113 } 114 115 func (*RegistrySuite) TestRegisterAlreadyPresent(c *gc.C) { 116 registry := &facade.Registry{} 117 assertRegister(c, registry, "name", 0) 118 secondIdFactory := func(context facade.Context) (facade.Facade, error) { 119 var i = 200 120 return &i, nil 121 } 122 err := registry.Register("name", 0, secondIdFactory, intPtrType) 123 c.Assert(err, gc.ErrorMatches, `object "name\(0\)" already registered`) 124 125 factory, err := registry.GetFactory("name", 0) 126 c.Assert(err, jc.ErrorIsNil) 127 c.Assert(factory, gc.NotNil) 128 val, err := factory(nil) 129 c.Assert(err, jc.ErrorIsNil) 130 asIntPtr := val.(*int) 131 c.Check(*asIntPtr, gc.Equals, 100) 132 } 133 134 func (*RegistrySuite) TestGetFactory(c *gc.C) { 135 registry := &facade.Registry{} 136 assertRegister(c, registry, "name", 0) 137 138 factory, err := registry.GetFactory("name", 0) 139 c.Assert(err, jc.ErrorIsNil) 140 c.Assert(factory, gc.NotNil) 141 res, err := factory(nil) 142 c.Assert(err, jc.ErrorIsNil) 143 c.Assert(res, gc.NotNil) 144 asIntPtr := res.(*int) 145 c.Check(*asIntPtr, gc.Equals, 100) 146 } 147 148 func (*RegistrySuite) TestGetType(c *gc.C) { 149 registry := &facade.Registry{} 150 assertRegister(c, registry, "name", 0) 151 152 typ, err := registry.GetType("name", 0) 153 c.Assert(err, jc.ErrorIsNil) 154 c.Check(typ, gc.Equals, intPtrType) 155 } 156 157 func (*RegistrySuite) TestDiscardHandlesNotPresent(c *gc.C) { 158 registry := &facade.Registry{} 159 registry.Discard("name", 1) 160 } 161 162 func (*RegistrySuite) TestDiscardRemovesEntry(c *gc.C) { 163 registry := &facade.Registry{} 164 assertRegister(c, registry, "name", 0) 165 _, err := registry.GetFactory("name", 0) 166 c.Assert(err, jc.ErrorIsNil) 167 168 registry.Discard("name", 0) 169 factory, err := registry.GetFactory("name", 0) 170 c.Check(err, jc.Satisfies, errors.IsNotFound) 171 c.Check(err, gc.ErrorMatches, `name\(0\) not found`) 172 c.Check(factory, gc.IsNil) 173 c.Check(registry.List(), jc.DeepEquals, []facade.Description{}) 174 } 175 176 func (*RegistrySuite) TestDiscardLeavesOtherVersions(c *gc.C) { 177 registry := &facade.Registry{} 178 assertRegister(c, registry, "name", 0) 179 assertRegister(c, registry, "name", 1) 180 181 registry.Discard("name", 0) 182 _, err := registry.GetFactory("name", 1) 183 c.Check(err, jc.ErrorIsNil) 184 c.Check(registry.List(), jc.DeepEquals, []facade.Description{ 185 {Name: "name", Versions: []int{1}}, 186 }) 187 } 188 189 func assertRegister(c *gc.C, registry *facade.Registry, name string, version int) { 190 assertRegisterFlag(c, registry, name, version) 191 } 192 193 func assertRegisterFlag(c *gc.C, registry *facade.Registry, name string, version int) { 194 err := registry.Register(name, version, validIdFactory, intPtrType) 195 c.Assert(err, gc.IsNil) 196 } 197 198 func testFacade(_ facade.Context) (facade.Facade, error) { 199 return "myobject", nil 200 } 201 202 func validIdFactory(_ facade.Context) (facade.Facade, error) { 203 var i = 100 204 return &i, nil 205 }