Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: impl/memory/datastore_query_execution_test.go

Issue 2498463003: Fix a bug where deletions weren't updating the raw Kind index. (Closed)
Patch Set: Fix Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The LUCI Authors. All rights reserved. 1 // Copyright 2015 The LUCI Authors. All rights reserved.
2 // Use of this source code is governed under the Apache License, Version 2.0 2 // Use of this source code is governed under the Apache License, Version 2.0
3 // that can be found in the LICENSE file. 3 // that can be found in the LICENSE file.
4 4
5 package memory 5 package memory
6 6
7 import ( 7 import (
8 "fmt" 8 "fmt"
9 "strings" 9 "strings"
10 "testing" 10 "testing"
(...skipping 348 matching lines...) Expand 10 before | Expand all | Expand 10 after
359 pmap("$key", mkKey("dev~app", "", "__nam espace__", "bob")), 359 pmap("$key", mkKey("dev~app", "", "__nam espace__", "bob")),
360 pmap("$key", mkKey("dev~app", "", "__nam espace__", "ns")), 360 pmap("$key", mkKey("dev~app", "", "__nam espace__", "ns")),
361 }}, 361 }},
362 {q: nq("__namespace__").Offset(1), get: []ds.Pro pertyMap{ 362 {q: nq("__namespace__").Offset(1), get: []ds.Pro pertyMap{
363 pmap("$key", mkKey("dev~app", "", "__nam espace__", "bob")), 363 pmap("$key", mkKey("dev~app", "", "__nam espace__", "bob")),
364 pmap("$key", mkKey("dev~app", "", "__nam espace__", "ns")), 364 pmap("$key", mkKey("dev~app", "", "__nam espace__", "ns")),
365 }}, 365 }},
366 {q: nq("__namespace__").Offset(1).Limit(1), get: []ds.PropertyMap{ 366 {q: nq("__namespace__").Offset(1).Limit(1), get: []ds.PropertyMap{
367 pmap("$key", mkKey("dev~app", "", "__nam espace__", "bob")), 367 pmap("$key", mkKey("dev~app", "", "__nam espace__", "bob")),
368 }}, 368 }},
369 //
370 // eventual consistency; Unique/1 is deleted at HEAD. Keysonly finds it,
371 // but 'normal' doesn't.
372 {q: nq("Unique").Gt("__key__", key("AKind", 5)). Lte("__key__", key("Zeta", "prime")),
373 keys: []*ds.Key{key("Unique", 1)},
374 get: []ds.PropertyMap{}},
369 }, 375 },
370 376
371 extraFns: []func(context.Context){ 377 extraFns: []func(context.Context){
372 func(c context.Context) { 378 func(c context.Context) {
373 curs := ds.Cursor(nil) 379 curs := ds.Cursor(nil)
374 380
375 q := nq("").Gt("__key__", key("Kind", 2) ) 381 q := nq("").Gt("__key__", key("Kind", 2) )
376 382
377 err := ds.Run(c, q, func(pm ds.PropertyM ap, gc ds.CursorCB) error { 383 err := ds.Run(c, q, func(pm ds.PropertyM ap, gc ds.CursorCB) error {
378 So(pm, ShouldResemble, pmap( 384 So(pm, ShouldResemble, pmap(
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 " ancestor: yes", 420 " ancestor: yes",
415 " properties:", 421 " properties:",
416 " - name: Val", 422 " - name: Val",
417 }, "\n")) 423 }, "\n"))
418 }, 424 },
419 }, 425 },
420 }, 426 },
421 427
422 { 428 {
423 expect: []qExpect{ 429 expect: []qExpect{
424 // eventual consistency; Unique/1 is deleted at HEAD. Keysonly finds it,
425 // but 'normal' doesn't.
426 {q: nq("Unique").Gt("__key__", key("AKind", 5)). Lte("__key__", key("Zeta", "prime")),
427 keys: []*ds.Key{key("Unique", 1)},
428 get: []ds.PropertyMap{}},
429
430 {q: nq("Kind").Eq("Val", 1, 3), get: []ds.Proper tyMap{ 430 {q: nq("Kind").Eq("Val", 1, 3), get: []ds.Proper tyMap{
431 stage1Data[0], stage2Data[2], 431 stage1Data[0], stage2Data[2],
432 }}, 432 }},
433 }, 433 },
434 }, 434 },
435 }}, 435 }},
436
436 {"collapsed types", []qExStage{ 437 {"collapsed types", []qExStage{
437 { 438 {
438 putEnts: collapsedData, 439 putEnts: collapsedData,
439 }, 440 },
440 { 441 {
441 expect: []qExpect{ 442 expect: []qExpect{
442 // PTTime 443 // PTTime
443 { 444 {
444 q: nq("Kind").Lte("Date", time.Date(2000 , time.February, 1, 1, 1, 1, 1, time.UTC)), 445 q: nq("Kind").Lte("Date", time.Date(2000 , time.February, 1, 1, 1, 1, 1, time.UTC)),
445 get: []ds.PropertyMap{ 446 get: []ds.PropertyMap{
(...skipping 30 matching lines...) Expand all
476 }, 477 },
477 { 478 {
478 q: nq("Kind").Eq("Val", []byte("uwutm8") ), 479 q: nq("Kind").Eq("Val", []byte("uwutm8") ),
479 get: []ds.PropertyMap{ 480 get: []ds.PropertyMap{
480 collapsedData[5], 481 collapsedData[5],
481 }, 482 },
482 }, 483 },
483 }, 484 },
484 }, 485 },
485 }}, 486 }},
487
488 {"regression: tombstones and limit/offset queries", []qExStage{
489 {
490 putEnts: []ds.PropertyMap{
491 pmap("$key", key("Kind", 1)),
492 pmap("$key", key("Kind", 2)),
493 pmap("$key", key("Kind", 3)),
494 },
495 delEnts: []*ds.Key{key("Kind", 2)},
496 },
497 {
498 expect: []qExpect{
499 {
500 q: nq("Kind").Limit(2),
501 get: []ds.PropertyMap{
502 pmap("$key", key("Kind", 1)),
503 pmap("$key", key("Kind", 3)),
504 },
505 },
506
507 {
508 q: nq("Kind").Offset(2),
509 get: []ds.PropertyMap{},
510 },
511 },
512 },
513 }},
486 } 514 }
487 515
488 func TestQueryExecution(t *testing.T) { 516 func TestQueryExecution(t *testing.T) {
489 t.Parallel() 517 t.Parallel()
490 518
491 Convey("Test query execution", t, func() { 519 Convey("Test query execution", t, func() {
492 c, err := info.Namespace(Use(context.Background()), "ns") 520 c, err := info.Namespace(Use(context.Background()), "ns")
493 if err != nil { 521 if err != nil {
494 panic(err) 522 panic(err)
495 } 523 }
(...skipping 17 matching lines...) Expand all
513 } 541 }
514 for ns, ents := range byNs { 542 for ns, ents := range byNs {
515 c := info.MustNamespace(c, ns) 543 c := info.MustNamespace(c, ns)
516 if err := ds.Put(c, ents); err ! = nil { 544 if err := ds.Put(c, ents); err ! = nil {
517 // prevent Convey from t hinking this assertion should show up in 545 // prevent Convey from t hinking this assertion should show up in
518 // every test loop. 546 // every test loop.
519 panic(err) 547 panic(err)
520 } 548 }
521 } 549 }
522 550
551 if len(stage.delEnts) > 0 {
552 //fmt.Println("DELETING", stage. delEnts)
553 }
iannucci 2016/11/12 00:05:47 derp
523 if err := ds.Delete(c, stage.delEnts); e rr != nil { 554 if err := ds.Delete(c, stage.delEnts); e rr != nil {
524 panic(err) 555 panic(err)
525 } 556 }
526 557
527 Convey(fmt.Sprintf("stage %d", i), func( ) { 558 Convey(fmt.Sprintf("stage %d", i), func( ) {
528 for j, expect := range stage.exp ect { 559 for j, expect := range stage.exp ect {
529 runner := func(c context .Context, f func(ic context.Context) error, _ *ds.TransactionOptions) error { 560 runner := func(c context .Context, f func(ic context.Context) error, _ *ds.TransactionOptions) error {
530 return f(c) 561 return f(c)
531 } 562 }
532 if expect.inTxn { 563 if expect.inTxn {
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
633 664
634 v, ok := actual.(error) 665 v, ok := actual.(error)
635 if !ok { 666 if !ok {
636 return fmt.Sprintf("type of 'actual' must be error, not %T", act ual) 667 return fmt.Sprintf("type of 'actual' must be error, not %T", act ual)
637 } 668 }
638 if v == nil || v == ds.Stop { 669 if v == nil || v == ds.Stop {
639 return "" 670 return ""
640 } 671 }
641 return fmt.Sprintf("expected success value, not %v", v) 672 return fmt.Sprintf("expected success value, not %v", v)
642 } 673 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698