1
// Copyright 2013 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
9
jc "github.com/juju/testing/checkers"
10
gc "gopkg.in/check.v1"
12
"github.com/juju/juju/apiserver/common"
15
type resourceSuite struct{}
17
var _ = gc.Suite(resourceSuite{})
19
type fakeResource struct {
23
func (r *fakeResource) Stop() error {
28
func (resourceSuite) TestRegisterGetCount(c *gc.C) {
29
rs := common.NewResources()
32
c.Assert(id, gc.Equals, "1")
33
c.Assert(rs.Get("1"), gc.Equals, r1)
34
c.Assert(rs.Count(), gc.Equals, 1)
38
c.Assert(id, gc.Equals, "2")
39
c.Assert(rs.Get("2"), gc.Equals, r2)
40
c.Assert(rs.Count(), gc.Equals, 2)
43
func (resourceSuite) TestRegisterNamedGetCount(c *gc.C) {
44
rs := common.NewResources()
47
err := rs.RegisterNamed("fake1", r1)
48
c.Assert(err, jc.ErrorIsNil)
49
c.Check(rs.Count(), gc.Equals, 1)
50
c.Check(rs.Get("fake1"), gc.Equals, r1)
53
func (resourceSuite) TestRegisterNamedRepeatedName(c *gc.C) {
54
rs := common.NewResources()
58
err := rs.RegisterNamed("fake1", r1)
59
c.Assert(err, jc.ErrorIsNil)
60
c.Check(rs.Count(), gc.Equals, 1)
61
err = rs.RegisterNamed("fake1", r2)
62
c.Check(err, gc.ErrorMatches, `resource "fake1" already registered`)
63
c.Check(rs.Count(), gc.Equals, 1)
64
c.Check(rs.Get("fake1"), gc.Equals, r1)
67
func (resourceSuite) TestRegisterNamedIntegerName(c *gc.C) {
68
rs := common.NewResources()
71
err := rs.RegisterNamed("1", r1)
72
c.Check(err, gc.ErrorMatches, `RegisterNamed does not allow integer names: "1"`)
73
c.Check(rs.Count(), gc.Equals, 0)
74
c.Check(rs.Get("fake1"), gc.IsNil)
77
func (resourceSuite) TestRegisterNamedIntegerStart(c *gc.C) {
78
rs := common.NewResources()
81
err := rs.RegisterNamed("1fake", r1)
82
c.Assert(err, jc.ErrorIsNil)
83
c.Check(rs.Count(), gc.Equals, 1)
84
c.Check(rs.Get("1fake"), gc.Equals, r1)
87
func (resourceSuite) TestConcurrency(c *gc.C) {
88
// This test is designed to cause the race detector
89
// to fail if the locking is not done correctly.
91
rs := common.NewResources()
93
start := func(f func()) {
100
rs.Register(&fakeResource{})
102
rs.Register(&fakeResource{})
105
rs.RegisterNamed("named", &fakeResource{})
125
func (resourceSuite) TestStop(c *gc.C) {
126
rs := common.NewResources()
127
r1 := &fakeResource{}
129
r2 := &fakeResource{}
132
c.Assert(r1.stopped, jc.IsTrue)
133
c.Assert(rs.Get("1"), gc.IsNil)
134
c.Assert(r2.stopped, jc.IsFalse)
135
c.Assert(rs.Get("2"), gc.Equals, r2)
136
c.Assert(rs.Count(), gc.Equals, 1)
139
func (resourceSuite) TestStopAll(c *gc.C) {
140
rs := common.NewResources()
141
r1 := &fakeResource{}
143
r2 := &fakeResource{}
147
c.Assert(r1.stopped, jc.IsTrue)
148
c.Assert(rs.Get("1"), gc.IsNil)
149
c.Assert(r2.stopped, jc.IsTrue)
150
c.Assert(rs.Get("2"), gc.IsNil)
152
c.Assert(rs.Count(), gc.Equals, 0)
155
func (resourceSuite) TestStringResource(c *gc.C) {
156
rs := common.NewResources()
157
r1 := common.StringResource("foobar")
158
id := rs.Register(r1)
159
c.Check(rs.Get(id), gc.Equals, r1)
160
asStr := rs.Get(id).(common.StringResource).String()
161
c.Check(asStr, gc.Equals, "foobar")