Skip to content

Commit

Permalink
fix(ae,cloud): fix struct (without pointer) handling when Put & Get
Browse files Browse the repository at this point in the history
  • Loading branch information
vvakame committed Nov 24, 2017
1 parent 1a6899c commit de3eb4c
Show file tree
Hide file tree
Showing 6 changed files with 269 additions and 2 deletions.
2 changes: 1 addition & 1 deletion aedatastore/ops.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ func putMultiOps(ctx context.Context, keys []w.Key, src interface{}, ops putOps)
var origPss []datastore.PropertyList
for idx, key := range keys {
elem := v.Index(idx)
if reflect.PtrTo(elem.Type()).Implements(typeOfPropertyLoadSaver) {
if reflect.PtrTo(elem.Type()).Implements(typeOfPropertyLoadSaver) || elem.Type().Kind() == reflect.Struct {
elem = elem.Addr()
}
src := elem.Interface()
Expand Down
2 changes: 1 addition & 1 deletion clouddatastore/ops.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ func putMultiOps(ctx context.Context, keys []w.Key, src interface{}, ops putOps)
var origPss []datastore.PropertyList
for idx, key := range keys {
elem := v.Index(idx)
if reflect.PtrTo(elem.Type()).Implements(typeOfPropertyLoadSaver) {
if reflect.PtrTo(elem.Type()).Implements(typeOfPropertyLoadSaver) || elem.Type().Kind() == reflect.Struct {
elem = elem.Addr()
}
src := elem.Interface()
Expand Down
85 changes: 85 additions & 0 deletions testbed/aedatastore_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -665,3 +665,88 @@ func TestAEDatastore_PutAndGetMultiPropertyListSlice(t *testing.T) {
t.Fatalf("unexpected: %v", v)
}
}

func TestAEDatastore_PutAndGetBareStruct(t *testing.T) {
ctx, close, err := newContext()
if err != nil {
t.Fatal(err)
}
defer close()

type Data struct {
Name string
}

key := datastore.NewIncompleteKey(ctx, "Test", nil)
// passed Data, would be error.
_, err = datastore.Put(ctx, key, Data{Name: "A"})
if err != datastore.ErrInvalidEntityType {
t.Fatal(err)
}

// ok! *Data
key, err = datastore.Put(ctx, key, &Data{Name: "A"})
if err != nil {
t.Fatal(err)
}

// ok! but struct are copied. can't watching Get result.
obj := Data{}
err = datastore.Get(ctx, key, obj)
if err != datastore.ErrInvalidEntityType {
t.Fatal(err)
}

if v := obj.Name; v != "" {
t.Errorf("unexpected: '%v'", v)
}
}

func TestAEDatastore_PutAndGetMultiBareStruct(t *testing.T) {
ctx, close, err := newContext()
if err != nil {
t.Fatal(err)
}
defer close()

type Data struct {
Name string
}

var list []Data
var keys []*datastore.Key
{
obj := Data{Name: "A"}
key := datastore.NewIncompleteKey(ctx, "Test", nil)

list = append(list, obj)
keys = append(keys, key)
}

// ok!
keys, err = datastore.PutMulti(ctx, keys, list)
if err != nil {
t.Fatal(err)
}

// passed []Data with length 0, would be error.
list = make([]Data, 0)
err = datastore.GetMulti(ctx, keys, list)
if err == nil {
t.Fatal(err)
}

// ok! []Data with length == len(keys)
list = make([]Data, len(keys))
err = datastore.GetMulti(ctx, keys, list)
if err != nil {
t.Fatal(err)
}

if v := len(list); v != 1 {
t.Fatalf("unexpected: '%v'", v)
}
if v := list[0].Name; v != "A" {
t.Errorf("unexpected: '%v'", v)
}
}
89 changes: 89 additions & 0 deletions testbed/clouddatastore_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -851,3 +851,92 @@ func TestCloudDatastore_PutAndGetMultiPropertyListSlice(t *testing.T) {
t.Fatalf("unexpected: %v", v)
}
}

func TestCloudDatastore_PutAndGetBareStruct(t *testing.T) {
ctx := context.Background()
client, err := datastore.NewClient(ctx, "souzoh-p-vvakame")
if err != nil {
t.Fatal(err.Error())
}
defer client.Close()
defer cleanUp()

type Data struct {
Name string
}

key := datastore.IncompleteKey("Test", nil)
// passed Data, would be error.
_, err = client.Put(ctx, key, Data{Name: "A"})
if err != datastore.ErrInvalidEntityType {
t.Fatal(err)
}

// ok! *Data
key, err = client.Put(ctx, key, &Data{Name: "A"})
if err != nil {
t.Fatal(err)
}

// ok! but struct are copied. can't watching Get result.
obj := Data{}
err = client.Get(ctx, key, obj)
if err != datastore.ErrInvalidEntityType {
t.Fatal(err)
}

if v := obj.Name; v != "" {
t.Errorf("unexpected: '%v'", v)
}
}

func TestCloudDatastore_PutAndGetMultiBareStruct(t *testing.T) {
ctx := context.Background()
client, err := datastore.NewClient(ctx, "souzoh-p-vvakame")
if err != nil {
t.Fatal(err.Error())
}
defer client.Close()
defer cleanUp()

type Data struct {
Name string
}

var list []Data
var keys []*datastore.Key
{
obj := Data{Name: "A"}
key := datastore.IncompleteKey("Test", nil)

list = append(list, obj)
keys = append(keys, key)
}

// ok!
keys, err = client.PutMulti(ctx, keys, list)
if err != nil {
t.Fatal(err)
}

// passed []Data with length 0, would be error.
list = make([]Data, 0)
err = client.GetMulti(ctx, keys, list)
if err == nil {
t.Fatal(err)
}

// ok! []Data with length == len(keys)
list = make([]Data, len(keys))
err = client.GetMulti(ctx, keys, list)
if err != nil {
t.Fatal(err)
}

if v := len(list); v != 1 {
t.Fatalf("unexpected: '%v'", v)
}
if v := list[0].Name; v != "A" {
t.Errorf("unexpected: '%v'", v)
}
}
91 changes: 91 additions & 0 deletions testsuite/entity_ops.go
Original file line number Diff line number Diff line change
Expand Up @@ -454,3 +454,94 @@ func PutAndGetMultiPropertyListSlice(t *testing.T, ctx context.Context, client d
t.Fatalf("unexpected: %v", v)
}
}

func PutAndGetBareStruct(t *testing.T, ctx context.Context, client datastore.Client) {
defer func() {
err := client.Close()
if err != nil {
t.Fatal(err)
}
}()

type Data struct {
Name string
}

var err error

key := client.IncompleteKey("Test", nil)
// passed Data, would be error.
_, err = client.Put(ctx, key, Data{Name: "A"})
if err != datastore.ErrInvalidEntityType {
t.Fatal(err)
}

// ok! *Data
key, err = client.Put(ctx, key, &Data{Name: "A"})
if err != nil {
t.Fatal(err)
}

// ok! but struct are copied. can't watching Get result.
obj := Data{}
err = client.Get(ctx, key, obj)
if err != datastore.ErrInvalidEntityType {
t.Fatal(err)
}

if v := obj.Name; v != "" {
t.Errorf("unexpected: '%v'", v)
}
}

func PutAndGetMultiBareStruct(t *testing.T, ctx context.Context, client datastore.Client) {
defer func() {
err := client.Close()
if err != nil {
t.Fatal(err)
}
}()

type Data struct {
Name string
}

var list []Data
var keys []datastore.Key
{
obj := Data{Name: "A"}
key := client.IncompleteKey("Test", nil)

list = append(list, obj)
keys = append(keys, key)
}

var err error

// ok!
keys, err = client.PutMulti(ctx, keys, list)
if err != nil {
t.Fatal(err)
}

// passed []Data with length 0, would be error.
list = make([]Data, 0)
err = client.GetMulti(ctx, keys, list)
if err == nil {
t.Fatal(err)
}

// ok! []Data with length == len(keys)
list = make([]Data, len(keys))
err = client.GetMulti(ctx, keys, list)
if err != nil {
t.Fatal(err)
}

if v := len(list); v != 1 {
t.Fatalf("unexpected: '%v'", v)
}
if v := list[0].Name; v != "A" {
t.Errorf("unexpected: '%v'", v)
}
}
2 changes: 2 additions & 0 deletions testsuite/suite.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ var TestSuite = map[string]Test{
"PutInterface": PutInterface,
"PutAndGetPropertyList": PutAndGetPropertyList,
"PutAndGetMultiPropertyListSlice": PutAndGetMultiPropertyListSlice,
"PutAndGetBareStruct": PutAndGetBareStruct,
"PutAndGetMultiBareStruct": PutAndGetMultiBareStruct,
"GeoPoint_PutAndGet": GeoPoint_PutAndGet,
"Key_Equal": Key_Equal,
"Key_Incomplete": Key_Incomplete,
Expand Down

0 comments on commit de3eb4c

Please sign in to comment.