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 }