OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package memory | 5 package memory |
6 | 6 |
7 import ( | 7 import ( |
8 "fmt" | 8 "fmt" |
9 "testing" | 9 "testing" |
10 "time" | 10 "time" |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
248 | 248 |
249 So(pm.SetMeta("key", k), ShouldB
eNil) | 249 So(pm.SetMeta("key", k), ShouldB
eNil) |
250 So(ds.Get(pm).Error(), ShouldCon
tainSubstring, "cross-group") | 250 So(ds.Get(pm).Error(), ShouldCon
tainSubstring, "cross-group") |
251 return nil | 251 return nil |
252 }, nil) | 252 }, nil) |
253 So(err, ShouldBeNil) | 253 So(err, ShouldBeNil) |
254 }) | 254 }) |
255 | 255 |
256 Convey("Get takes a snapshot", func() { | 256 Convey("Get takes a snapshot", func() { |
257 err := ds.RunInTransaction(func(c contex
t.Context) error { | 257 err := ds.RunInTransaction(func(c contex
t.Context) error { |
258 » » » » » » txnDS := dsS.Get(c) | 258 » » » » » » ds := dsS.Get(c) |
259 | 259 |
260 » » » » » » So(txnDS.Get(f), ShouldBeNil) | 260 » » » » » » So(ds.Get(f), ShouldBeNil) |
261 So(f.Val, ShouldEqual, 10) | 261 So(f.Val, ShouldEqual, 10) |
262 | 262 |
263 // Don't ever do this in a real
program unless you want to guarantee | 263 // Don't ever do this in a real
program unless you want to guarantee |
264 // a failed transaction :) | 264 // a failed transaction :) |
265 f.Val = 11 | 265 f.Val = 11 |
266 » » » » » » So(ds.Put(f), ShouldBeNil) | 266 » » » » » » So(dsS.GetNoTxn(c).Put(f), Shoul
dBeNil) |
267 | 267 |
268 » » » » » » So(txnDS.Get(f), ShouldBeNil) | 268 » » » » » » So(ds.Get(f), ShouldBeNil) |
269 So(f.Val, ShouldEqual, 10) | 269 So(f.Val, ShouldEqual, 10) |
270 | 270 |
271 return nil | 271 return nil |
272 }, nil) | 272 }, nil) |
273 So(err, ShouldBeNil) | 273 So(err, ShouldBeNil) |
274 | 274 |
275 f := &Foo{ID: 1} | 275 f := &Foo{ID: 1} |
276 So(ds.Get(f), ShouldBeNil) | 276 So(ds.Get(f), ShouldBeNil) |
277 So(f.Val, ShouldEqual, 11) | 277 So(f.Val, ShouldEqual, 11) |
278 }) | 278 }) |
279 | 279 |
280 Convey("and snapshots are consistent even after
Puts", func() { | 280 Convey("and snapshots are consistent even after
Puts", func() { |
281 err := ds.RunInTransaction(func(c contex
t.Context) error { | 281 err := ds.RunInTransaction(func(c contex
t.Context) error { |
282 » » » » » » txnDS := dsS.Get(c) | 282 » » » » » » ds := dsS.Get(c) |
283 | 283 |
284 f := &Foo{ID: 1} | 284 f := &Foo{ID: 1} |
285 » » » » » » So(txnDS.Get(f), ShouldBeNil) | 285 » » » » » » So(ds.Get(f), ShouldBeNil) |
286 So(f.Val, ShouldEqual, 10) | 286 So(f.Val, ShouldEqual, 10) |
287 | 287 |
288 // Don't ever do this in a real
program unless you want to guarantee | 288 // Don't ever do this in a real
program unless you want to guarantee |
289 // a failed transaction :) | 289 // a failed transaction :) |
290 f.Val = 11 | 290 f.Val = 11 |
291 » » » » » » So(ds.Put(f), ShouldBeNil) | 291 » » » » » » So(dsS.GetNoTxn(c).Put(f), Shoul
dBeNil) |
292 | 292 |
293 » » » » » » So(txnDS.Get(f), ShouldBeNil) | 293 » » » » » » So(ds.Get(f), ShouldBeNil) |
294 So(f.Val, ShouldEqual, 10) | 294 So(f.Val, ShouldEqual, 10) |
295 | 295 |
296 f.Val = 20 | 296 f.Val = 20 |
297 » » » » » » So(txnDS.Put(f), ShouldBeNil) | 297 » » » » » » So(ds.Put(f), ShouldBeNil) |
298 | 298 |
299 » » » » » » So(txnDS.Get(f), ShouldBeNil) | 299 » » » » » » So(ds.Get(f), ShouldBeNil) |
300 So(f.Val, ShouldEqual, 10) // st
ill gets 10 | 300 So(f.Val, ShouldEqual, 10) // st
ill gets 10 |
301 | 301 |
302 return nil | 302 return nil |
303 }, &dsS.TransactionOptions{Attempts: 1}) | 303 }, &dsS.TransactionOptions{Attempts: 1}) |
304 So(err.Error(), ShouldContainSubstring,
"concurrent") | 304 So(err.Error(), ShouldContainSubstring,
"concurrent") |
305 | 305 |
306 f := &Foo{ID: 1} | 306 f := &Foo{ID: 1} |
307 So(ds.Get(f), ShouldBeNil) | 307 So(ds.Get(f), ShouldBeNil) |
308 So(f.Val, ShouldEqual, 11) | 308 So(f.Val, ShouldEqual, 11) |
309 }) | 309 }) |
(...skipping 24 matching lines...) Expand all Loading... |
334 // Note: I think this implementation is
actually /slightly/ wrong. | 334 // Note: I think this implementation is
actually /slightly/ wrong. |
335 // According to my read of the docs for
appengine, when you open a | 335 // According to my read of the docs for
appengine, when you open a |
336 // transaction it actually (essentially)
holds a reference to the | 336 // transaction it actually (essentially)
holds a reference to the |
337 // entire datastore. Our implementation
takes a snapshot of the | 337 // entire datastore. Our implementation
takes a snapshot of the |
338 // entity group as soon as something obs
erves/affects it. | 338 // entity group as soon as something obs
erves/affects it. |
339 // | 339 // |
340 // That said... I'm not sure if there's
really a semantic difference. | 340 // That said... I'm not sure if there's
really a semantic difference. |
341 err := ds.RunInTransaction(func(c contex
t.Context) error { | 341 err := ds.RunInTransaction(func(c contex
t.Context) error { |
342 So(dsS.Get(c).Put(&Foo{ID: 1, Va
l: 21}), ShouldBeNil) | 342 So(dsS.Get(c).Put(&Foo{ID: 1, Va
l: 21}), ShouldBeNil) |
343 | 343 |
344 » » » » » » err := ds.RunInTransaction(func(
c context.Context) error { | 344 » » » » » » err := dsS.GetNoTxn(c).RunInTran
saction(func(c context.Context) error { |
345 So(dsS.Get(c).Put(&Foo{I
D: 1, Val: 27}), ShouldBeNil) | 345 So(dsS.Get(c).Put(&Foo{I
D: 1, Val: 27}), ShouldBeNil) |
346 return nil | 346 return nil |
347 }, nil) | 347 }, nil) |
348 So(err, ShouldBeNil) | 348 So(err, ShouldBeNil) |
349 | 349 |
350 return nil | 350 return nil |
351 }, nil) | 351 }, nil) |
352 So(err.Error(), ShouldContainSubstring,
"concurrent") | 352 So(err.Error(), ShouldContainSubstring,
"concurrent") |
353 | 353 |
354 f := &Foo{ID: 1} | 354 f := &Foo{ID: 1} |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
414 f := &Foo{ID: 1} | 414 f := &Foo{ID: 1} |
415 So(ds.Get(f), ShouldBeNil) | 415 So(ds.Get(f), ShouldBeNil) |
416 So(f.Val, ShouldEqual, 10) | 416 So(f.Val, ShouldEqual, 10) |
417 }) | 417 }) |
418 }) | 418 }) |
419 | 419 |
420 Convey("Transaction retries", func() { | 420 Convey("Transaction retries", func() { |
421 tst := ds.Testable() | 421 tst := ds.Testable() |
422 Reset(func() { tst.SetTransactionRetryCo
unt(0) }) | 422 Reset(func() { tst.SetTransactionRetryCo
unt(0) }) |
423 | 423 |
424 » » » » » Convey("SetTransactionRetryCount set to
zere", func() { | 424 » » » » » Convey("SetTransactionRetryCount set to
zero", func() { |
425 tst.SetTransactionRetryCount(0) | 425 tst.SetTransactionRetryCount(0) |
426 calls := 0 | 426 calls := 0 |
427 So(ds.RunInTransaction(func(c co
ntext.Context) error { | 427 So(ds.RunInTransaction(func(c co
ntext.Context) error { |
428 calls++ | 428 calls++ |
429 return nil | 429 return nil |
430 }, nil), ShouldBeNil) | 430 }, nil), ShouldBeNil) |
431 So(calls, ShouldEqual, 1) | 431 So(calls, ShouldEqual, 1) |
432 }) | 432 }) |
433 | 433 |
434 Convey("default TransactionOptions is 3
attempts", func() { | 434 Convey("default TransactionOptions is 3
attempts", func() { |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
624 So(ds.Put(&Model{ID: 1, Value: []int64{20, 30}}), ShouldBeNil) | 624 So(ds.Put(&Model{ID: 1, Value: []int64{20, 30}}), ShouldBeNil) |
625 | 625 |
626 vals := []dsS.PropertyMap{} | 626 vals := []dsS.PropertyMap{} |
627 So(ds.GetAll(dsS.NewQuery("Model").Project("Value"), &vals), Sho
uldBeNil) | 627 So(ds.GetAll(dsS.NewQuery("Model").Project("Value"), &vals), Sho
uldBeNil) |
628 So(len(vals), ShouldEqual, 2) | 628 So(len(vals), ShouldEqual, 2) |
629 | 629 |
630 So(vals[0]["Value"][0].Value(), ShouldEqual, 20) | 630 So(vals[0]["Value"][0].Value(), ShouldEqual, 20) |
631 So(vals[1]["Value"][0].Value(), ShouldEqual, 30) | 631 So(vals[1]["Value"][0].Value(), ShouldEqual, 30) |
632 }) | 632 }) |
633 } | 633 } |
OLD | NEW |