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

Unified Diff: service/datastore/pls_test.go

Issue 1427933002: Decouple PLS from MGS. (Closed) Base URL: https://github.com/luci/gae@master
Patch Set: Derp Created 5 years, 2 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « service/datastore/pls_impl.go ('k') | service/datastore/properties.go » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: service/datastore/pls_test.go
diff --git a/service/datastore/pls_test.go b/service/datastore/pls_test.go
index 7cb5a2b54abbaf0ce957913302c8fe7c62f14425..0953da3d7c73c4d2ae1dec78613ef60e870b41d1 100644
--- a/service/datastore/pls_test.go
+++ b/service/datastore/pls_test.go
@@ -375,11 +375,7 @@ func (d *Doubler) Save(withMeta bool) (PropertyMap, error) {
return propMap, nil
}
-func (d *Doubler) GetAllMeta() PropertyMap { return nil }
-func (d *Doubler) GetMeta(string) (interface{}, error) { return nil, ErrMetaFieldUnset }
-func (d *Doubler) GetMetaDefault(_ string, dflt interface{}) interface{} { return dflt }
-func (d *Doubler) SetMeta(string, interface{}) error { return ErrMetaFieldUnset }
-func (d *Doubler) Problem() error { return nil }
+func (d *Doubler) Problem() error { return nil }
var _ PropertyLoadSaver = (*Doubler)(nil)
@@ -404,14 +400,40 @@ func (d *Deriver) Save(withMeta bool) (PropertyMap, error) {
}, nil
}
-func (d *Deriver) GetAllMeta() PropertyMap { return nil }
-func (d *Deriver) GetMeta(string) (interface{}, error) { return nil, ErrMetaFieldUnset }
-func (d *Deriver) GetMetaDefault(_ string, dflt interface{}) interface{} { return dflt }
-func (d *Deriver) SetMeta(string, interface{}) error { return ErrMetaFieldUnset }
-func (d *Deriver) Problem() error { return nil }
+func (d *Deriver) Problem() error { return nil }
var _ PropertyLoadSaver = (*Deriver)(nil)
+type Augmenter struct {
+ S string
+
+ g string `gae:"-"`
+}
+
+func (a *Augmenter) Load(props PropertyMap) error {
+ if e := props["Extra"]; len(e) > 0 {
+ a.g = e[0].Value().(string)
+ delete(props, "Extra")
+ }
+ if err := GetPLS(a).Load(props); err != nil {
+ return err
+ }
+ return nil
+}
+
+func (a *Augmenter) Save(withMeta bool) (PropertyMap, error) {
+ props, err := GetPLS(a).Save(withMeta)
+ if err != nil {
+ return nil, err
+ }
+ props["Extra"] = []Property{MkProperty("ohai!")}
+ return props, nil
+}
+
+func (a *Augmenter) Problem() error { return nil }
+
+var _ PropertyLoadSaver = (*Augmenter)(nil)
+
type BK struct {
Key blobstore.Key
}
@@ -552,7 +574,7 @@ func (i *IDParser) getFullID() string {
}
func (i *IDParser) GetAllMeta() PropertyMap {
- pm := PropertyMap{}
+ pm := GetPLS(i).GetAllMeta()
pm.SetMeta("id", i.getFullID())
return pm
}
@@ -561,7 +583,7 @@ func (i *IDParser) GetMeta(key string) (interface{}, error) {
if key == "id" {
return i.getFullID(), nil
}
- return nil, ErrMetaFieldUnset
+ return GetPLS(i).GetMeta(key)
}
func (i *IDParser) GetMetaDefault(key string, dflt interface{}) interface{} {
@@ -576,7 +598,7 @@ func (i *IDParser) SetMeta(key string, value interface{}) (err error) {
i.id, err = strconv.ParseInt(vS[1], 10, 64)
return
}
- return ErrMetaFieldUnset
+ return GetPLS(i).SetMeta(key, value)
}
type KindOverride struct {
@@ -588,7 +610,7 @@ type KindOverride struct {
var _ MetaGetterSetter = (*KindOverride)(nil)
func (i *KindOverride) GetAllMeta() PropertyMap {
- pm := PropertyMap{}
+ pm := GetPLS(i).GetAllMeta()
if i.customKind != "" {
pm.SetMeta("kind", i.customKind)
}
@@ -599,7 +621,7 @@ func (i *KindOverride) GetMeta(key string) (interface{}, error) {
if key == "kind" && i.customKind != "" {
return i.customKind, nil
}
- return nil, ErrMetaFieldUnset
+ return GetPLS(i).GetMeta(key)
}
func (i *KindOverride) GetMetaDefault(key string, dflt interface{}) interface{} {
@@ -619,6 +641,8 @@ func (i *KindOverride) SetMeta(key string, value interface{}) error {
return ErrMetaFieldUnset
}
+type Simple struct{}
+
type testCase struct {
desc string
src interface{}
@@ -1187,6 +1211,22 @@ var testCases = []testCase{
src: &Deriver{S: "s", Derived: "derived+s", Ignored: "ignored"},
want: &X0{S: "s"},
},
+ {
+ desc: "augmenter save",
+ src: &Augmenter{S: "s"},
+ want: PropertyMap{
+ "S": {mp("s")},
+ "Extra": {mp("ohai!")},
+ },
+ },
+ {
+ desc: "augmenter load",
+ src: PropertyMap{
+ "S": {mp("s")},
+ "Extra": {mp("kthxbye!")},
+ },
+ want: &Augmenter{S: "s", g: "kthxbye!"},
+ },
// Regression: CL 25062824 broke handling of appengine.BlobKey fields.
{
desc: "appengine.BlobKey",
@@ -1610,53 +1650,53 @@ func TestMeta(t *testing.T) {
Convey("Test meta fields", t, func() {
Convey("Can retrieve from struct", func() {
o := &N0{ID: 100}
- pls := GetPLS(o)
- val, err := pls.GetMeta("id")
+ mgs := getMGS(o)
+ val, err := mgs.GetMeta("id")
So(err, ShouldBeNil)
So(val, ShouldEqual, 100)
- val, err = pls.GetMeta("kind")
+ val, err = mgs.GetMeta("kind")
So(err, ShouldBeNil)
So(val, ShouldEqual, "whatnow")
- So(pls.GetMetaDefault("kind", "zappo"), ShouldEqual, "whatnow")
- So(pls.GetMetaDefault("id", "stringID"), ShouldEqual, "stringID")
- So(pls.GetMetaDefault("id", 6), ShouldEqual, 100)
+ So(mgs.GetMetaDefault("kind", "zappo"), ShouldEqual, "whatnow")
+ So(mgs.GetMetaDefault("id", "stringID"), ShouldEqual, "stringID")
+ So(mgs.GetMetaDefault("id", 6), ShouldEqual, 100)
})
Convey("Getting something not there is an error", func() {
o := &N0{ID: 100}
- pls := GetPLS(o)
- _, err := pls.GetMeta("wat")
+ mgs := getMGS(o)
+ _, err := mgs.GetMeta("wat")
So(err, ShouldEqual, ErrMetaFieldUnset)
})
Convey("Default works for missing fields", func() {
o := &N0{ID: 100}
- pls := GetPLS(o)
- So(pls.GetMetaDefault("whozit", 10), ShouldEqual, 10)
+ mgs := getMGS(o)
+ So(mgs.GetMetaDefault("whozit", 10), ShouldEqual, 10)
})
Convey("getting/setting from a bad struct is an error", func() {
o := &Recursive{}
- pls := GetPLS(o)
- _, err := pls.GetMeta("wat")
+ mgs := getMGS(o)
+ _, err := mgs.GetMeta("wat")
So(err, ShouldNotBeNil)
- err = pls.SetMeta("wat", 100)
+ err = mgs.SetMeta("wat", 100)
So(err, ShouldNotBeNil)
})
Convey("Default works for bad structs", func() {
o := &Recursive{}
- pls := GetPLS(o)
- So(pls.GetMetaDefault("whozit", 10), ShouldEqual, 10)
+ mgs := getMGS(o)
+ So(mgs.GetMetaDefault("whozit", 10), ShouldEqual, 10)
})
Convey("can assign values to exported meta fields", func() {
o := &N0{ID: 100}
- pls := GetPLS(o)
- err := pls.SetMeta("id", int64(200))
+ mgs := getMGS(o)
+ err := mgs.SetMeta("id", int64(200))
So(err, ShouldBeNil)
So(o.ID, ShouldEqual, 200)
@@ -1664,16 +1704,22 @@ func TestMeta(t *testing.T) {
Convey("assigning to unsassiagnable fields is a simple error", func() {
o := &N0{ID: 100}
- pls := GetPLS(o)
- err := pls.SetMeta("kind", "hi")
+ mgs := getMGS(o)
+ err := mgs.SetMeta("kind", "hi")
So(err.Error(), ShouldContainSubstring, "unexported field")
- err = pls.SetMeta("noob", "hi")
+ err = mgs.SetMeta("noob", "hi")
So(err, ShouldEqual, ErrMetaFieldUnset)
})
})
Convey("StructPLS Miscellaneous", t, func() {
+ Convey("a simple struct has a default $kind", func() {
+ So(GetPLS(&Simple{}).GetAllMeta(), ShouldResemble, PropertyMap{
+ "$kind": []Property{mpNI("Simple")},
+ })
+ })
+
Convey("multiple overlapping fields is an error", func() {
o := &BadMeta{}
pls := GetPLS(o)
@@ -1693,6 +1739,16 @@ func TestMeta(t *testing.T) {
Convey("attempting to get a PLS for a non *struct is an error", func() {
pls := GetPLS((*[]string)(nil))
So(pls.Problem(), ShouldEqual, ErrInvalidEntityType)
+
+ Convey("the error PLS can still be used", func() {
+ k, _ := pls.GetMeta("kind")
+ So(k, ShouldBeNil)
+
+ props := pls.GetAllMeta()
+ So(props, ShouldResemble, PropertyMap{
+ "$kind": []Property{mpNI("")},
+ })
+ })
})
Convey("convertible meta default types", func() {
@@ -1703,31 +1759,32 @@ func TestMeta(t *testing.T) {
}
okd := &OKDefaults{}
pls := GetPLS(okd)
+ mgs := getMGS(okd)
So(pls.Problem(), ShouldBeNil)
- v, err := pls.GetMeta("when")
+ v, err := mgs.GetMeta("when")
So(err, ShouldBeNil)
So(v, ShouldEqual, "tomorrow")
- v, err = pls.GetMeta("amt")
+ v, err = mgs.GetMeta("amt")
So(err, ShouldBeNil)
So(v, ShouldEqual, int64(100))
So(okd.DoIt, ShouldEqual, Auto)
- v, err = pls.GetMeta("doit")
+ v, err = mgs.GetMeta("doit")
So(err, ShouldBeNil)
So(v, ShouldBeTrue)
- err = pls.SetMeta("doit", false)
+ err = mgs.SetMeta("doit", false)
So(err, ShouldBeNil)
- v, err = pls.GetMeta("doit")
+ v, err = mgs.GetMeta("doit")
So(err, ShouldBeNil)
So(v, ShouldBeFalse)
So(okd.DoIt, ShouldEqual, Off)
- err = pls.SetMeta("doit", true)
+ err = mgs.SetMeta("doit", true)
So(err, ShouldBeNil)
- v, err = pls.GetMeta("doit")
+ v, err = mgs.GetMeta("doit")
So(err, ShouldBeNil)
So(v, ShouldBeTrue)
So(okd.DoIt, ShouldEqual, On)
@@ -1769,9 +1826,9 @@ func TestMeta(t *testing.T) {
Val int64 `gae:"$val"`
}
o := &OverrideDefault{}
- pls := GetPLS(o)
+ mgs := getMGS(o)
- v, err := pls.GetMeta("val")
+ v, err := mgs.GetMeta("val")
So(err, ShouldBeNil)
So(v, ShouldEqual, int64(0))
})
@@ -1781,14 +1838,14 @@ func TestMeta(t *testing.T) {
Val int64 `gae:"$val,100"`
}
o := &OverrideDefault{}
- pls := GetPLS(o)
+ mgs := getMGS(o)
- v, err := pls.GetMeta("val")
+ v, err := mgs.GetMeta("val")
So(err, ShouldBeNil)
So(v, ShouldEqual, int64(100))
o.Val = 10
- v, err = pls.GetMeta("val")
+ v, err = mgs.GetMeta("val")
So(err, ShouldBeNil)
So(v, ShouldEqual, int64(10))
})
@@ -1803,17 +1860,17 @@ func TestMeta(t *testing.T) {
Convey("MetaGetterSetter implementation (IDParser)", func() {
idp := &IDParser{parent: "moo", id: 100}
- pls := GetPLS(idp)
- So(pls.GetMetaDefault("id", ""), ShouldEqual, "moo|100")
- So(pls.GetMetaDefault("kind", ""), ShouldEqual, "CoolKind")
+ mgs := getMGS(idp)
+ So(mgs.GetMetaDefault("id", ""), ShouldEqual, "moo|100")
+ So(mgs.GetMetaDefault("kind", ""), ShouldEqual, "CoolKind")
- So(pls.SetMeta("kind", "Something"), ShouldErrLike, "unexported field")
- So(pls.SetMeta("id", "happy|27"), ShouldBeNil)
+ So(mgs.SetMeta("kind", "Something"), ShouldErrLike, "unexported field")
+ So(mgs.SetMeta("id", "happy|27"), ShouldBeNil)
So(idp.parent, ShouldEqual, "happy")
So(idp.id, ShouldEqual, 27)
- So(pls.GetAllMeta(), ShouldResemble, PropertyMap{
+ So(mgs.GetAllMeta(), ShouldResemble, PropertyMap{
"$id": {MkPropertyNI("happy|27")},
"$kind": {MkPropertyNI("CoolKind")},
})
@@ -1821,24 +1878,24 @@ func TestMeta(t *testing.T) {
Convey("MetaGetterSetter implementation (KindOverride)", func() {
ko := &KindOverride{ID: 20}
- pls := GetPLS(ko)
- So(pls.GetMetaDefault("kind", ""), ShouldEqual, "KindOverride")
+ mgs := getMGS(ko)
+ So(mgs.GetMetaDefault("kind", ""), ShouldEqual, "KindOverride")
ko.customKind = "something"
- So(pls.GetMetaDefault("kind", ""), ShouldEqual, "something")
+ So(mgs.GetMetaDefault("kind", ""), ShouldEqual, "something")
- So(pls.SetMeta("kind", "Nerp"), ShouldBeNil)
+ So(mgs.SetMeta("kind", "Nerp"), ShouldBeNil)
So(ko.customKind, ShouldEqual, "Nerp")
- So(pls.SetMeta("kind", "KindOverride"), ShouldBeNil)
+ So(mgs.SetMeta("kind", "KindOverride"), ShouldBeNil)
So(ko.customKind, ShouldEqual, "")
- So(pls.GetAllMeta(), ShouldResemble, PropertyMap{
+ So(mgs.GetAllMeta(), ShouldResemble, PropertyMap{
"$id": {MkPropertyNI(20)},
"$kind": {MkPropertyNI("KindOverride")},
})
ko.customKind = "wut"
- So(pls.GetAllMeta(), ShouldResemble, PropertyMap{
+ So(mgs.GetAllMeta(), ShouldResemble, PropertyMap{
"$id": {MkPropertyNI(20)},
"$kind": {MkPropertyNI("wut")},
})
« no previous file with comments | « service/datastore/pls_impl.go ('k') | service/datastore/properties.go » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698