| // 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 appengine |
| |
| import ( |
| "strings" |
| "testing" |
| |
| "github.com/golang/protobuf/proto" |
| "golang.org/x/net/context" |
| |
| "google.golang.org/appengine/internal" |
| "google.golang.org/appengine/internal/aetesting" |
| basepb "google.golang.org/appengine/internal/base" |
| ) |
| |
| func TestNamespaceValidity(t *testing.T) { |
| testCases := []struct { |
| namespace string |
| ok bool |
| }{ |
| // data from Python's namespace_manager_test.py |
| {"", true}, |
| {"__a.namespace.123__", true}, |
| {"-_A....NAMESPACE-_", true}, |
| {"-", true}, |
| {".", true}, |
| {".-", true}, |
| |
| {"?", false}, |
| {"+", false}, |
| {"!", false}, |
| {" ", false}, |
| } |
| for _, tc := range testCases { |
| _, err := Namespace(context.Background(), tc.namespace) |
| if err == nil && !tc.ok { |
| t.Errorf("Namespace %q should be rejected, but wasn't", tc.namespace) |
| } else if err != nil && tc.ok { |
| t.Errorf("Namespace %q should be accepted, but wasn't", tc.namespace) |
| } |
| } |
| } |
| |
| func TestNamespaceApplication(t *testing.T) { |
| internal.NamespaceMods["srv"] = func(m proto.Message, namespace string) { |
| sm := m.(*basepb.StringProto) |
| if strings.Contains(sm.GetValue(), "-") { |
| // be idempotent |
| return |
| } |
| sm.Value = proto.String(sm.GetValue() + "-" + namespace) |
| } |
| ctx := aetesting.FakeSingleContext(t, "srv", "mth", func(in, out *basepb.StringProto) error { |
| out.Value = proto.String(in.GetValue()) |
| return nil |
| }) |
| call := func(ctx context.Context, in string) (out string, ok bool) { |
| inm := &basepb.StringProto{Value: &in} |
| outm := &basepb.StringProto{} |
| if err := internal.Call(ctx, "srv", "mth", inm, outm); err != nil { |
| t.Errorf("RPC(in=%q) failed: %v", in, err) |
| return "", false |
| } |
| return outm.GetValue(), true |
| } |
| |
| // Check without a namespace. |
| got, ok := call(ctx, "foo") |
| if !ok { |
| t.FailNow() |
| } |
| if got != "foo" { |
| t.Errorf("Un-namespaced RPC returned %q, want %q", got, "foo") |
| } |
| |
| // Now check by applying a namespace. |
| nsCtx, err := Namespace(ctx, "myns") |
| if err != nil { |
| t.Fatal(err) |
| } |
| got, ok = call(nsCtx, "bar") |
| if !ok { |
| t.FailNow() |
| } |
| if got != "bar-myns" { |
| t.Errorf("Namespaced RPC returned %q, want %q", got, "bar-myns") |
| } |
| } |