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  }