Chromium Code Reviews| 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 }) |
| +} |