Example #1
0
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)
}
Example #2
0
func testMemcacheDeletion(c gaecontext.HTTPContext) {
	t1 := &Ts{}
	parentKey, err := key.For(t1, "parent", 0, "")
	if err != nil {
		panic(err)
	}
	t1.Id, err = key.For(t1, "", 0, parentKey)
	if err != nil {
		panic(err)
	}
	t1.Name = "hej"
	if err := gae.Put(c, t1); err != nil {
		panic(err)
	}
	t2 := &Ts{Id: t1.Id}
	if err := gae.GetById(c, t2); err != nil {
		panic(err)
	}
	if t2.Name != "hej" {
		panic("wrong name")
	}

	time.Sleep(time.Second)
	found := []Ts{}
	if err := findTsByName(c, &found, "hej"); err != nil {
		panic(err)
	}
	if len(found) != 1 {
		panic("wrong len")
	}
	if found[0].Name != "hej" {
		panic("wrong name")
	}
	found = []Ts{}
	if err := findTsByAncestorAndName(c, &found, parentKey, "hej"); err != nil {
		panic(err)
	}
	if len(found) != 1 {
		panic("wrong len")
	}
	if found[0].Name != "hej" {
		panic("wrong name")
	}

	t1.Name = "hehu"
	if err := gae.Put(c, t1); err != nil {
		panic(err)
	}

	time.Sleep(time.Second)
	found = []Ts{}
	if err := findTsByName(c, &found, "hej"); err != nil {
		panic(err)
	}
	if len(found) != 0 {
		panic("wrong len")
	}
	found = []Ts{}
	if err := findTsByAncestorAndName(c, &found, parentKey, "hej"); err != nil {
		panic(err)
	}
	if len(found) != 0 {
		panic("wrong len")
	}
	found = []Ts{}
	if err := findTsByName(c, &found, "hehu"); err != nil {
		panic(err)
	}
	if len(found) != 1 {
		panic("wrong len")
	}
	if found[0].Name != "hehu" {
		panic("wrong name")
	}
	found = []Ts{}
	if err := findTsByAncestorAndName(c, &found, parentKey, "hehu"); err != nil {
		panic(err)
	}
	if len(found) != 1 {
		panic("wrong len")
	}
	if found[0].Name != "hehu" {
		panic("wrong name")
	}

	if err := c.Transaction(func(c gaecontext.HTTPContext) (err error) {
		t1.Name = "blapp"
		err = gae.Put(c, t1)
		return
	}, false); err != nil {
		panic(err)
	}

	time.Sleep(time.Second)
	found = []Ts{}
	if err := findTsByName(c, &found, "hehu"); err != nil {
		panic(err)
	}
	if len(found) != 0 {
		panic("wrong len")
	}
	found = []Ts{}
	if err := findTsByAncestorAndName(c, &found, parentKey, "hehu"); err != nil {
		panic(err)
	}
	if len(found) != 0 {
		panic("wrong len")
	}
	found = []Ts{}
	if err := findTsByName(c, &found, "blapp"); err != nil {
		panic(err)
	}
	if len(found) != 1 {
		panic("wrong len")
	}
	if found[0].Name != "blapp" {
		panic("wrong name")
	}
	found = []Ts{}
	if err := findTsByAncestorAndName(c, &found, parentKey, "blapp"); err != nil {
		panic(err)
	}
	if len(found) != 1 {
		panic("wrong len")
	}
	if found[0].Name != "blapp" {
		panic("wrong name")
	}

}