1
// Copyright 2012-2014 Canonical Ltd.
2
// Licensed under the AGPLv3, see LICENCE file for details.
7
"github.com/juju/errors"
8
"github.com/juju/testing"
9
jc "github.com/juju/testing/checkers"
10
gc "gopkg.in/check.v1"
12
"github.com/juju/juju/apiserver/params"
13
"github.com/juju/juju/worker/uniter/runner/context"
16
type settingsResult struct {
17
settings params.Settings
21
type RelationCacheSuite struct {
22
testing.IsolationSuite
24
results []settingsResult
27
var _ = gc.Suite(&RelationCacheSuite{})
29
func (s *RelationCacheSuite) SetUpTest(c *gc.C) {
31
s.results = []settingsResult{}
34
func (s *RelationCacheSuite) ReadSettings(unitName string) (params.Settings, error) {
35
result := s.results[len(s.calls)]
36
s.calls = append(s.calls, unitName)
37
return result.settings, result.err
40
func (s *RelationCacheSuite) TestCreateEmpty(c *gc.C) {
41
cache := context.NewRelationCache(s.ReadSettings, nil)
42
c.Assert(cache.MemberNames(), gc.HasLen, 0)
43
c.Assert(s.calls, gc.HasLen, 0)
46
func (s *RelationCacheSuite) TestCreateWithMembers(c *gc.C) {
47
cache := context.NewRelationCache(s.ReadSettings, []string{"u/3", "u/2", "u/1"})
48
c.Assert(cache.MemberNames(), jc.DeepEquals, []string{"u/1", "u/2", "u/3"})
49
c.Assert(s.calls, gc.HasLen, 0)
52
func (s *RelationCacheSuite) TestInvalidateMemberChangesMembership(c *gc.C) {
53
cache := context.NewRelationCache(s.ReadSettings, nil)
54
cache.InvalidateMember("foo/1")
55
c.Assert(cache.MemberNames(), jc.DeepEquals, []string{"foo/1"})
56
cache.InvalidateMember("foo/2")
57
c.Assert(cache.MemberNames(), jc.DeepEquals, []string{"foo/1", "foo/2"})
58
cache.InvalidateMember("foo/2")
59
c.Assert(cache.MemberNames(), jc.DeepEquals, []string{"foo/1", "foo/2"})
60
c.Assert(s.calls, gc.HasLen, 0)
63
func (s *RelationCacheSuite) TestRemoveMemberChangesMembership(c *gc.C) {
64
cache := context.NewRelationCache(s.ReadSettings, []string{"x/2"})
65
cache.RemoveMember("x/1")
66
c.Assert(cache.MemberNames(), jc.DeepEquals, []string{"x/2"})
67
cache.RemoveMember("x/2")
68
c.Assert(cache.MemberNames(), gc.HasLen, 0)
69
c.Assert(s.calls, gc.HasLen, 0)
72
func (s *RelationCacheSuite) TestPruneChangesMembership(c *gc.C) {
73
cache := context.NewRelationCache(s.ReadSettings, []string{"u/1", "u/2", "u/3"})
74
cache.Prune([]string{"u/3", "u/4", "u/5"})
75
c.Assert(cache.MemberNames(), jc.DeepEquals, []string{"u/3", "u/4", "u/5"})
76
c.Assert(s.calls, gc.HasLen, 0)
79
func (s *RelationCacheSuite) TestSettingsPropagatesError(c *gc.C) {
80
s.results = []settingsResult{{
81
nil, errors.New("blam"),
83
cache := context.NewRelationCache(s.ReadSettings, nil)
85
settings, err := cache.Settings("whatever")
86
c.Assert(settings, gc.IsNil)
87
c.Assert(err, gc.ErrorMatches, "blam")
88
c.Assert(s.calls, jc.DeepEquals, []string{"whatever"})
91
func (s *RelationCacheSuite) TestSettingsCachesMemberSettings(c *gc.C) {
92
s.results = []settingsResult{{
93
params.Settings{"foo": "bar"}, nil,
95
cache := context.NewRelationCache(s.ReadSettings, []string{"x/2"})
97
for i := 0; i < 2; i++ {
98
settings, err := cache.Settings("x/2")
99
c.Assert(err, jc.ErrorIsNil)
100
c.Assert(settings, jc.DeepEquals, params.Settings{"foo": "bar"})
101
c.Assert(s.calls, jc.DeepEquals, []string{"x/2"})
105
func (s *RelationCacheSuite) TestInvalidateMemberUncachesMemberSettings(c *gc.C) {
106
s.results = []settingsResult{{
107
params.Settings{"foo": "bar"}, nil,
109
params.Settings{"baz": "qux"}, nil,
111
cache := context.NewRelationCache(s.ReadSettings, []string{"x/2"})
113
settings, err := cache.Settings("x/2")
114
c.Assert(err, jc.ErrorIsNil)
115
c.Assert(settings, jc.DeepEquals, params.Settings{"foo": "bar"})
116
c.Assert(s.calls, jc.DeepEquals, []string{"x/2"})
118
cache.InvalidateMember("x/2")
119
settings, err = cache.Settings("x/2")
120
c.Assert(err, jc.ErrorIsNil)
121
c.Assert(settings, jc.DeepEquals, params.Settings{"baz": "qux"})
122
c.Assert(s.calls, jc.DeepEquals, []string{"x/2", "x/2"})
125
func (s *RelationCacheSuite) TestInvalidateMemberUncachesOtherSettings(c *gc.C) {
126
s.results = []settingsResult{{
127
params.Settings{"foo": "bar"}, nil,
129
params.Settings{"baz": "qux"}, nil,
131
cache := context.NewRelationCache(s.ReadSettings, nil)
133
settings, err := cache.Settings("x/2")
134
c.Assert(err, jc.ErrorIsNil)
135
c.Assert(settings, jc.DeepEquals, params.Settings{"foo": "bar"})
136
c.Assert(s.calls, jc.DeepEquals, []string{"x/2"})
138
cache.InvalidateMember("x/2")
139
settings, err = cache.Settings("x/2")
140
c.Assert(err, jc.ErrorIsNil)
141
c.Assert(settings, jc.DeepEquals, params.Settings{"baz": "qux"})
142
c.Assert(s.calls, jc.DeepEquals, []string{"x/2", "x/2"})
145
func (s *RelationCacheSuite) TestRemoveMemberUncachesMemberSettings(c *gc.C) {
146
s.results = []settingsResult{{
147
params.Settings{"foo": "bar"}, nil,
149
params.Settings{"baz": "qux"}, nil,
151
cache := context.NewRelationCache(s.ReadSettings, []string{"x/2"})
153
settings, err := cache.Settings("x/2")
154
c.Assert(err, jc.ErrorIsNil)
155
c.Assert(settings, jc.DeepEquals, params.Settings{"foo": "bar"})
156
c.Assert(s.calls, jc.DeepEquals, []string{"x/2"})
158
cache.RemoveMember("x/2")
159
settings, err = cache.Settings("x/2")
160
c.Assert(err, jc.ErrorIsNil)
161
c.Assert(settings, jc.DeepEquals, params.Settings{"baz": "qux"})
162
c.Assert(s.calls, jc.DeepEquals, []string{"x/2", "x/2"})
165
func (s *RelationCacheSuite) TestSettingsCachesOtherSettings(c *gc.C) {
166
s.results = []settingsResult{{
167
params.Settings{"foo": "bar"}, nil,
169
cache := context.NewRelationCache(s.ReadSettings, nil)
171
for i := 0; i < 2; i++ {
172
settings, err := cache.Settings("x/2")
173
c.Assert(err, jc.ErrorIsNil)
174
c.Assert(settings, jc.DeepEquals, params.Settings{"foo": "bar"})
175
c.Assert(s.calls, jc.DeepEquals, []string{"x/2"})
179
func (s *RelationCacheSuite) TestPrunePreservesMemberSettings(c *gc.C) {
180
s.results = []settingsResult{{
181
params.Settings{"foo": "bar"}, nil,
183
cache := context.NewRelationCache(s.ReadSettings, []string{"foo/2"})
185
settings, err := cache.Settings("foo/2")
186
c.Assert(err, jc.ErrorIsNil)
187
c.Assert(settings, jc.DeepEquals, params.Settings{"foo": "bar"})
188
c.Assert(s.calls, jc.DeepEquals, []string{"foo/2"})
190
cache.Prune([]string{"foo/2"})
191
settings, err = cache.Settings("foo/2")
192
c.Assert(err, jc.ErrorIsNil)
193
c.Assert(settings, jc.DeepEquals, params.Settings{"foo": "bar"})
194
c.Assert(s.calls, jc.DeepEquals, []string{"foo/2"})
197
func (s *RelationCacheSuite) TestPruneUncachesOtherSettings(c *gc.C) {
198
s.results = []settingsResult{{
199
params.Settings{"foo": "bar"}, nil,
201
params.Settings{"baz": "qux"}, nil,
203
cache := context.NewRelationCache(s.ReadSettings, nil)
205
settings, err := cache.Settings("x/2")
206
c.Assert(err, jc.ErrorIsNil)
207
c.Assert(settings, jc.DeepEquals, params.Settings{"foo": "bar"})
208
c.Assert(s.calls, jc.DeepEquals, []string{"x/2"})
211
settings, err = cache.Settings("x/2")
212
c.Assert(err, jc.ErrorIsNil)
213
c.Assert(settings, jc.DeepEquals, params.Settings{"baz": "qux"})
214
c.Assert(s.calls, jc.DeepEquals, []string{"x/2", "x/2"})