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..1833f1dd59e1c938eb3d6a9fd2715990dce65be9 |
--- /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 |
M-A Ruel
2015/05/25 17:14:52
I think it's better to leave it out.
If we don't
iannucci
2015/05/26 18:25:06
I actually do plan on using it, and I know some ot
|
+ // set to use that namespace, or an error. I'm not sure what the error |
+ // could be, since it's not documented on the appengine SDK. |
+ 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 { |
+ obj := c.Value(globalInfoKey) |
+ if obj == nil || obj.(GIFactory) == nil { |
M-A Ruel
2015/05/25 17:14:52
http://golang.org/ref/spec#Type_assertions
iannucci
2015/05/26 18:25:06
http://play.golang.org/p/g1bN9UNSkS
Typed v. unty
|
+ return nil |
+ } |
+ return obj.(GIFactory)(c) |
+} |
+ |
+// 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 }) |
+} |