github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/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  func (s *RegistrySuite) TestRegister(c *gc.C) {
    24  	registry := &facade.Registry{}
    25  	var v interface{}
    26  	facadeType := reflect.TypeOf(&v).Elem()
    27  	err := registry.Register("myfacade", 123, testFacade, facadeType, "")
    28  	c.Assert(err, jc.ErrorIsNil)
    29  
    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")
    35  }
    36  
    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)
    43  }
    44  
    45  func (*RegistrySuite) TestGetFactoryUnknownVersion(c *gc.C) {
    46  	registry := &facade.Registry{}
    47  	assertRegister(c, registry, "name", 0)
    48  
    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)
    53  }
    54  
    55  func (*RegistrySuite) TestRegisterAndList(c *gc.C) {
    56  	registry := &facade.Registry{}
    57  	assertRegister(c, registry, "name", 0)
    58  
    59  	c.Check(registry.List(), jc.DeepEquals, []facade.Description{
    60  		{Name: "name", Versions: []int{0}},
    61  	})
    62  }
    63  
    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)
    69  
    70  	c.Check(registry.List(), jc.DeepEquals, []facade.Description{
    71  		{Name: "name", Versions: []int{0, 10, 101}},
    72  	})
    73  }
    74  
    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)
    81  
    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}},
    86  	})
    87  }
    88  
    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")
    96  
    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}},
   101  	})
   102  }
   103  
   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) {
   108  		var i = 200
   109  		return &i, nil
   110  	}
   111  	err := registry.Register("name", 0, secondIdFactory, intPtrType, "")
   112  	c.Assert(err, gc.ErrorMatches, `object "name\(0\)" already registered`)
   113  
   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)
   121  }
   122  
   123  func (*RegistrySuite) TestGetFactory(c *gc.C) {
   124  	registry := &facade.Registry{}
   125  	assertRegister(c, registry, "name", 0)
   126  
   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)
   135  }
   136  
   137  func (*RegistrySuite) TestGetType(c *gc.C) {
   138  	registry := &facade.Registry{}
   139  	assertRegister(c, registry, "name", 0)
   140  
   141  	typ, err := registry.GetType("name", 0)
   142  	c.Assert(err, jc.ErrorIsNil)
   143  	c.Check(typ, gc.Equals, intPtrType)
   144  }
   145  
   146  func (*RegistrySuite) TestDiscardHandlesNotPresent(c *gc.C) {
   147  	registry := &facade.Registry{}
   148  	registry.Discard("name", 1)
   149  }
   150  
   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)
   156  
   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{})
   163  }
   164  
   165  func (*RegistrySuite) TestDiscardLeavesOtherVersions(c *gc.C) {
   166  	registry := &facade.Registry{}
   167  	assertRegister(c, registry, "name", 0)
   168  	assertRegister(c, registry, "name", 1)
   169  
   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}},
   175  	})
   176  }
   177  
   178  func testFacade(facade.Context) (facade.Facade, error) {
   179  	return "myobject", nil
   180  }
   181  
   182  func validIdFactory(facade.Context) (facade.Facade, error) {
   183  	var i = 100
   184  	return &i, nil
   185  }
   186  
   187  var intPtr = new(int)
   188  var intPtrType = reflect.TypeOf(&intPtr).Elem()
   189  
   190  func assertRegister(c *gc.C, registry *facade.Registry, name string, version int) {
   191  	assertRegisterFlag(c, registry, name, version, "")
   192  }
   193  
   194  func assertRegisterFlag(c *gc.C, registry *facade.Registry, name string, version int, flag string) {
   195  
   196  	err := registry.Register(name, version, validIdFactory, intPtrType, flag)
   197  	c.Assert(err, gc.IsNil)
   198  }