github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/apiserver/common/resource_test.go (about)

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