github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/state/apiserver/common/resource_test.go (about)

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