func randomKey(parents int) key.Key { if parents == 0 { key, err := key.New(randomString(), randomString(), rand.Int63(), "") if err != nil { panic(err) } return key } key, err := key.New(randomString(), randomString(), rand.Int63(), randomKey(parents-1)) if err != nil { panic(err) } return key }
func testFindByKey(c gaecontext.HTTPContext) { gae.DelAll(c, &Ts{}) foreignParent, err := key.New("ForeignParent", "anothername", 0, "") if err != nil { panic(err) } foreign, err := key.New("Foreign", "name", 0, foreignParent) if err != nil { panic(err) } notForeign, err := key.New("Foreign", "name2", 0, "") if err != nil { panic(err) } k, err := key.For(&Ts{}, "", 0, "") if err != nil { panic(err) } t2 := &Ts{ Id: k, Name: "another t", Age: 14, Foreign: foreign, } if err := gae.Put(c, t2); err != nil { panic(err) } time.Sleep(time.Second) res := []Ts{} if err := findTsByForeign(c, &res, notForeign); err != nil { panic(err) } if len(res) != 0 { panic("should be empty") } if err := findTsByForeign(c, &res, foreign); err != nil { panic(err) } if len(res) != 1 { panic(fmt.Errorf("wrong number found, wanted 1 but got %+v", res)) } if !(&res[0]).Equal(t2) { panic(fmt.Errorf("%+v and %+v should be equal", res[0], t2)) } wantedProcesses := []string{"BeforeCreate", "BeforeSave", "AfterLoad"} if !reflect.DeepEqual(wantedProcesses, res[0].Processes) { panic("wrong processes") } }
func testAncestorFind(c gaecontext.HTTPContext) { gae.DelAll(c, &Ts{}) parentKey, err := key.New("Parent", "gnu", 0, "") if err != nil { panic(err) } k, err := key.For(&Ts{}, "", 0, parentKey) if err != nil { panic(err) } t2 := &Ts{ Id: k, Name: "t again", Age: 14, } if err := gae.Put(c, t2); err != nil { panic(err) } res := []Ts{} if err := findTsByAncestorAndName(c, &res, parentKey, "t again"); err != nil { panic(err) } if len(res) != 1 { panic(fmt.Errorf("wrong number found, wanted 1 but got %+v", res)) } if !(&res[0]).Equal(t2) { panic(fmt.Errorf("%+v and %+v should be equal", res[0], t2)) } wantedProcesses := []string{"BeforeCreate", "BeforeSave", "AfterLoad"} if !reflect.DeepEqual(wantedProcesses, res[0].Processes) { panic("wrong processes") } }
func FromGAE(k *datastore.Key) (result key.Key, err error) { if k == nil { return key.Key(""), nil } parent, err := FromGAE(k.Parent()) if err != nil { return } return key.New(k.Kind(), k.StringID(), k.IntID(), parent) }
func testMemcacheMulti(c gaecontext.HTTPContext) { doTest1 := func(c gaecontext.HTTPContext) (ts1, ts2 *MemMulTS) { gae.DelAll(c, &MemMulTS{}) var err error ts1 = &MemMulTS{} if ts1.Id, err = key.For(ts1, "", 0, ""); err != nil { panic(err) } ts2 = &MemMulTS{} if ts2.Id, err = key.For(ts2, "", 0, ""); err != nil { panic(err) } if err := gae.Put(c, ts1); err != nil { panic(err) } if err := gae.Put(c, ts2); err != nil { panic(err) } return } doTest2 := func(c gaecontext.HTTPContext, ts1, ts2 *MemMulTS) { load1 := &MemMulTS{} load2 := &MemMulTS{} load3 := &MemMulTS{} fakeId, err := key.New("MemMulTS", "hehu", 0, "") if err != nil { return } fgen := func(id key.Key) func() (result interface{}, err error) { return func() (result interface{}, err error) { ts := &MemMulTS{ Id: id, } if err = gae.GetById(c, ts); err != nil { if _, ok := err.(gae.ErrNoSuchEntity); ok { err = nil return } return } result = ts return } } if err := memcache.MemoizeMulti(c, []string{ ts1.Id.Encode(), ts2.Id.Encode(), fakeId.Encode(), }, []interface{}{ load1, load2, load3, }, []func() (interface{}, error){ fgen(ts1.Id), fgen(ts2.Id), fgen(fakeId), }); err != nil { if err[0] != nil || err[1] != nil || err[2] != memcache.ErrCacheMiss { for _, serr := range err { c.Infof("Error: %v", serr) } panic(err) } } if load1.Id != ts1.Id { panic(fmt.Errorf("wrong id, wanted %v but got %v", ts1.Id, load1.Id)) } if load2.Id != ts2.Id { panic("wrong id") } if load3.Id != "" { panic("wrong id") } load1 = &MemMulTS{} load2 = &MemMulTS{} load3 = &MemMulTS{} if err := memcache.MemoizeMulti(c, []string{ ts1.Id.Encode(), ts2.Id.Encode(), fakeId.Encode(), }, []interface{}{ load1, load2, load3, }, []func() (interface{}, error){ fgen(ts1.Id), fgen(ts2.Id), fgen(fakeId), }); err != nil { if err[0] != nil || err[1] != nil || err[2] != memcache.ErrCacheMiss { panic(err) } } if load1.Id != ts1.Id { panic(fmt.Errorf("wrong id, wanted %v but got %v", ts1.Id, load1.Id)) } if load2.Id != ts2.Id { panic("wrong id") } if load3.Id != "" { panic("wrong id") } } ts1, ts2 := doTest1(c) doTest2(c, ts1, ts2) ts1, ts2 = doTest1(c) c.Transaction(func(c gaecontext.HTTPContext) (err error) { doTest2(c, ts1, ts2) return }, true) }