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 }