launchpad.net/~rogpeppe/juju-core/500-errgo-fix@v0.0.0-20140213181702-000000002356/state/apiserver/common/resource_test.go (about) 1 package common_test 2 3 import ( 4 gc "launchpad.net/gocheck" 5 "sync" 6 7 "launchpad.net/juju-core/state/apiserver/common" 8 ) 9 10 type resourceSuite struct{} 11 12 var _ = gc.Suite(resourceSuite{}) 13 14 type fakeResource struct { 15 stopped bool 16 } 17 18 func (r *fakeResource) Stop() error { 19 r.stopped = true 20 return nil 21 } 22 23 func (resourceSuite) TestRegisterGetCount(c *gc.C) { 24 rs := common.NewResources() 25 r1 := &fakeResource{} 26 id := rs.Register(r1) 27 c.Assert(id, gc.Equals, "1") 28 c.Assert(rs.Get("1"), gc.Equals, r1) 29 c.Assert(rs.Count(), gc.Equals, 1) 30 31 r2 := &fakeResource{} 32 id = rs.Register(r2) 33 c.Assert(id, gc.Equals, "2") 34 c.Assert(rs.Get("2"), gc.Equals, r2) 35 c.Assert(rs.Count(), gc.Equals, 2) 36 } 37 38 func (resourceSuite) TestConcurrency(c *gc.C) { 39 // This test is designed to cause the race detector 40 // to fail if the locking is not done correctly. 41 var wg sync.WaitGroup 42 rs := common.NewResources() 43 44 start := func(f func()) { 45 wg.Add(1) 46 go func() { 47 f() 48 wg.Done() 49 }() 50 } 51 rs.Register(&fakeResource{}) 52 start(func() { 53 rs.Register(&fakeResource{}) 54 }) 55 start(func() { 56 rs.Stop("1") 57 }) 58 start(func() { 59 rs.Count() 60 }) 61 start(func() { 62 rs.StopAll() 63 }) 64 start(func() { 65 rs.Get("2") 66 }) 67 wg.Wait() 68 } 69 70 func (resourceSuite) TestStop(c *gc.C) { 71 rs := common.NewResources() 72 r1 := &fakeResource{} 73 rs.Register(r1) 74 r2 := &fakeResource{} 75 rs.Register(r2) 76 rs.Stop("1") 77 c.Assert(r1.stopped, gc.Equals, true) 78 c.Assert(rs.Get("1"), gc.IsNil) 79 c.Assert(r2.stopped, gc.Equals, false) 80 c.Assert(rs.Get("2"), gc.Equals, r2) 81 c.Assert(rs.Count(), gc.Equals, 1) 82 } 83 84 func (resourceSuite) TestStopAll(c *gc.C) { 85 rs := common.NewResources() 86 r1 := &fakeResource{} 87 rs.Register(r1) 88 r2 := &fakeResource{} 89 rs.Register(r2) 90 rs.StopAll() 91 92 c.Assert(r1.stopped, gc.Equals, true) 93 c.Assert(rs.Get("1"), gc.IsNil) 94 c.Assert(r2.stopped, gc.Equals, true) 95 c.Assert(rs.Get("2"), gc.IsNil) 96 97 c.Assert(rs.Count(), gc.Equals, 0) 98 }