10
func (s *S) TestRetryChangeCreating(c *C) {
13
err := zk.RetryChange("/test", gozk.EPHEMERAL, gozk.WorldACL(gozk.PERM_ALL),
14
func(data string, stat gozk.Stat) (string, os.Error) {
15
c.Assert(data, Equals, "")
21
data, stat, err := zk.Get("/test")
23
c.Assert(stat, NotNil)
24
c.Assert(stat.Version(), Equals, int32(0))
25
c.Assert(data, Equals, "new")
27
acl, _, err := zk.GetACL("/test")
29
c.Assert(acl, Equals, gozk.WorldACL(gozk.PERM_ALL))
32
func (s *S) TestRetryChangeSetting(c *C) {
35
_, err := zk.Create("/test", "old", gozk.EPHEMERAL,
36
gozk.WorldACL(gozk.PERM_ALL))
39
err = zk.RetryChange("/test", gozk.EPHEMERAL, []gozk.ACL{},
40
func(data string, stat gozk.Stat) (string, os.Error) {
41
c.Assert(data, Equals, "old")
42
c.Assert(stat, NotNil)
43
c.Assert(stat.Version(), Equals, int32(0))
44
return "brand new", nil
48
data, stat, err := zk.Get("/test")
50
c.Assert(stat, NotNil)
51
c.Assert(stat.Version(), Equals, int32(1))
52
c.Assert(data, Equals, "brand new")
54
// ACL was unchanged by RetryChange().
55
acl, _, err := zk.GetACL("/test")
57
c.Assert(acl, Equals, gozk.WorldACL(gozk.PERM_ALL))
60
func (s *S) TestRetryChangeUnchangedValueDoesNothing(c *C) {
63
_, err := zk.Create("/test", "old", gozk.EPHEMERAL,
64
gozk.WorldACL(gozk.PERM_ALL))
67
err = zk.RetryChange("/test", gozk.EPHEMERAL, []gozk.ACL{},
68
func(data string, stat gozk.Stat) (string, os.Error) {
69
c.Assert(data, Equals, "old")
70
c.Assert(stat, NotNil)
71
c.Assert(stat.Version(), Equals, int32(0))
76
data, stat, err := zk.Get("/test")
78
c.Assert(stat, NotNil)
79
c.Assert(stat.Version(), Equals, int32(0)) // Unchanged!
80
c.Assert(data, Equals, "old")
83
func (s *S) TestRetryChangeConflictOnCreate(c *C) {
86
changeFunc := func(data string, stat gozk.Stat) (string, os.Error) {
90
_, err := zk.Create("/test", "conflict", gozk.EPHEMERAL,
91
gozk.WorldACL(gozk.PERM_ALL))
93
return "<none> => conflict", nil
95
c.Assert(stat, NotNil)
96
c.Assert(stat.Version(), Equals, int32(0))
97
return "conflict => new", nil
99
c.Fatal("Unexpected node data: " + data)
101
return "can't happen", nil
104
err := zk.RetryChange("/test", gozk.EPHEMERAL, gozk.WorldACL(gozk.PERM_ALL),
108
data, stat, err := zk.Get("/test")
110
c.Assert(data, Equals, "conflict => new")
111
c.Assert(stat, NotNil)
112
c.Assert(stat.Version(), Equals, int32(1))
115
func (s *S) TestRetryChangeConflictOnSetDueToChange(c *C) {
118
_, err := zk.Create("/test", "old", gozk.EPHEMERAL,
119
gozk.WorldACL(gozk.PERM_ALL))
122
changeFunc := func(data string, stat gozk.Stat) (string, os.Error) {
125
c.Assert(stat, NotNil)
126
c.Assert(stat.Version(), Equals, int32(0))
127
_, err := zk.Set("/test", "conflict", 0)
129
return "old => new", nil
131
c.Assert(stat, NotNil)
132
c.Assert(stat.Version(), Equals, int32(1))
133
return "conflict => new", nil
135
c.Fatal("Unexpected node data: " + data)
137
return "can't happen", nil
140
err = zk.RetryChange("/test", gozk.EPHEMERAL, []gozk.ACL{}, changeFunc)
143
data, stat, err := zk.Get("/test")
145
c.Assert(data, Equals, "conflict => new")
146
c.Assert(stat, NotNil)
147
c.Assert(stat.Version(), Equals, int32(2))
150
func (s *S) TestRetryChangeConflictOnSetDueToDelete(c *C) {
153
_, err := zk.Create("/test", "old", gozk.EPHEMERAL,
154
gozk.WorldACL(gozk.PERM_ALL))
157
changeFunc := func(data string, stat gozk.Stat) (string, os.Error) {
160
c.Assert(stat, NotNil)
161
c.Assert(stat.Version(), Equals, int32(0))
162
err := zk.Delete("/test", 0)
164
return "old => <deleted>", nil
166
c.Assert(stat, IsNil)
167
return "<deleted> => new", nil
169
c.Fatal("Unexpected node data: " + data)
171
return "can't happen", nil
174
err = zk.RetryChange("/test", gozk.EPHEMERAL, gozk.WorldACL(gozk.PERM_READ),
178
data, stat, err := zk.Get("/test")
180
c.Assert(data, Equals, "<deleted> => new")
181
c.Assert(stat, NotNil)
182
c.Assert(stat.Version(), Equals, int32(0))
184
// Should be the new ACL.
185
acl, _, err := zk.GetACL("/test")
187
c.Assert(acl, Equals, gozk.WorldACL(gozk.PERM_READ))
190
func (s *S) TestRetryChangeErrorInCallback(c *C) {
193
err := zk.RetryChange("/test", gozk.EPHEMERAL, gozk.WorldACL(gozk.PERM_ALL),
194
func(data string, stat gozk.Stat) (string, os.Error) {
195
return "don't use this", os.NewError("BOOM!")
197
c.Assert(err, NotNil)
198
c.Assert(err.Code(), Equals, gozk.ZSYSTEMERROR)
199
c.Assert(err.String(), Equals, "BOOM!")
201
stat, err := zk.Exists("/test")
203
c.Assert(stat, IsNil)
206
func (s *S) TestRetryChangeFailsReading(c *C) {
209
_, err := zk.Create("/test", "old", gozk.EPHEMERAL,
210
gozk.WorldACL(gozk.PERM_WRITE)) // Write only!
214
err = zk.RetryChange("/test", gozk.EPHEMERAL, gozk.WorldACL(gozk.PERM_ALL),
215
func(data string, stat gozk.Stat) (string, os.Error) {
219
c.Assert(err, NotNil)
220
c.Assert(err.Code(), Equals, gozk.ZNOAUTH)
222
stat, err := zk.Exists("/test")
224
c.Assert(stat, NotNil)
225
c.Assert(stat.Version(), Equals, int32(0))
227
c.Assert(called, Equals, false)
230
func (s *S) TestRetryChangeFailsSetting(c *C) {
233
_, err := zk.Create("/test", "old", gozk.EPHEMERAL,
234
gozk.WorldACL(gozk.PERM_READ)) // Read only!
238
err = zk.RetryChange("/test", gozk.EPHEMERAL, gozk.WorldACL(gozk.PERM_ALL),
239
func(data string, stat gozk.Stat) (string, os.Error) {
243
c.Assert(err, NotNil)
244
c.Assert(err.Code(), Equals, gozk.ZNOAUTH)
246
stat, err := zk.Exists("/test")
248
c.Assert(stat, NotNil)
249
c.Assert(stat.Version(), Equals, int32(0))
251
c.Assert(called, Equals, true)
254
func (s *S) TestRetryChangeFailsCreating(c *C) {
257
_, err := zk.Create("/test", "old", gozk.EPHEMERAL,
258
gozk.WorldACL(gozk.PERM_READ)) // Read only!
262
err = zk.RetryChange("/test/sub", gozk.EPHEMERAL,
263
gozk.WorldACL(gozk.PERM_ALL),
264
func(data string, stat gozk.Stat) (string, os.Error) {
268
c.Assert(err, NotNil)
269
c.Assert(err.Code(), Equals, gozk.ZNOAUTH)
271
stat, err := zk.Exists("/test/sub")
273
c.Assert(stat, IsNil)
275
c.Assert(called, Equals, true)