123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263 |
- // Copyright 2014 Google Inc. All rights reserved.
- // Use of this source code is governed by the Apache 2.0
- // license that can be found in the LICENSE file.
- package memcache
- import (
- "fmt"
- "testing"
- "google.golang.org/appengine"
- "google.golang.org/appengine/internal/aetesting"
- pb "google.golang.org/appengine/internal/memcache"
- )
- var errRPC = fmt.Errorf("RPC error")
- func TestGetRequest(t *testing.T) {
- serviceCalled := false
- apiKey := "lyric"
- c := aetesting.FakeSingleContext(t, "memcache", "Get", func(req *pb.MemcacheGetRequest, _ *pb.MemcacheGetResponse) error {
- // Test request.
- if n := len(req.Key); n != 1 {
- t.Errorf("got %d want 1", n)
- return nil
- }
- if k := string(req.Key[0]); k != apiKey {
- t.Errorf("got %q want %q", k, apiKey)
- }
- serviceCalled = true
- return nil
- })
- // Test the "forward" path from the API call parameters to the
- // protobuf request object. (The "backward" path from the
- // protobuf response object to the API call response,
- // including the error response, are handled in the next few
- // tests).
- Get(c, apiKey)
- if !serviceCalled {
- t.Error("Service was not called as expected")
- }
- }
- func TestGetResponseHit(t *testing.T) {
- key := "lyric"
- value := "Where the buffalo roam"
- c := aetesting.FakeSingleContext(t, "memcache", "Get", func(_ *pb.MemcacheGetRequest, res *pb.MemcacheGetResponse) error {
- res.Item = []*pb.MemcacheGetResponse_Item{
- {Key: []byte(key), Value: []byte(value)},
- }
- return nil
- })
- apiItem, err := Get(c, key)
- if apiItem == nil || apiItem.Key != key || string(apiItem.Value) != value {
- t.Errorf("got %q, %q want {%q,%q}, nil", apiItem, err, key, value)
- }
- }
- func TestGetResponseMiss(t *testing.T) {
- c := aetesting.FakeSingleContext(t, "memcache", "Get", func(_ *pb.MemcacheGetRequest, res *pb.MemcacheGetResponse) error {
- // don't fill in any of the response
- return nil
- })
- _, err := Get(c, "something")
- if err != ErrCacheMiss {
- t.Errorf("got %v want ErrCacheMiss", err)
- }
- }
- func TestGetResponseRPCError(t *testing.T) {
- c := aetesting.FakeSingleContext(t, "memcache", "Get", func(_ *pb.MemcacheGetRequest, res *pb.MemcacheGetResponse) error {
- return errRPC
- })
- if _, err := Get(c, "something"); err != errRPC {
- t.Errorf("got %v want errRPC", err)
- }
- }
- func TestAddRequest(t *testing.T) {
- var apiItem = &Item{
- Key: "lyric",
- Value: []byte("Oh, give me a home"),
- }
- serviceCalled := false
- c := aetesting.FakeSingleContext(t, "memcache", "Set", func(req *pb.MemcacheSetRequest, _ *pb.MemcacheSetResponse) error {
- // Test request.
- pbItem := req.Item[0]
- if k := string(pbItem.Key); k != apiItem.Key {
- t.Errorf("got %q want %q", k, apiItem.Key)
- }
- if v := string(apiItem.Value); v != string(pbItem.Value) {
- t.Errorf("got %q want %q", v, string(pbItem.Value))
- }
- if p := *pbItem.SetPolicy; p != pb.MemcacheSetRequest_ADD {
- t.Errorf("got %v want %v", p, pb.MemcacheSetRequest_ADD)
- }
- serviceCalled = true
- return nil
- })
- Add(c, apiItem)
- if !serviceCalled {
- t.Error("Service was not called as expected")
- }
- }
- func TestAddResponseStored(t *testing.T) {
- c := aetesting.FakeSingleContext(t, "memcache", "Set", func(_ *pb.MemcacheSetRequest, res *pb.MemcacheSetResponse) error {
- res.SetStatus = []pb.MemcacheSetResponse_SetStatusCode{pb.MemcacheSetResponse_STORED}
- return nil
- })
- if err := Add(c, &Item{}); err != nil {
- t.Errorf("got %v want nil", err)
- }
- }
- func TestAddResponseNotStored(t *testing.T) {
- c := aetesting.FakeSingleContext(t, "memcache", "Set", func(_ *pb.MemcacheSetRequest, res *pb.MemcacheSetResponse) error {
- res.SetStatus = []pb.MemcacheSetResponse_SetStatusCode{pb.MemcacheSetResponse_NOT_STORED}
- return nil
- })
- if err := Add(c, &Item{}); err != ErrNotStored {
- t.Errorf("got %v want ErrNotStored", err)
- }
- }
- func TestAddResponseError(t *testing.T) {
- c := aetesting.FakeSingleContext(t, "memcache", "Set", func(_ *pb.MemcacheSetRequest, res *pb.MemcacheSetResponse) error {
- res.SetStatus = []pb.MemcacheSetResponse_SetStatusCode{pb.MemcacheSetResponse_ERROR}
- return nil
- })
- if err := Add(c, &Item{}); err != ErrServerError {
- t.Errorf("got %v want ErrServerError", err)
- }
- }
- func TestAddResponseRPCError(t *testing.T) {
- c := aetesting.FakeSingleContext(t, "memcache", "Set", func(_ *pb.MemcacheSetRequest, res *pb.MemcacheSetResponse) error {
- return errRPC
- })
- if err := Add(c, &Item{}); err != errRPC {
- t.Errorf("got %v want errRPC", err)
- }
- }
- func TestSetRequest(t *testing.T) {
- var apiItem = &Item{
- Key: "lyric",
- Value: []byte("Where the buffalo roam"),
- }
- serviceCalled := false
- c := aetesting.FakeSingleContext(t, "memcache", "Set", func(req *pb.MemcacheSetRequest, _ *pb.MemcacheSetResponse) error {
- // Test request.
- if n := len(req.Item); n != 1 {
- t.Errorf("got %d want 1", n)
- return nil
- }
- pbItem := req.Item[0]
- if k := string(pbItem.Key); k != apiItem.Key {
- t.Errorf("got %q want %q", k, apiItem.Key)
- }
- if v := string(pbItem.Value); v != string(apiItem.Value) {
- t.Errorf("got %q want %q", v, string(apiItem.Value))
- }
- if p := *pbItem.SetPolicy; p != pb.MemcacheSetRequest_SET {
- t.Errorf("got %v want %v", p, pb.MemcacheSetRequest_SET)
- }
- serviceCalled = true
- return nil
- })
- Set(c, apiItem)
- if !serviceCalled {
- t.Error("Service was not called as expected")
- }
- }
- func TestSetResponse(t *testing.T) {
- c := aetesting.FakeSingleContext(t, "memcache", "Set", func(_ *pb.MemcacheSetRequest, res *pb.MemcacheSetResponse) error {
- res.SetStatus = []pb.MemcacheSetResponse_SetStatusCode{pb.MemcacheSetResponse_STORED}
- return nil
- })
- if err := Set(c, &Item{}); err != nil {
- t.Errorf("got %v want nil", err)
- }
- }
- func TestSetResponseError(t *testing.T) {
- c := aetesting.FakeSingleContext(t, "memcache", "Set", func(_ *pb.MemcacheSetRequest, res *pb.MemcacheSetResponse) error {
- res.SetStatus = []pb.MemcacheSetResponse_SetStatusCode{pb.MemcacheSetResponse_ERROR}
- return nil
- })
- if err := Set(c, &Item{}); err != ErrServerError {
- t.Errorf("got %v want ErrServerError", err)
- }
- }
- func TestNamespaceResetting(t *testing.T) {
- namec := make(chan *string, 1)
- c0 := aetesting.FakeSingleContext(t, "memcache", "Get", func(req *pb.MemcacheGetRequest, res *pb.MemcacheGetResponse) error {
- namec <- req.NameSpace
- return errRPC
- })
- // Check that wrapping c0 in a namespace twice works correctly.
- c1, err := appengine.Namespace(c0, "A")
- if err != nil {
- t.Fatalf("appengine.Namespace: %v", err)
- }
- c2, err := appengine.Namespace(c1, "") // should act as the original context
- if err != nil {
- t.Fatalf("appengine.Namespace: %v", err)
- }
- Get(c0, "key")
- if ns := <-namec; ns != nil {
- t.Errorf(`Get with c0: ns = %q, want nil`, *ns)
- }
- Get(c1, "key")
- if ns := <-namec; ns == nil {
- t.Error(`Get with c1: ns = nil, want "A"`)
- } else if *ns != "A" {
- t.Errorf(`Get with c1: ns = %q, want "A"`, *ns)
- }
- Get(c2, "key")
- if ns := <-namec; ns != nil {
- t.Errorf(`Get with c2: ns = %q, want nil`, *ns)
- }
- }
- func TestGetMultiEmpty(t *testing.T) {
- serviceCalled := false
- c := aetesting.FakeSingleContext(t, "memcache", "Get", func(req *pb.MemcacheGetRequest, _ *pb.MemcacheGetResponse) error {
- serviceCalled = true
- return nil
- })
- // Test that the Memcache service is not called when
- // GetMulti is passed an empty slice of keys.
- GetMulti(c, []string{})
- if serviceCalled {
- t.Error("Service was called but should not have been")
- }
- }
|