OLD | NEW |
| (Empty) |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 package dummy | |
6 | |
7 import ( | |
8 "fmt" | |
9 "runtime" | |
10 "strings" | |
11 "time" | |
12 | |
13 "github.com/luci/gae" | |
14 "golang.org/x/net/context" | |
15 ) | |
16 | |
17 const niFmtStr = "dummy: method %s.%s is not implemented" | |
18 | |
19 // ni returns an error whose message is an appropriate expansion of niFmtStr. | |
20 // | |
21 // It walks the stack to find out what interface and method it's being | |
22 // called from. For example, it might return a message which looks like: | |
23 // dummy: method RawDatastore.Get is not implemented | |
24 // | |
25 // This allows the various dummy objects below to have clear boilerplate which | |
26 // avoids copy+paste errors (such as if each one of them filled in the template | |
27 // manually). | |
28 // | |
29 // If this function is somehow called from something other than one of the dummy | |
30 // objects in this package, it will substitute the string UNKNOWN for the | |
31 // interface and/or the method in the niFmtStr template. | |
32 func ni() error { | |
33 iface := "UNKNOWN" | |
34 funcName := "UNKNOWN" | |
35 | |
36 if ptr, _, _, ok := runtime.Caller(1); ok { | |
37 f := runtime.FuncForPC(ptr) | |
38 n := f.Name() | |
39 if n != "" { | |
40 parts := strings.Split(n, ".") | |
41 if len(parts) > 2 { | |
42 switch parts[len(parts)-2] { | |
43 case "rds": | |
44 iface = "RawDatastore" | |
45 case "mc": | |
46 iface = "Memcache" | |
47 case "tq": | |
48 iface = "TaskQueue" | |
49 case "gi": | |
50 iface = "GlobalInfo" | |
51 case "qy": | |
52 iface = "DSQuery" | |
53 } | |
54 funcName = parts[len(parts)-1] | |
55 } | |
56 } | |
57 } | |
58 | |
59 return fmt.Errorf(niFmtStr, iface, funcName) | |
60 } | |
61 | |
62 /////////////////////////////////// rds //////////////////////////////////// | |
63 | |
64 type rds struct{} | |
65 | |
66 func (rds) NewKey(string, string, int64, gae.DSKey) gae.DSKey
{ panic(ni()) } | |
67 func (rds) DecodeKey(string) (gae.DSKey, error)
{ panic(ni()) } | |
68 func (rds) KeyFromTokens(a, n string, t []gae.DSKeyTok) (gae.DSKey, error)
{ panic(ni()) } | |
69 func (rds) Put(gae.DSKey, gae.DSPropertyLoadSaver) (gae.DSKey, error)
{ panic(ni()) } | |
70 func (rds) Get(gae.DSKey, gae.DSPropertyLoadSaver) error
{ panic(ni()) } | |
71 func (rds) Delete(gae.DSKey) error
{ panic(ni()) } | |
72 func (rds) PutMulti([]gae.DSKey, []gae.DSPropertyLoadSaver) ([]gae.DSKey, error)
{ panic(ni()) } | |
73 func (rds) GetMulti([]gae.DSKey, []gae.DSPropertyLoadSaver) error
{ panic(ni()) } | |
74 func (rds) DeleteMulti([]gae.DSKey) error
{ panic(ni()) } | |
75 func (rds) NewQuery(string) gae.DSQuery
{ panic(ni()) } | |
76 func (rds) Run(gae.DSQuery) gae.RDSIterator
{ panic(ni()) } | |
77 func (rds) GetAll(gae.DSQuery, *[]gae.DSPropertyMap) ([]gae.DSKey, error)
{ panic(ni()) } | |
78 func (rds) Count(gae.DSQuery) (int, error)
{ panic(ni()) } | |
79 func (rds) RunInTransaction(func(context.Context) error, *gae.DSTransactionOptio
ns) error { | |
80 panic(ni()) | |
81 } | |
82 | |
83 var dummyRDSInst = rds{} | |
84 | |
85 // RDS returns a dummy RawDatastore implementation suitable for embedding. | |
86 // Every method panics with a message containing the name of the method which | |
87 // was unimplemented. | |
88 func RDS() gae.RawDatastore { return dummyRDSInst } | |
89 | |
90 /////////////////////////////////// mc //////////////////////////////////// | |
91 | |
92 type mc struct{} | |
93 | |
94 func (mc) Add(gae.MCItem) error { panic(ni()) } | |
95 func (mc) NewItem(key string) gae.MCItem { panic(ni()) } | |
96 func (mc) Set(gae.MCItem) error { panic(ni()) } | |
97 func (mc) Get(string) (gae.MCItem, error) { panic(ni()) } | |
98 func (mc) Delete(string) error { panic(ni()) } | |
99 func (mc) CompareAndSwap(gae.MCItem) error { panic(ni()) } | |
100 func (mc) AddMulti([]gae.MCItem) error { panic(ni()) } | |
101 func (mc) SetMulti([]gae.MCItem) error { panic(ni()) } | |
102 func (mc) GetMulti([]string) (map[string]gae.MCItem, error) { panic(ni()) } | |
103 func (mc) DeleteMulti([]string) error { panic(ni()) } | |
104 func (mc) CompareAndSwapMulti([]gae.MCItem) error { panic(ni()) } | |
105 func (mc) Increment(string, int64, uint64) (uint64, error) { panic(ni()) } | |
106 func (mc) IncrementExisting(string, int64) (uint64, error) { panic(ni()) } | |
107 func (mc) Flush() error { panic(ni()) } | |
108 func (mc) Stats() (*gae.MCStatistics, error) { panic(ni()) } | |
109 | |
110 var dummyMCInst = mc{} | |
111 | |
112 // MC returns a dummy Memcache implementation suitable for embedding. | |
113 // Every method panics with a message containing the name of the method which | |
114 // was unimplemented. | |
115 func MC() gae.Memcache { return dummyMCInst } | |
116 | |
117 /////////////////////////////////// tq //////////////////////////////////// | |
118 | |
119 type tq struct{} | |
120 | |
121 func (tq) Add(*gae.TQTask, string) (*gae.TQTask, error) { panic(ni
()) } | |
122 func (tq) Delete(*gae.TQTask, string) error { panic(ni
()) } | |
123 func (tq) AddMulti([]*gae.TQTask, string) ([]*gae.TQTask, error) { panic(ni
()) } | |
124 func (tq) DeleteMulti([]*gae.TQTask, string) error { panic(ni
()) } | |
125 func (tq) Lease(int, string, int) ([]*gae.TQTask, error) { panic(ni
()) } | |
126 func (tq) LeaseByTag(int, string, int, string) ([]*gae.TQTask, error) { panic(ni
()) } | |
127 func (tq) ModifyLease(*gae.TQTask, string, int) error { panic(ni
()) } | |
128 func (tq) Purge(string) error { panic(ni
()) } | |
129 func (tq) QueueStats([]string) ([]gae.TQStatistics, error) { panic(ni
()) } | |
130 | |
131 var dummyTQInst = tq{} | |
132 | |
133 // TQ returns a dummy TaskQueue implementation suitable for embedding. | |
134 // Every method panics with a message containing the name of the method which | |
135 // was unimplemented. | |
136 func TQ() gae.TaskQueue { return dummyTQInst } | |
137 | |
138 /////////////////////////////////// qy //////////////////////////////////// | |
139 | |
140 type qy struct{} | |
141 | |
142 func (qy) Ancestor(ancestor gae.DSKey) gae.DSQuery { panic(ni())
} | |
143 func (qy) Distinct() gae.DSQuery { panic(ni())
} | |
144 func (qy) End(c gae.DSCursor) gae.DSQuery { panic(ni())
} | |
145 func (qy) EventualConsistency() gae.DSQuery { panic(ni())
} | |
146 func (qy) Filter(filterStr string, value interface{}) gae.DSQuery { panic(ni())
} | |
147 func (qy) KeysOnly() gae.DSQuery { panic(ni())
} | |
148 func (qy) Limit(limit int) gae.DSQuery { panic(ni())
} | |
149 func (qy) Offset(offset int) gae.DSQuery { panic(ni())
} | |
150 func (qy) Order(fieldName string) gae.DSQuery { panic(ni())
} | |
151 func (qy) Project(fieldNames ...string) gae.DSQuery { panic(ni())
} | |
152 func (qy) Start(c gae.DSCursor) gae.DSQuery { panic(ni())
} | |
153 | |
154 var dummyQYInst = qy{} | |
155 | |
156 // QY returns a dummy gae.DSQuery implementation suitable for embedding. | |
157 // Every method panics with a message containing the name of the method which | |
158 // was unimplemented. | |
159 func QY() gae.DSQuery { return dummyQYInst } | |
160 | |
161 /////////////////////////////////// gi //////////////////////////////////// | |
162 | |
163 type gi struct{} | |
164 | |
165 func (gi) AccessToken(scopes ...string) (token string, expiry time.Time, err err
or) { panic(ni()) } | |
166 func (gi) AppID() string
{ panic(ni()) } | |
167 func (gi) ModuleHostname(module, version, instance string) (string, error)
{ panic(ni()) } | |
168 func (gi) ModuleName() string
{ panic(ni()) } | |
169 func (gi) DefaultVersionHostname() string
{ panic(ni()) } | |
170 func (gi) PublicCertificates() ([]gae.GICertificate, error)
{ panic(ni()) } | |
171 func (gi) RequestID() string
{ panic(ni()) } | |
172 func (gi) ServiceAccount() (string, error)
{ panic(ni()) } | |
173 func (gi) SignBytes(bytes []byte) (keyName string, signature []byte, err error)
{ panic(ni()) } | |
174 func (gi) VersionID() string
{ panic(ni()) } | |
175 func (gi) Namespace(namespace string) (context.Context, error)
{ panic(ni()) } | |
176 func (gi) Datacenter() string
{ panic(ni()) } | |
177 func (gi) InstanceID() string
{ panic(ni()) } | |
178 func (gi) IsDevAppServer() bool
{ panic(ni()) } | |
179 func (gi) ServerSoftware() string
{ panic(ni()) } | |
180 func (gi) IsCapabilityDisabled(err error) bool
{ panic(ni()) } | |
181 func (gi) IsOverQuota(err error) bool
{ panic(ni()) } | |
182 func (gi) IsTimeoutError(err error) bool
{ panic(ni()) } | |
183 | |
184 var dummyGIInst = gi{} | |
185 | |
186 // GI returns a dummy GlobalInfo implementation suitable for embedding. | |
187 // Every method panics with a message containing the name of the method which | |
188 // was unimplemented. | |
189 func GI() gae.GlobalInfo { return dummyGIInst } | |
OLD | NEW |