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