Index: go/src/infra/gae/libs/wrapper/globalinfo.go |
diff --git a/go/src/infra/gae/libs/wrapper/globalinfo.go b/go/src/infra/gae/libs/wrapper/globalinfo.go |
new file mode 100644 |
index 0000000000000000000000000000000000000000..aab66bb572aa170460beb429b4059e042e2fd4c9 |
--- /dev/null |
+++ b/go/src/infra/gae/libs/wrapper/globalinfo.go |
@@ -0,0 +1,80 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package wrapper |
+ |
+import ( |
+ "time" |
+ |
+ "appengine" |
+ |
+ "golang.org/x/net/context" |
+) |
+ |
+// GlobalInfo is the interface for all of the package methods which normally |
+// would be in the 'appengine' package. |
+type GlobalInfo interface { |
+ // methods usually requiring a Context |
+ |
+ AccessToken(scopes ...string) (token string, expiry time.Time, err error) |
+ AppID() string |
+ DefaultVersionHostname() string |
+ ModuleHostname(module, version, instance string) (string, error) |
+ ModuleName() string |
+ PublicCertificates() ([]appengine.Certificate, error) |
+ RequestID() string |
+ ServiceAccount() (string, error) |
+ SignBytes(bytes []byte) (keyName string, signature []byte, err error) |
+ VersionID() string |
+ |
+ // our tweaked interface |
+ |
+ // Namespace takes the new namespace as a string, and returns a context |
+ // set to use that namespace, or an error. |
+ // The appengine SDK doesn't document what errors you can see from this |
+ // method, or under what circumstances they might occur. |
+ Namespace(namespace string) (context.Context, error) |
+ |
+ // Really global functions... these don't normally even require context, but |
+ // for the purposes of testing+consistency, they're included here. |
+ |
+ Datacenter() string |
+ InstanceID() string |
+ IsDevAppserver() bool |
+ ServerSoftware() string |
+ |
+ IsCapabilityDisabled(err error) bool |
+ IsOverQuota(err error) bool |
+ IsTimeoutError(err error) bool |
+ |
+ // Backends are deprecated in favor of modules, so simplify this a bit by |
+ // omitting them from the interface. |
+ // BackendHostname(name string, index int) string |
+ // BackendInstance() (name string, index int) |
+} |
+ |
+// GIFactory is the function signature for factory methods compatible with |
+// SetGIFactory. |
+type GIFactory func(context.Context) GlobalInfo |
+ |
+// GetGI gets gets the GlobalInfo implementation from context. |
+func GetGI(c context.Context) GlobalInfo { |
+ if f, ok := c.Value(globalInfoKey).(GIFactory); ok && f != nil { |
+ return f(c) |
+ } |
+ return nil |
+} |
+ |
+// SetGIFactory sets the function to produce GlobalInfo instances, as returned |
+// by the GetGI method. |
+func SetGIFactory(c context.Context, gif GIFactory) context.Context { |
+ return context.WithValue(c, globalInfoKey, gif) |
+} |
+ |
+// SetGI sets the current GlobalInfo object in the context. Useful for testing |
+// with a quick mock. This is just a shorthand SetGIFactory invocation to set |
+// a factory which always returns the same object. |
+func SetGI(c context.Context, gi GlobalInfo) context.Context { |
+ return SetGIFactory(c, func(context.Context) GlobalInfo { return gi }) |
+} |