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 gae | 5 package rawdatastore |
6 | 6 |
7 import ( | 7 import ( |
8 "math" | 8 "math" |
9 "testing" | 9 "testing" |
10 "time" | 10 "time" |
11 | 11 |
| 12 "github.com/luci/gae/service/blobstore" |
12 . "github.com/smartystreets/goconvey/convey" | 13 . "github.com/smartystreets/goconvey/convey" |
13 ) | 14 ) |
14 | 15 |
15 type myint int | 16 type myint int |
16 type mybool bool | 17 type mybool bool |
17 type mystring string | 18 type mystring string |
18 type myfloat float32 | 19 type myfloat float32 |
19 | 20 |
20 func TestProperties(t *testing.T) { | 21 func TestProperties(t *testing.T) { |
21 t.Parallel() | 22 t.Parallel() |
22 | 23 |
23 » Convey("Test DSProperty", t, func() { | 24 » Convey("Test Property", t, func() { |
24 Convey("Construction", func() { | 25 Convey("Construction", func() { |
25 Convey("empty", func() { | 26 Convey("empty", func() { |
26 » » » » pv := DSProperty{} | 27 » » » » pv := Property{} |
27 So(pv.Value(), ShouldBeNil) | 28 So(pv.Value(), ShouldBeNil) |
28 So(pv.IndexSetting(), ShouldEqual, ShouldIndex) | 29 So(pv.IndexSetting(), ShouldEqual, ShouldIndex) |
29 » » » » So(pv.Type().String(), ShouldEqual, "DSPTNull") | 30 » » » » So(pv.Type().String(), ShouldEqual, "PTNull") |
30 }) | 31 }) |
31 Convey("set", func() { | 32 Convey("set", func() { |
32 » » » » pv := MkDSPropertyNI(100) | 33 » » » » pv := MkPropertyNI(100) |
33 So(pv.Value(), ShouldHaveSameTypeAs, int64(100)) | 34 So(pv.Value(), ShouldHaveSameTypeAs, int64(100)) |
34 So(pv.Value(), ShouldEqual, 100) | 35 So(pv.Value(), ShouldEqual, 100) |
35 So(pv.IndexSetting(), ShouldEqual, NoIndex) | 36 So(pv.IndexSetting(), ShouldEqual, NoIndex) |
36 » » » » So(pv.Type().String(), ShouldEqual, "DSPTInt") | 37 » » » » So(pv.Type().String(), ShouldEqual, "PTInt") |
37 | 38 |
38 pv.SetValue(nil, ShouldIndex) | 39 pv.SetValue(nil, ShouldIndex) |
39 So(pv.Value(), ShouldBeNil) | 40 So(pv.Value(), ShouldBeNil) |
40 So(pv.IndexSetting(), ShouldEqual, ShouldIndex) | 41 So(pv.IndexSetting(), ShouldEqual, ShouldIndex) |
41 » » » » So(pv.Type().String(), ShouldEqual, "DSPTNull") | 42 » » » » So(pv.Type().String(), ShouldEqual, "PTNull") |
42 }) | 43 }) |
43 Convey("derived types", func() { | 44 Convey("derived types", func() { |
44 Convey("int", func() { | 45 Convey("int", func() { |
45 » » » » » pv := MkDSProperty(19) | 46 » » » » » pv := MkProperty(19) |
46 So(pv.Value(), ShouldHaveSameTypeAs, int
64(19)) | 47 So(pv.Value(), ShouldHaveSameTypeAs, int
64(19)) |
47 So(pv.Value(), ShouldEqual, 19) | 48 So(pv.Value(), ShouldEqual, 19) |
48 So(pv.IndexSetting(), ShouldEqual, Shoul
dIndex) | 49 So(pv.IndexSetting(), ShouldEqual, Shoul
dIndex) |
49 » » » » » So(pv.Type().String(), ShouldEqual, "DSP
TInt") | 50 » » » » » So(pv.Type().String(), ShouldEqual, "PTI
nt") |
50 }) | 51 }) |
51 Convey("bool (true)", func() { | 52 Convey("bool (true)", func() { |
52 » » » » » pv := MkDSProperty(mybool(true)) | 53 » » » » » pv := MkProperty(mybool(true)) |
53 So(pv.Value(), ShouldBeTrue) | 54 So(pv.Value(), ShouldBeTrue) |
54 So(pv.IndexSetting(), ShouldEqual, Shoul
dIndex) | 55 So(pv.IndexSetting(), ShouldEqual, Shoul
dIndex) |
55 » » » » » So(pv.Type().String(), ShouldEqual, "DSP
TBoolTrue") | 56 » » » » » So(pv.Type().String(), ShouldEqual, "PTB
oolTrue") |
56 }) | 57 }) |
57 Convey("string", func() { | 58 Convey("string", func() { |
58 » » » » » pv := MkDSProperty(mystring("sup")) | 59 » » » » » pv := MkProperty(mystring("sup")) |
59 So(pv.Value(), ShouldEqual, "sup") | 60 So(pv.Value(), ShouldEqual, "sup") |
60 So(pv.IndexSetting(), ShouldEqual, Shoul
dIndex) | 61 So(pv.IndexSetting(), ShouldEqual, Shoul
dIndex) |
61 » » » » » So(pv.Type().String(), ShouldEqual, "DSP
TString") | 62 » » » » » So(pv.Type().String(), ShouldEqual, "PTS
tring") |
62 }) | 63 }) |
63 » » » » Convey("BSKey is distinquished", func() { | 64 » » » » Convey("blobstore.Key is distinquished", func()
{ |
64 » » » » » pv := MkDSProperty(BSKey("sup")) | 65 » » » » » pv := MkProperty(blobstore.Key("sup")) |
65 » » » » » So(pv.Value(), ShouldEqual, BSKey("sup")
) | 66 » » » » » So(pv.Value(), ShouldEqual, blobstore.Ke
y("sup")) |
66 So(pv.IndexSetting(), ShouldEqual, Shoul
dIndex) | 67 So(pv.IndexSetting(), ShouldEqual, Shoul
dIndex) |
67 » » » » » So(pv.Type().String(), ShouldEqual, "DSP
TBlobKey") | 68 » » » » » So(pv.Type().String(), ShouldEqual, "PTB
lobKey") |
68 }) | 69 }) |
69 Convey("float", func() { | 70 Convey("float", func() { |
70 » » » » » pv := DSProperty{} | 71 » » » » » pv := Property{} |
71 pv.SetValue(myfloat(19.7), ShouldIndex) | 72 pv.SetValue(myfloat(19.7), ShouldIndex) |
72 So(pv.Value(), ShouldHaveSameTypeAs, flo
at64(19.7)) | 73 So(pv.Value(), ShouldHaveSameTypeAs, flo
at64(19.7)) |
73 So(pv.Value(), ShouldEqual, float32(19.7
)) | 74 So(pv.Value(), ShouldEqual, float32(19.7
)) |
74 So(pv.IndexSetting(), ShouldEqual, Shoul
dIndex) | 75 So(pv.IndexSetting(), ShouldEqual, Shoul
dIndex) |
75 » » » » » So(pv.Type().String(), ShouldEqual, "DSP
TFloat") | 76 » » » » » So(pv.Type().String(), ShouldEqual, "PTF
loat") |
76 }) | 77 }) |
77 }) | 78 }) |
78 Convey("bad type", func() { | 79 Convey("bad type", func() { |
79 » » » » pv := DSProperty{} | 80 » » » » pv := Property{} |
80 err := pv.SetValue(complex(100, 29), ShouldIndex
) | 81 err := pv.SetValue(complex(100, 29), ShouldIndex
) |
81 So(err.Error(), ShouldContainSubstring, "has bad
type complex") | 82 So(err.Error(), ShouldContainSubstring, "has bad
type complex") |
82 So(pv.Value(), ShouldBeNil) | 83 So(pv.Value(), ShouldBeNil) |
83 So(pv.IndexSetting(), ShouldEqual, ShouldIndex) | 84 So(pv.IndexSetting(), ShouldEqual, ShouldIndex) |
84 » » » » So(pv.Type().String(), ShouldEqual, "DSPTNull") | 85 » » » » So(pv.Type().String(), ShouldEqual, "PTNull") |
85 }) | 86 }) |
86 Convey("invalid GeoPoint", func() { | 87 Convey("invalid GeoPoint", func() { |
87 » » » » pv := DSProperty{} | 88 » » » » pv := Property{} |
88 » » » » err := pv.SetValue(DSGeoPoint{-1000, 0}, ShouldI
ndex) | 89 » » » » err := pv.SetValue(GeoPoint{-1000, 0}, ShouldInd
ex) |
89 So(err.Error(), ShouldContainSubstring, "invalid
GeoPoint value") | 90 So(err.Error(), ShouldContainSubstring, "invalid
GeoPoint value") |
90 So(pv.Value(), ShouldBeNil) | 91 So(pv.Value(), ShouldBeNil) |
91 So(pv.IndexSetting(), ShouldEqual, ShouldIndex) | 92 So(pv.IndexSetting(), ShouldEqual, ShouldIndex) |
92 » » » » So(pv.Type().String(), ShouldEqual, "DSPTNull") | 93 » » » » So(pv.Type().String(), ShouldEqual, "PTNull") |
93 }) | 94 }) |
94 Convey("invalid time", func() { | 95 Convey("invalid time", func() { |
95 » » » » pv := DSProperty{} | 96 » » » » pv := Property{} |
96 err := pv.SetValue(time.Now(), ShouldIndex) | 97 err := pv.SetValue(time.Now(), ShouldIndex) |
97 So(err.Error(), ShouldContainSubstring, "time va
lue has wrong Location") | 98 So(err.Error(), ShouldContainSubstring, "time va
lue has wrong Location") |
98 | 99 |
99 err = pv.SetValue(time.Unix(math.MaxInt64, 0).UT
C(), ShouldIndex) | 100 err = pv.SetValue(time.Unix(math.MaxInt64, 0).UT
C(), ShouldIndex) |
100 So(err.Error(), ShouldContainSubstring, "time va
lue out of range") | 101 So(err.Error(), ShouldContainSubstring, "time va
lue out of range") |
101 So(pv.Value(), ShouldBeNil) | 102 So(pv.Value(), ShouldBeNil) |
102 So(pv.IndexSetting(), ShouldEqual, ShouldIndex) | 103 So(pv.IndexSetting(), ShouldEqual, ShouldIndex) |
103 » » » » So(pv.Type().String(), ShouldEqual, "DSPTNull") | 104 » » » » So(pv.Type().String(), ShouldEqual, "PTNull") |
104 }) | 105 }) |
105 Convey("time gets rounded", func() { | 106 Convey("time gets rounded", func() { |
106 » » » » pv := DSProperty{} | 107 » » » » pv := Property{} |
107 now := time.Now().In(time.UTC) | 108 now := time.Now().In(time.UTC) |
108 now = now.Round(time.Microsecond).Add(time.Nanos
econd * 313) | 109 now = now.Round(time.Microsecond).Add(time.Nanos
econd * 313) |
109 pv.SetValue(now, ShouldIndex) | 110 pv.SetValue(now, ShouldIndex) |
110 So(pv.Value(), ShouldHappenBefore, now) | 111 So(pv.Value(), ShouldHappenBefore, now) |
111 So(pv.IndexSetting(), ShouldEqual, ShouldIndex) | 112 So(pv.IndexSetting(), ShouldEqual, ShouldIndex) |
112 » » » » So(pv.Type().String(), ShouldEqual, "DSPTTime") | 113 » » » » So(pv.Type().String(), ShouldEqual, "PTTime") |
113 }) | 114 }) |
114 Convey("[]byte coerces IndexSetting", func() { | 115 Convey("[]byte coerces IndexSetting", func() { |
115 » » » » pv := DSProperty{} | 116 » » » » pv := Property{} |
116 pv.SetValue([]byte("hello"), ShouldIndex) | 117 pv.SetValue([]byte("hello"), ShouldIndex) |
117 So(pv.Value(), ShouldResemble, []byte("hello")) | 118 So(pv.Value(), ShouldResemble, []byte("hello")) |
118 So(pv.IndexSetting(), ShouldEqual, NoIndex) | 119 So(pv.IndexSetting(), ShouldEqual, NoIndex) |
119 » » » » So(pv.Type().String(), ShouldEqual, "DSPTBytes") | 120 » » » » So(pv.Type().String(), ShouldEqual, "PTBytes") |
120 }) | 121 }) |
121 Convey("ByteString allows !IndexSetting", func() { | 122 Convey("ByteString allows !IndexSetting", func() { |
122 » » » » pv := DSProperty{} | 123 » » » » pv := Property{} |
123 » » » » pv.SetValue(DSByteString("hello"), ShouldIndex) | 124 » » » » pv.SetValue(ByteString("hello"), ShouldIndex) |
124 » » » » So(pv.Value(), ShouldResemble, DSByteString("hel
lo")) | 125 » » » » So(pv.Value(), ShouldResemble, ByteString("hello
")) |
125 So(pv.IndexSetting(), ShouldEqual, ShouldIndex) | 126 So(pv.IndexSetting(), ShouldEqual, ShouldIndex) |
126 » » » » So(pv.Type().String(), ShouldEqual, "DSPTBytes") | 127 » » » » So(pv.Type().String(), ShouldEqual, "PTBytes") |
127 }) | 128 }) |
128 }) | 129 }) |
129 }) | 130 }) |
130 } | 131 } |
131 | 132 |
132 func TestDSPropertyMapImpl(t *testing.T) { | 133 func TestDSPropertyMapImpl(t *testing.T) { |
133 t.Parallel() | 134 t.Parallel() |
134 | 135 |
135 » Convey("DSPropertyMap load/save err conditions", t, func() { | 136 » Convey("PropertyMap load/save err conditions", t, func() { |
136 Convey("empty", func() { | 137 Convey("empty", func() { |
137 » » » pm := DSPropertyMap{} | 138 » » » pm := PropertyMap{} |
138 » » » err := pm.Load(DSPropertyMap{"hello": {DSProperty{}}}) | 139 » » » err := pm.Load(PropertyMap{"hello": {Property{}}}) |
139 So(err, ShouldBeNil) | 140 So(err, ShouldBeNil) |
140 » » » So(pm, ShouldResemble, DSPropertyMap{"hello": {DSPropert
y{}}}) | 141 » » » So(pm, ShouldResemble, PropertyMap{"hello": {Property{}}
}) |
141 | 142 |
142 npm, _ := pm.Save(false) | 143 npm, _ := pm.Save(false) |
143 So(npm, ShouldResemble, pm) | 144 So(npm, ShouldResemble, pm) |
144 }) | 145 }) |
145 Convey("meta", func() { | 146 Convey("meta", func() { |
146 Convey("working", func() { | 147 Convey("working", func() { |
147 » » » » pm := DSPropertyMap{"": {MkDSProperty("trap!")}} | 148 » » » » pm := PropertyMap{"": {MkProperty("trap!")}} |
148 _, err := pm.GetMeta("foo") | 149 _, err := pm.GetMeta("foo") |
149 » » » » So(err, ShouldEqual, ErrDSMetaFieldUnset) | 150 » » » » So(err, ShouldEqual, ErrMetaFieldUnset) |
150 | 151 |
151 err = pm.SetMeta("foo", 100) | 152 err = pm.SetMeta("foo", 100) |
152 So(err, ShouldBeNil) | 153 So(err, ShouldBeNil) |
153 | 154 |
154 v, err := pm.GetMeta("foo") | 155 v, err := pm.GetMeta("foo") |
155 So(err, ShouldBeNil) | 156 So(err, ShouldBeNil) |
156 So(v, ShouldEqual, 100) | 157 So(v, ShouldEqual, 100) |
157 | 158 |
158 npm, err := pm.Save(false) | 159 npm, err := pm.Save(false) |
159 So(err, ShouldBeNil) | 160 So(err, ShouldBeNil) |
160 So(len(npm), ShouldEqual, 1) | 161 So(len(npm), ShouldEqual, 1) |
161 }) | 162 }) |
162 | 163 |
163 Convey("errors", func() { | 164 Convey("errors", func() { |
164 Convey("too many values", func() { | 165 Convey("too many values", func() { |
165 » » » » » pm := DSPropertyMap{ | 166 » » » » » pm := PropertyMap{ |
166 » » » » » » "$bad": {MkDSProperty(100), MkDS
Property(200)}, | 167 » » » » » » "$bad": {MkProperty(100), MkProp
erty(200)}, |
167 } | 168 } |
168 _, err := pm.GetMeta("bad") | 169 _, err := pm.GetMeta("bad") |
169 So(err.Error(), ShouldContainSubstring,
"too many values") | 170 So(err.Error(), ShouldContainSubstring,
"too many values") |
170 }) | 171 }) |
171 | 172 |
172 Convey("weird value", func() { | 173 Convey("weird value", func() { |
173 » » » » » pm := DSPropertyMap{} | 174 » » » » » pm := PropertyMap{} |
174 err := pm.SetMeta("sup", complex(100, 20
)) | 175 err := pm.SetMeta("sup", complex(100, 20
)) |
175 So(err.Error(), ShouldContainSubstring,
"bad type") | 176 So(err.Error(), ShouldContainSubstring,
"bad type") |
176 }) | 177 }) |
177 }) | 178 }) |
178 }) | 179 }) |
179 }) | 180 }) |
180 } | 181 } |
OLD | NEW |