github.com/cloudbase/juju-core@v0.0.0-20140504232958-a7271ac7912f/state/apiserver/common/resource_test.go (about)

     1  package common_test
     2  
     3  import (
     4  	"sync"
     5  
     6  	gc "launchpad.net/gocheck"
     7  
     8  	"launchpad.net/juju-core/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) TestConcurrency(c *gc.C) {
    40  	// This test is designed to cause the race detector
    41  	// to fail if the locking is not done correctly.
    42  	var wg sync.WaitGroup
    43  	rs := common.NewResources()
    44  
    45  	start := func(f func()) {
    46  		wg.Add(1)
    47  		go func() {
    48  			f()
    49  			wg.Done()
    50  		}()
    51  	}
    52  	rs.Register(&fakeResource{})
    53  	start(func() {
    54  		rs.Register(&fakeResource{})
    55  	})
    56  	start(func() {
    57  		rs.Stop("1")
    58  	})
    59  	start(func() {
    60  		rs.Count()
    61  	})
    62  	start(func() {
    63  		rs.StopAll()
    64  	})
    65  	start(func() {
    66  		rs.Get("2")
    67  	})
    68  	wg.Wait()
    69  }
    70  
    71  func (resourceSuite) TestStop(c *gc.C) {
    72  	rs := common.NewResources()
    73  	r1 := &fakeResource{}
    74  	rs.Register(r1)
    75  	r2 := &fakeResource{}
    76  	rs.Register(r2)
    77  	rs.Stop("1")
    78  	c.Assert(r1.stopped, gc.Equals, true)
    79  	c.Assert(rs.Get("1"), gc.IsNil)
    80  	c.Assert(r2.stopped, gc.Equals, false)
    81  	c.Assert(rs.Get("2"), gc.Equals, r2)
    82  	c.Assert(rs.Count(), gc.Equals, 1)
    83  }
    84  
    85  func (resourceSuite) TestStopAll(c *gc.C) {
    86  	rs := common.NewResources()
    87  	r1 := &fakeResource{}
    88  	rs.Register(r1)
    89  	r2 := &fakeResource{}
    90  	rs.Register(r2)
    91  	rs.StopAll()
    92  
    93  	c.Assert(r1.stopped, gc.Equals, true)
    94  	c.Assert(rs.Get("1"), gc.IsNil)
    95  	c.Assert(r2.stopped, gc.Equals, true)
    96  	c.Assert(rs.Get("2"), gc.IsNil)
    97  
    98  	c.Assert(rs.Count(), gc.Equals, 0)
    99  }