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

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

Issue 2342063003: Differentiate between single- and multi- props. (Closed)
Patch Set: Slice is now always a clone. This is marginally worse performance, but a much safer UI. Created 4 years, 3 months 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
« no previous file with comments | « impl/memory/datastore_query_execution.go ('k') | impl/memory/race_test.go » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "testing" 9 "testing"
10 "time" 10 "time"
(...skipping 22 matching lines...) Expand all
33 } 33 }
34 return mg.Version 34 return mg.Version
35 } 35 }
36 36
37 var pls = dsS.GetPLS 37 var pls = dsS.GetPLS
38 38
39 type Foo struct { 39 type Foo struct {
40 ID int64 `gae:"$id"` 40 ID int64 `gae:"$id"`
41 Parent *dsS.Key `gae:"$parent"` 41 Parent *dsS.Key `gae:"$parent"`
42 42
43 » Val int 43 » Val int
44 » Name string 44 » Name string
45 » Multi []string
45 } 46 }
46 47
47 func TestDatastoreSingleReadWriter(t *testing.T) { 48 func TestDatastoreSingleReadWriter(t *testing.T) {
48 t.Parallel() 49 t.Parallel()
49 50
50 Convey("Datastore single reads and writes", t, func() { 51 Convey("Datastore single reads and writes", t, func() {
51 c := Use(context.Background()) 52 c := Use(context.Background())
52 ds := dsS.Get(c) 53 ds := dsS.Get(c)
53 So(ds, ShouldNotBeNil) 54 So(ds, ShouldNotBeNil)
54 55
55 Convey("getting objects that DNE is an error", func() { 56 Convey("getting objects that DNE is an error", func() {
56 So(ds.Get(&Foo{ID: 1}), ShouldEqual, dsS.ErrNoSuchEntity ) 57 So(ds.Get(&Foo{ID: 1}), ShouldEqual, dsS.ErrNoSuchEntity )
57 }) 58 })
58 59
59 Convey("bad namespaces fail", func() { 60 Convey("bad namespaces fail", func() {
60 _, err := infoS.Get(c).Namespace("$$blzyall") 61 _, err := infoS.Get(c).Namespace("$$blzyall")
61 So(err.Error(), ShouldContainSubstring, "namespace \"$$b lzyall\" does not match") 62 So(err.Error(), ShouldContainSubstring, "namespace \"$$b lzyall\" does not match")
62 }) 63 })
63 64
64 Convey("Can Put stuff", func() { 65 Convey("Can Put stuff", func() {
65 // with an incomplete key! 66 // with an incomplete key!
66 » » » f := &Foo{Val: 10} 67 » » » f := &Foo{Val: 10, Multi: []string{"foo", "bar"}}
67 So(ds.Put(f), ShouldBeNil) 68 So(ds.Put(f), ShouldBeNil)
68 k := ds.KeyForObj(f) 69 k := ds.KeyForObj(f)
69 So(k.String(), ShouldEqual, "dev~app::/Foo,1") 70 So(k.String(), ShouldEqual, "dev~app::/Foo,1")
70 71
71 Convey("and Get it back", func() { 72 Convey("and Get it back", func() {
72 newFoo := &Foo{ID: 1} 73 newFoo := &Foo{ID: 1}
73 So(ds.Get(newFoo), ShouldBeNil) 74 So(ds.Get(newFoo), ShouldBeNil)
74 So(newFoo, ShouldResemble, f) 75 So(newFoo, ShouldResemble, f)
75 76
76 Convey("but it's hidden from a different namespa ce", func() { 77 Convey("but it's hidden from a different namespa ce", func() {
77 c, err := infoS.Get(c).Namespace("whomba t") 78 c, err := infoS.Get(c).Namespace("whomba t")
78 So(err, ShouldBeNil) 79 So(err, ShouldBeNil)
79 ds = dsS.Get(c) 80 ds = dsS.Get(c)
80 So(ds.Get(f), ShouldEqual, dsS.ErrNoSuch Entity) 81 So(ds.Get(f), ShouldEqual, dsS.ErrNoSuch Entity)
81 }) 82 })
82 83
83 Convey("and we can Delete it", func() { 84 Convey("and we can Delete it", func() {
84 So(ds.Delete(k), ShouldBeNil) 85 So(ds.Delete(k), ShouldBeNil)
85 So(ds.Get(newFoo), ShouldEqual, dsS.ErrN oSuchEntity) 86 So(ds.Get(newFoo), ShouldEqual, dsS.ErrN oSuchEntity)
86 }) 87 })
87 88
88 }) 89 })
90 Convey("Can Get it back as a PropertyMap", func() {
91 pmap := dsS.PropertyMap{
92 "$id": propNI(1),
93 "$kind": propNI("Foo"),
94 }
95 So(ds.Get(pmap), ShouldBeNil)
96 So(pmap, ShouldResemble, dsS.PropertyMap{
97 "$id": propNI(1),
98 "$kind": propNI("Foo"),
99 "Name": prop(""),
100 "Val": prop(10),
101 "Multi": dsS.PropertySlice{prop("foo"), prop("bar")},
102 })
103 })
89 Convey("Deleteing with a bogus key is bad", func() { 104 Convey("Deleteing with a bogus key is bad", func() {
90 So(ds.Delete(ds.NewKey("Foo", "wat", 100, nil)), ShouldEqual, dsS.ErrInvalidKey) 105 So(ds.Delete(ds.NewKey("Foo", "wat", 100, nil)), ShouldEqual, dsS.ErrInvalidKey)
91 }) 106 })
92 Convey("Deleteing a DNE entity is fine", func() { 107 Convey("Deleteing a DNE entity is fine", func() {
93 So(ds.Delete(ds.NewKey("Foo", "wat", 0, nil)), S houldBeNil) 108 So(ds.Delete(ds.NewKey("Foo", "wat", 0, nil)), S houldBeNil)
94 }) 109 })
95 110
96 Convey("Deleting entities from a nonexistant namespace w orks", func() { 111 Convey("Deleting entities from a nonexistant namespace w orks", func() {
97 aid := infoS.Get(c).FullyQualifiedAppID() 112 aid := infoS.Get(c).FullyQualifiedAppID()
98 keys := make([]*dsS.Key, 10) 113 keys := make([]*dsS.Key, 10)
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 Convey("can Get", func() { 160 Convey("can Get", func() {
146 vals := make([]dsS.PropertyMap, len(keys )) 161 vals := make([]dsS.PropertyMap, len(keys ))
147 for i := range vals { 162 for i := range vals {
148 vals[i] = dsS.PropertyMap{} 163 vals[i] = dsS.PropertyMap{}
149 So(vals[i].SetMeta("key", keys[i ]), ShouldBeTrue) 164 So(vals[i].SetMeta("key", keys[i ]), ShouldBeTrue)
150 } 165 }
151 So(ds.GetMulti(vals), ShouldBeNil) 166 So(ds.GetMulti(vals), ShouldBeNil)
152 167
153 for i, val := range vals { 168 for i, val := range vals {
154 So(val, ShouldResemble, dsS.Prop ertyMap{ 169 So(val, ShouldResemble, dsS.Prop ertyMap{
155 » » » » » » » "Val": {dsS.MkProperty( 10)}, 170 » » » » » » » "Val": dsS.MkProperty(1 0),
156 » » » » » » » "Name": {dsS.MkProperty( "")}, 171 » » » » » » » "Name": dsS.MkProperty(" "),
157 » » » » » » » "$key": {dsS.MkPropertyN I(keys[i])}, 172 » » » » » » » "$key": dsS.MkPropertyNI (keys[i]),
158 }) 173 })
159 } 174 }
160 }) 175 })
161 176
162 }) 177 })
163 178
164 Convey("allocating ids prevents their use", func() { 179 Convey("allocating ids prevents their use", func() {
165 keys := ds.NewIncompleteKeys(100, "Foo", nil) 180 keys := ds.NewIncompleteKeys(100, "Foo", nil)
166 So(ds.AllocateIDs(keys), ShouldBeNil) 181 So(ds.AllocateIDs(keys), ShouldBeNil)
167 So(len(keys), ShouldEqual, 100) 182 So(len(keys), ShouldEqual, 100)
(...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after
699 type Model struct { 714 type Model struct {
700 ID int64 `gae:"$id"` 715 ID int64 `gae:"$id"`
701 Value []int64 716 Value []int64
702 } 717 }
703 So(ds.Put(&Model{ID: 1, Value: []int64{20, 30}}), ShouldBeNil) 718 So(ds.Put(&Model{ID: 1, Value: []int64{20, 30}}), ShouldBeNil)
704 719
705 vals := []dsS.PropertyMap{} 720 vals := []dsS.PropertyMap{}
706 So(ds.GetAll(dsS.NewQuery("Model").Project("Value"), &vals), Sho uldBeNil) 721 So(ds.GetAll(dsS.NewQuery("Model").Project("Value"), &vals), Sho uldBeNil)
707 So(len(vals), ShouldEqual, 2) 722 So(len(vals), ShouldEqual, 2)
708 723
709 » » So(vals[0]["Value"][0].Value(), ShouldEqual, 20) 724 » » So(vals[0].Slice("Value")[0].Value(), ShouldEqual, 20)
710 » » So(vals[1]["Value"][0].Value(), ShouldEqual, 30) 725 » » So(vals[1].Slice("Value")[0].Value(), ShouldEqual, 30)
711 }) 726 })
712 } 727 }
713 728
714 func TestAddIndexes(t *testing.T) { 729 func TestAddIndexes(t *testing.T) {
715 t.Parallel() 730 t.Parallel()
716 731
717 Convey("Test Testable.AddIndexes", t, func() { 732 Convey("Test Testable.AddIndexes", t, func() {
718 ctx := UseWithAppID(context.Background(), "aid") 733 ctx := UseWithAppID(context.Background(), "aid")
719 namespaces := []string{"", "good", "news", "everyone"} 734 namespaces := []string{"", "good", "news", "everyone"}
720 735
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
759 // Add "foos" to a new namespace, then confirm that it g ets indexed. 774 // Add "foos" to a new namespace, then confirm that it g ets indexed.
760 So(dsS.Get(infoS.Get(ctx).MustNamespace("qux")).PutMulti (foos), ShouldBeNil) 775 So(dsS.Get(infoS.Get(ctx).MustNamespace("qux")).PutMulti (foos), ShouldBeNil)
761 dsS.Get(ctx).Testable().CatchupIndexes() 776 dsS.Get(ctx).Testable().CatchupIndexes()
762 777
763 results = nil 778 results = nil
764 So(dsS.Get(infoS.Get(ctx).MustNamespace("qux")).GetAll(q , &results), ShouldBeNil) 779 So(dsS.Get(infoS.Get(ctx).MustNamespace("qux")).GetAll(q , &results), ShouldBeNil)
765 So(len(results), ShouldEqual, 2) 780 So(len(results), ShouldEqual, 2)
766 }) 781 })
767 }) 782 })
768 } 783 }
OLDNEW
« no previous file with comments | « impl/memory/datastore_query_execution.go ('k') | impl/memory/race_test.go » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698