1
// Copyright 2014-2016 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
9
"github.com/juju/errors"
10
jc "github.com/juju/testing/checkers"
11
gc "gopkg.in/check.v1"
13
"github.com/juju/juju/apiserver/facade"
14
"github.com/juju/juju/testing"
17
type RegistrySuite struct {
21
var _ = gc.Suite(&RegistrySuite{})
23
func (s *RegistrySuite) TestRegister(c *gc.C) {
24
registry := &facade.Registry{}
26
facadeType := reflect.TypeOf(&v).Elem()
27
err := registry.Register("myfacade", 123, testFacade, facadeType, "")
28
c.Assert(err, jc.ErrorIsNil)
30
factory, err := registry.GetFactory("myfacade", 123)
31
c.Assert(err, jc.ErrorIsNil)
32
val, err := factory(nil)
33
c.Assert(err, jc.ErrorIsNil)
34
c.Check(val, gc.Equals, "myobject")
37
func (*RegistrySuite) TestGetFactoryUnknown(c *gc.C) {
38
registry := &facade.Registry{}
39
factory, err := registry.GetFactory("name", 0)
40
c.Check(err, jc.Satisfies, errors.IsNotFound)
41
c.Check(err, gc.ErrorMatches, `name\(0\) not found`)
42
c.Check(factory, gc.IsNil)
45
func (*RegistrySuite) TestGetFactoryUnknownVersion(c *gc.C) {
46
registry := &facade.Registry{}
47
assertRegister(c, registry, "name", 0)
49
factory, err := registry.GetFactory("name", 1)
50
c.Check(err, jc.Satisfies, errors.IsNotFound)
51
c.Check(err, gc.ErrorMatches, `name\(1\) not found`)
52
c.Check(factory, gc.IsNil)
55
func (*RegistrySuite) TestRegisterAndList(c *gc.C) {
56
registry := &facade.Registry{}
57
assertRegister(c, registry, "name", 0)
59
c.Check(registry.List(), jc.DeepEquals, []facade.Description{
60
{Name: "name", Versions: []int{0}},
64
func (*RegistrySuite) TestRegisterAndListSorted(c *gc.C) {
65
registry := &facade.Registry{}
66
assertRegister(c, registry, "name", 10)
67
assertRegister(c, registry, "name", 0)
68
assertRegister(c, registry, "name", 101)
70
c.Check(registry.List(), jc.DeepEquals, []facade.Description{
71
{Name: "name", Versions: []int{0, 10, 101}},
75
func (*RegistrySuite) TestRegisterAndListMultiple(c *gc.C) {
76
registry := &facade.Registry{}
77
assertRegister(c, registry, "other", 0)
78
assertRegister(c, registry, "name", 0)
79
assertRegister(c, registry, "third", 2)
80
assertRegister(c, registry, "third", 3)
82
c.Check(registry.List(), jc.DeepEquals, []facade.Description{
83
{Name: "name", Versions: []int{0}},
84
{Name: "other", Versions: []int{0}},
85
{Name: "third", Versions: []int{2, 3}},
89
func (s *RegistrySuite) TestRegisterAndListMultipleWithFeatures(c *gc.C) {
90
registry := &facade.Registry{}
91
assertRegisterFlag(c, registry, "other", 0, "special")
92
assertRegister(c, registry, "name", 0)
93
assertRegisterFlag(c, registry, "name", 1, "special")
94
assertRegister(c, registry, "third", 2)
95
assertRegisterFlag(c, registry, "third", 3, "magic")
97
s.SetFeatureFlags("magic")
98
c.Check(registry.List(), jc.DeepEquals, []facade.Description{
99
{Name: "name", Versions: []int{0}},
100
{Name: "third", Versions: []int{2, 3}},
104
func (*RegistrySuite) TestRegisterAlreadyPresent(c *gc.C) {
105
registry := &facade.Registry{}
106
assertRegister(c, registry, "name", 0)
107
secondIdFactory := func(context facade.Context) (facade.Facade, error) {
111
err := registry.Register("name", 0, secondIdFactory, intPtrType, "")
112
c.Assert(err, gc.ErrorMatches, `object "name\(0\)" already registered`)
114
factory, err := registry.GetFactory("name", 0)
115
c.Assert(err, jc.ErrorIsNil)
116
c.Assert(factory, gc.NotNil)
117
val, err := factory(nil)
118
c.Assert(err, jc.ErrorIsNil)
119
asIntPtr := val.(*int)
120
c.Check(*asIntPtr, gc.Equals, 100)
123
func (*RegistrySuite) TestGetFactory(c *gc.C) {
124
registry := &facade.Registry{}
125
assertRegister(c, registry, "name", 0)
127
factory, err := registry.GetFactory("name", 0)
128
c.Assert(err, jc.ErrorIsNil)
129
c.Assert(factory, gc.NotNil)
130
res, err := factory(nil)
131
c.Assert(err, jc.ErrorIsNil)
132
c.Assert(res, gc.NotNil)
133
asIntPtr := res.(*int)
134
c.Check(*asIntPtr, gc.Equals, 100)
137
func (*RegistrySuite) TestGetType(c *gc.C) {
138
registry := &facade.Registry{}
139
assertRegister(c, registry, "name", 0)
141
typ, err := registry.GetType("name", 0)
142
c.Assert(err, jc.ErrorIsNil)
143
c.Check(typ, gc.Equals, intPtrType)
146
func (*RegistrySuite) TestDiscardHandlesNotPresent(c *gc.C) {
147
registry := &facade.Registry{}
148
registry.Discard("name", 1)
151
func (*RegistrySuite) TestDiscardRemovesEntry(c *gc.C) {
152
registry := &facade.Registry{}
153
assertRegister(c, registry, "name", 0)
154
_, err := registry.GetFactory("name", 0)
155
c.Assert(err, jc.ErrorIsNil)
157
registry.Discard("name", 0)
158
factory, err := registry.GetFactory("name", 0)
159
c.Check(err, jc.Satisfies, errors.IsNotFound)
160
c.Check(err, gc.ErrorMatches, `name\(0\) not found`)
161
c.Check(factory, gc.IsNil)
162
c.Check(registry.List(), jc.DeepEquals, []facade.Description{})
165
func (*RegistrySuite) TestDiscardLeavesOtherVersions(c *gc.C) {
166
registry := &facade.Registry{}
167
assertRegister(c, registry, "name", 0)
168
assertRegister(c, registry, "name", 1)
170
registry.Discard("name", 0)
171
_, err := registry.GetFactory("name", 1)
172
c.Check(err, jc.ErrorIsNil)
173
c.Check(registry.List(), jc.DeepEquals, []facade.Description{
174
{Name: "name", Versions: []int{1}},
178
func testFacade(facade.Context) (facade.Facade, error) {
179
return "myobject", nil
182
func validIdFactory(facade.Context) (facade.Facade, error) {
187
var intPtr = new(int)
188
var intPtrType = reflect.TypeOf(&intPtr).Elem()
190
func assertRegister(c *gc.C, registry *facade.Registry, name string, version int) {
191
assertRegisterFlag(c, registry, name, version, "")
194
func assertRegisterFlag(c *gc.C, registry *facade.Registry, name string, version int, flag string) {
196
err := registry.Register(name, version, validIdFactory, intPtrType, flag)
197
c.Assert(err, gc.IsNil)