Chromium Code Reviews| Index: go/src/infra/gae/libs/wrapper/dummy.go |
| diff --git a/go/src/infra/gae/libs/wrapper/dummy.go b/go/src/infra/gae/libs/wrapper/dummy.go |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..8bc85107a89f722130fb2e8b8e46dee704febb70 |
| --- /dev/null |
| +++ b/go/src/infra/gae/libs/wrapper/dummy.go |
| @@ -0,0 +1,185 @@ |
| +// 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 ( |
| + "fmt" |
| + "runtime" |
| + "strings" |
| + "time" |
| + |
| + "golang.org/x/net/context" |
| + |
| + "appengine" |
| + "appengine/datastore" |
| + "appengine/memcache" |
| + "appengine/taskqueue" |
| + |
| + "github.com/mjibson/goon" |
| +) |
| + |
| +const niFmtStr = "wrapper: method %s.%s is not implemented" |
| + |
| +func ni() error { |
| + iface := "UNKNOWN" |
| + funcName := "UNKNOWN" |
| + |
| + if ptr, _, _, ok := runtime.Caller(1); ok { |
| + f := runtime.FuncForPC(ptr) |
| + n := f.Name() |
| + if n != "" { |
| + parts := strings.Split(n, ".") |
| + if len(parts) == 3 { |
| + switch parts[1][len(parts[1])-2:] { |
|
M-A Ruel
2015/05/25 17:14:51
I highly recommend to check the package name too.
iannucci
2015/05/26 18:25:05
ni() is internal to this package, so it's always g
|
| + case "DS": |
| + iface = "Datastore" |
| + case "MC": |
| + iface = "Memcache" |
| + case "TQ": |
| + iface = "TaskQueue" |
| + case "GI": |
| + iface = "GlobalInformation" |
| + case "QY": |
| + iface = "Query" |
| + } |
| + funcName = parts[2] |
|
M-A Ruel
2015/05/25 17:14:51
why no break?
iannucci
2015/05/26 18:25:06
b/c there's no loop?
M-A Ruel
2015/05/27 00:27:10
That ... is a good reason. I misread as a for loop
|
| + } |
| + } |
| + } |
| + |
| + return fmt.Errorf(niFmtStr, iface, funcName) |
| +} |
| + |
| +/////////////////////////////////// dummyDS //////////////////////////////////// |
| + |
| +type dummyDS struct{} |
| + |
| +func (dummyDS) Kind(interface{}) string { panic(ni()) } |
| +func (dummyDS) KindNameResolver() goon.KindNameResolver { panic(ni()) } |
| +func (dummyDS) SetKindNameResolver(goon.KindNameResolver) { panic(ni()) } |
| +func (dummyDS) NewKey(string, string, int64, *datastore.Key) *datastore.Key { panic(ni()) } |
| +func (dummyDS) NewKeyObj(interface{}) *datastore.Key { panic(ni()) } |
| +func (dummyDS) NewKeyObjError(interface{}) (*datastore.Key, error) { panic(ni()) } |
| +func (dummyDS) Put(interface{}) (*datastore.Key, error) { panic(ni()) } |
| +func (dummyDS) Get(interface{}) error { panic(ni()) } |
| +func (dummyDS) Delete(*datastore.Key) error { panic(ni()) } |
| +func (dummyDS) PutMulti(interface{}) ([]*datastore.Key, error) { panic(ni()) } |
| +func (dummyDS) GetMulti(interface{}) error { panic(ni()) } |
| +func (dummyDS) DeleteMulti([]*datastore.Key) error { panic(ni()) } |
| +func (dummyDS) NewQuery(string) DSQuery { panic(ni()) } |
| +func (dummyDS) Run(DSQuery) DSIterator { panic(ni()) } |
| +func (dummyDS) GetAll(DSQuery, interface{}) ([]*datastore.Key, error) { panic(ni()) } |
| +func (dummyDS) Count(DSQuery) (int, error) { panic(ni()) } |
| +func (dummyDS) RunInTransaction(func(context.Context) error, *datastore.TransactionOptions) error { |
| + panic(ni()) |
| +} |
| + |
| +var dummyDSInst = dummyDS{} |
| + |
| +// DummyDS returns a dummy Datastore implementation suitable for embedding. |
| +// Every method panics with a message containing the name of the method which |
| +// was unimplemented. |
| +func DummyDS() Datastore { return dummyDSInst } |
| + |
| +/////////////////////////////////// dummyMC //////////////////////////////////// |
| + |
| +type dummyMC struct{} |
| + |
| +func (dummyMC) Add(*memcache.Item) error { panic(ni()) } |
| +func (dummyMC) Set(*memcache.Item) error { panic(ni()) } |
| +func (dummyMC) Get(string) (*memcache.Item, error) { panic(ni()) } |
| +func (dummyMC) Delete(string) error { panic(ni()) } |
| +func (dummyMC) CompareAndSwap(*memcache.Item) error { panic(ni()) } |
| +func (dummyMC) AddMulti([]*memcache.Item) error { panic(ni()) } |
| +func (dummyMC) SetMulti([]*memcache.Item) error { panic(ni()) } |
| +func (dummyMC) GetMulti([]string) (map[string]*memcache.Item, error) { panic(ni()) } |
| +func (dummyMC) DeleteMulti([]string) error { panic(ni()) } |
| +func (dummyMC) CompareAndSwapMulti([]*memcache.Item) error { panic(ni()) } |
| +func (dummyMC) Increment(string, int64, uint64) (uint64, error) { panic(ni()) } |
| +func (dummyMC) IncrementExisting(string, int64) (uint64, error) { panic(ni()) } |
| +func (dummyMC) Flush() error { panic(ni()) } |
| +func (dummyMC) Stats() (*memcache.Statistics, error) { panic(ni()) } |
| +func (dummyMC) InflateCodec(memcache.Codec) MCCodec { panic(ni()) } |
| + |
| +var dummyMCInst = dummyMC{} |
| + |
| +// DummyMC returns a dummy Memcache implementation suitable for embedding. |
| +// Every method panics with a message containing the name of the method which |
| +// was unimplemented. |
| +func DummyMC() Memcache { return dummyMCInst } |
| + |
| +/////////////////////////////////// dummyTQ //////////////////////////////////// |
| + |
| +type dummyTQ struct{} |
| + |
| +func (dummyTQ) Add(*taskqueue.Task, string) (*taskqueue.Task, error) { panic(ni()) } |
| +func (dummyTQ) Delete(*taskqueue.Task, string) error { panic(ni()) } |
| +func (dummyTQ) AddMulti([]*taskqueue.Task, string) ([]*taskqueue.Task, error) { panic(ni()) } |
| +func (dummyTQ) DeleteMulti([]*taskqueue.Task, string) error { panic(ni()) } |
| +func (dummyTQ) Lease(int, string, int) ([]*taskqueue.Task, error) { panic(ni()) } |
| +func (dummyTQ) LeaseByTag(int, string, int, string) ([]*taskqueue.Task, error) { panic(ni()) } |
| +func (dummyTQ) ModifyLease(*taskqueue.Task, string, int) error { panic(ni()) } |
| +func (dummyTQ) Purge(string) error { panic(ni()) } |
| +func (dummyTQ) QueueStats([]string, int) ([]taskqueue.QueueStatistics, error) { panic(ni()) } |
| + |
| +var dummyTQInst = dummyTQ{} |
| + |
| +// DummyTQ returns a dummy TaskQueue implementation suitable for embedding. |
| +// Every method panics with a message containing the name of the method which |
| +// was unimplemented. |
| +func DummyTQ() TaskQueue { return dummyTQInst } |
| + |
| +/////////////////////////////////// dummyQY //////////////////////////////////// |
| + |
| +type dummyQY struct{} |
| + |
| +func (dummyQY) Ancestor(ancestor *datastore.Key) DSQuery { panic(ni()) } |
| +func (dummyQY) Distinct() DSQuery { panic(ni()) } |
| +func (dummyQY) End(c DSCursor) DSQuery { panic(ni()) } |
| +func (dummyQY) EventualConsistency() DSQuery { panic(ni()) } |
| +func (dummyQY) Filter(filterStr string, value interface{}) DSQuery { panic(ni()) } |
| +func (dummyQY) KeysOnly() DSQuery { panic(ni()) } |
| +func (dummyQY) Limit(limit int) DSQuery { panic(ni()) } |
| +func (dummyQY) Offset(offset int) DSQuery { panic(ni()) } |
| +func (dummyQY) Order(fieldName string) DSQuery { panic(ni()) } |
| +func (dummyQY) Project(fieldNames ...string) DSQuery { panic(ni()) } |
| +func (dummyQY) Start(c DSCursor) DSQuery { panic(ni()) } |
| + |
| +var dummyQYInst = dummyQY{} |
| + |
| +// DummyQY returns a dummy DSQuery implementation suitable for embedding. |
| +// Every method panics with a message containing the name of the method which |
| +// was unimplemented. |
| +func DummyQY() DSQuery { return dummyQYInst } |
| + |
| +/////////////////////////////////// dummyGI //////////////////////////////////// |
| + |
| +type dummyGI struct{} |
| + |
| +func (dummyGI) AccessToken(scopes ...string) (token string, expiry time.Time, err error) { panic(ni()) } |
| +func (dummyGI) AppID() string { panic(ni()) } |
| +func (dummyGI) ModuleHostname(module, version, instance string) (string, error) { panic(ni()) } |
| +func (dummyGI) ModuleName() string { panic(ni()) } |
| +func (dummyGI) DefaultVersionHostname() string { panic(ni()) } |
| +func (dummyGI) PublicCertificates() ([]appengine.Certificate, error) { panic(ni()) } |
| +func (dummyGI) RequestID() string { panic(ni()) } |
| +func (dummyGI) ServiceAccount() (string, error) { panic(ni()) } |
| +func (dummyGI) SignBytes(bytes []byte) (keyName string, signature []byte, err error) { panic(ni()) } |
| +func (dummyGI) VersionID() string { panic(ni()) } |
| +func (dummyGI) Namespace(namespace string) (context.Context, error) { panic(ni()) } |
| +func (dummyGI) Datacenter() string { panic(ni()) } |
| +func (dummyGI) InstanceID() string { panic(ni()) } |
| +func (dummyGI) IsDevAppserver() bool { panic(ni()) } |
| +func (dummyGI) ServerSoftware() string { panic(ni()) } |
| +func (dummyGI) IsCapabilityDisabled(err error) bool { panic(ni()) } |
| +func (dummyGI) IsOverQuota(err error) bool { panic(ni()) } |
| +func (dummyGI) IsTimeoutError(err error) bool { panic(ni()) } |
| + |
| +var dummyGIInst = dummyGI{} |
| + |
| +// DummyGI returns a dummy GlobalInfo implementation suitable for embedding. |
| +// Every method panics with a message containing the name of the method which |
| +// was unimplemented. |
| +func DummyGI() GlobalInfo { return dummyGIInst } |