github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/common/resource_test.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package common_test
     5  
     6  import (
     7  	"sync"
     8  
     9  	jc "github.com/juju/testing/checkers"
    10  	gc "gopkg.in/check.v1"
    11  
    12  	"github.com/juju/juju/apiserver/common"
    13  )
    14  
    15  type resourceSuite struct{}
    16  
    17  var _ = gc.Suite(resourceSuite{})
    18  
    19  type fakeResource struct {
    20  	stopped bool
    21  }
    22  
    23  func (r *fakeResource) Stop() error {
    24  	r.stopped = true
    25  	return nil
    26  }
    27  
    28  func (resourceSuite) TestRegisterGetCount(c *gc.C) {
    29  	rs := common.NewResources()
    30  	r1 := &fakeResource{}
    31  	id := rs.Register(r1)
    32  	c.Assert(id, gc.Equals, "1")
    33  	c.Assert(rs.Get("1"), gc.Equals, r1)
    34  	c.Assert(rs.Count(), gc.Equals, 1)
    35  
    36  	r2 := &fakeResource{}
    37  	id = rs.Register(r2)
    38  	c.Assert(id, gc.Equals, "2")
    39  	c.Assert(rs.Get("2"), gc.Equals, r2)
    40  	c.Assert(rs.Count(), gc.Equals, 2)
    41  }
    42  
    43  func (resourceSuite) TestRegisterNamedGetCount(c *gc.C) {
    44  	rs := common.NewResources()
    45  	defer rs.StopAll()
    46  	r1 := &fakeResource{}
    47  	err := rs.RegisterNamed("fake1", r1)
    48  	c.Assert(err, jc.ErrorIsNil)
    49  	c.Check(rs.Count(), gc.Equals, 1)
    50  	c.Check(rs.Get("fake1"), gc.Equals, r1)
    51  }
    52  
    53  func (resourceSuite) TestRegisterNamedRepeatedName(c *gc.C) {
    54  	rs := common.NewResources()
    55  	defer rs.StopAll()
    56  	r1 := &fakeResource{}
    57  	r2 := &fakeResource{}
    58  	err := rs.RegisterNamed("fake1", r1)
    59  	c.Assert(err, jc.ErrorIsNil)
    60  	c.Check(rs.Count(), gc.Equals, 1)
    61  	err = rs.RegisterNamed("fake1", r2)
    62  	c.Check(err, gc.ErrorMatches, `resource "fake1" already registered`)
    63  	c.Check(rs.Count(), gc.Equals, 1)
    64  	c.Check(rs.Get("fake1"), gc.Equals, r1)
    65  }
    66  
    67  func (resourceSuite) TestRegisterNamedIntegerName(c *gc.C) {
    68  	rs := common.NewResources()
    69  	defer rs.StopAll()
    70  	r1 := &fakeResource{}
    71  	err := rs.RegisterNamed("1", r1)
    72  	c.Check(err, gc.ErrorMatches, `RegisterNamed does not allow integer names: "1"`)
    73  	c.Check(rs.Count(), gc.Equals, 0)
    74  	c.Check(rs.Get("fake1"), gc.IsNil)
    75  }
    76  
    77  func (resourceSuite) TestRegisterNamedIntegerStart(c *gc.C) {
    78  	rs := common.NewResources()
    79  	defer rs.StopAll()
    80  	r1 := &fakeResource{}
    81  	err := rs.RegisterNamed("1fake", r1)
    82  	c.Assert(err, jc.ErrorIsNil)
    83  	c.Check(rs.Count(), gc.Equals, 1)
    84  	c.Check(rs.Get("1fake"), gc.Equals, r1)
    85  }
    86  
    87  func (resourceSuite) TestConcurrency(c *gc.C) {
    88  	// This test is designed to cause the race detector
    89  	// to fail if the locking is not done correctly.
    90  	var wg sync.WaitGroup
    91  	rs := common.NewResources()
    92  
    93  	start := func(f func()) {
    94  		wg.Add(1)
    95  		go func() {
    96  			f()
    97  			wg.Done()
    98  		}()
    99  	}
   100  	rs.Register(&fakeResource{})
   101  	start(func() {
   102  		rs.Register(&fakeResource{})
   103  	})
   104  	start(func() {
   105  		rs.RegisterNamed("named", &fakeResource{})
   106  	})
   107  	start(func() {
   108  		rs.Stop("1")
   109  	})
   110  	start(func() {
   111  		rs.Count()
   112  	})
   113  	start(func() {
   114  		rs.StopAll()
   115  	})
   116  	start(func() {
   117  		rs.Get("2")
   118  	})
   119  	start(func() {
   120  		rs.Get("named")
   121  	})
   122  	wg.Wait()
   123  }
   124  
   125  func (resourceSuite) TestStop(c *gc.C) {
   126  	rs := common.NewResources()
   127  	r1 := &fakeResource{}
   128  	rs.Register(r1)
   129  	r2 := &fakeResource{}
   130  	rs.Register(r2)
   131  	rs.Stop("1")
   132  	c.Assert(r1.stopped, jc.IsTrue)
   133  	c.Assert(rs.Get("1"), gc.IsNil)
   134  	c.Assert(r2.stopped, jc.IsFalse)
   135  	c.Assert(rs.Get("2"), gc.Equals, r2)
   136  	c.Assert(rs.Count(), gc.Equals, 1)
   137  }
   138  
   139  func (resourceSuite) TestStopAll(c *gc.C) {
   140  	rs := common.NewResources()
   141  	r1 := &fakeResource{}
   142  	rs.Register(r1)
   143  	r2 := &fakeResource{}
   144  	rs.Register(r2)
   145  	rs.StopAll()
   146  
   147  	c.Assert(r1.stopped, jc.IsTrue)
   148  	c.Assert(rs.Get("1"), gc.IsNil)
   149  	c.Assert(r2.stopped, jc.IsTrue)
   150  	c.Assert(rs.Get("2"), gc.IsNil)
   151  
   152  	c.Assert(rs.Count(), gc.Equals, 0)
   153  }
   154  
   155  func (resourceSuite) TestStringResource(c *gc.C) {
   156  	rs := common.NewResources()
   157  	r1 := common.StringResource("foobar")
   158  	id := rs.Register(r1)
   159  	c.Check(rs.Get(id), gc.Equals, r1)
   160  	asStr := rs.Get(id).(common.StringResource).String()
   161  	c.Check(asStr, gc.Equals, "foobar")
   162  }