1 // Copyright (c) 2015 The btcsuite developers
2 // Use of this source code is governed by an ISC
3 // license that can be found in the LICENSE file.
11 "github.com/btcsuite/btcd/btcjson"
14 // TestCmdMethod tests the CmdMethod function to ensure it retunrs the expected
15 // methods and errors.
16 func TestCmdMethod(t *testing.T) {
26 name: "unregistered type",
28 err: btcjson.Error{ErrorCode: btcjson.ErrUnregisteredMethod},
31 name: "nil pointer of registered type",
32 cmd: (*btcjson.GetBlockCmd)(nil),
36 name: "nil instance of registered type",
37 cmd: &btcjson.GetBlockCountCmd{},
38 method: "getblockcount",
42 t.Logf("Running %d tests", len(tests))
43 for i, test := range tests {
44 method, err := btcjson.CmdMethod(test.cmd)
45 if reflect.TypeOf(err) != reflect.TypeOf(test.err) {
46 t.Errorf("Test #%d (%s) wrong error - got %T (%[3]v), "+
47 "want %T", i, test.name, err, test.err)
51 gotErrorCode := err.(btcjson.Error).ErrorCode
52 if gotErrorCode != test.err.(btcjson.Error).ErrorCode {
53 t.Errorf("Test #%d (%s) mismatched error code "+
54 "- got %v (%v), want %v", i, test.name,
56 test.err.(btcjson.Error).ErrorCode)
63 // Ensure method matches the expected value.
64 if method != test.method {
65 t.Errorf("Test #%d (%s) mismatched method - got %v, "+
66 "want %v", i, test.name, method, test.method)
72 // TestMethodUsageFlags tests the MethodUsage function ensure it returns the
73 // expected flags and errors.
74 func TestMethodUsageFlags(t *testing.T) {
81 flags btcjson.UsageFlag
84 name: "unregistered type",
85 method: "bogusmethod",
86 err: btcjson.Error{ErrorCode: btcjson.ErrUnregisteredMethod},
94 name: "walletpassphrase",
95 method: "walletpassphrase",
96 flags: btcjson.UFWalletOnly,
100 t.Logf("Running %d tests", len(tests))
101 for i, test := range tests {
102 flags, err := btcjson.MethodUsageFlags(test.method)
103 if reflect.TypeOf(err) != reflect.TypeOf(test.err) {
104 t.Errorf("Test #%d (%s) wrong error - got %T (%[3]v), "+
105 "want %T", i, test.name, err, test.err)
109 gotErrorCode := err.(btcjson.Error).ErrorCode
110 if gotErrorCode != test.err.(btcjson.Error).ErrorCode {
111 t.Errorf("Test #%d (%s) mismatched error code "+
112 "- got %v (%v), want %v", i, test.name,
114 test.err.(btcjson.Error).ErrorCode)
121 // Ensure flags match the expected value.
122 if flags != test.flags {
123 t.Errorf("Test #%d (%s) mismatched flags - got %v, "+
124 "want %v", i, test.name, flags, test.flags)
130 // TestMethodUsageText tests the MethodUsageText function ensure it returns the
132 func TestMethodUsageText(t *testing.T) {
142 name: "unregistered type",
143 method: "bogusmethod",
144 err: btcjson.Error{ErrorCode: btcjson.ErrUnregisteredMethod},
147 name: "getblockcount",
148 method: "getblockcount",
149 expected: "getblockcount",
154 expected: `getblock "hash" (verbose=true verbosetx=false)`,
158 t.Logf("Running %d tests", len(tests))
159 for i, test := range tests {
160 usage, err := btcjson.MethodUsageText(test.method)
161 if reflect.TypeOf(err) != reflect.TypeOf(test.err) {
162 t.Errorf("Test #%d (%s) wrong error - got %T (%[3]v), "+
163 "want %T", i, test.name, err, test.err)
167 gotErrorCode := err.(btcjson.Error).ErrorCode
168 if gotErrorCode != test.err.(btcjson.Error).ErrorCode {
169 t.Errorf("Test #%d (%s) mismatched error code "+
170 "- got %v (%v), want %v", i, test.name,
172 test.err.(btcjson.Error).ErrorCode)
179 // Ensure usage matches the expected value.
180 if usage != test.expected {
181 t.Errorf("Test #%d (%s) mismatched usage - got %v, "+
182 "want %v", i, test.name, usage, test.expected)
186 // Get the usage again to excerise caching.
187 usage, err = btcjson.MethodUsageText(test.method)
189 t.Errorf("Test #%d (%s) unexpected error: %v", i,
194 // Ensure usage still matches the expected value.
195 if usage != test.expected {
196 t.Errorf("Test #%d (%s) mismatched usage - got %v, "+
197 "want %v", i, test.name, usage, test.expected)
203 // TestFieldUsage tests the internal fieldUsage function ensure it returns the
205 func TestFieldUsage(t *testing.T) {
210 field reflect.StructField
211 defValue *reflect.Value
215 name: "jsonrpcusage tag override",
216 field: func() reflect.StructField {
218 Test int `jsonrpcusage:"testvalue"`
220 return reflect.TypeOf((*s)(nil)).Elem().Field(0)
223 expected: "testvalue",
226 name: "generic interface",
227 field: func() reflect.StructField {
231 return reflect.TypeOf((*s)(nil)).Elem().Field(0)
237 name: "string without default value",
238 field: func() reflect.StructField {
242 return reflect.TypeOf((*s)(nil)).Elem().Field(0)
248 name: "string with default value",
249 field: func() reflect.StructField {
253 return reflect.TypeOf((*s)(nil)).Elem().Field(0)
255 defValue: func() *reflect.Value {
257 rv := reflect.ValueOf(&value)
260 expected: `test="default"`,
263 name: "array of strings",
264 field: func() reflect.StructField {
268 return reflect.TypeOf((*s)(nil)).Elem().Field(0)
271 expected: `["test",...]`,
274 name: "array of strings with plural field name 1",
275 field: func() reflect.StructField {
279 return reflect.TypeOf((*s)(nil)).Elem().Field(0)
282 expected: `["key",...]`,
285 name: "array of strings with plural field name 2",
286 field: func() reflect.StructField {
290 return reflect.TypeOf((*s)(nil)).Elem().Field(0)
293 expected: `["address",...]`,
296 name: "array of strings with plural field name 3",
297 field: func() reflect.StructField {
299 Capabilities []string
301 return reflect.TypeOf((*s)(nil)).Elem().Field(0)
304 expected: `["capability",...]`,
307 name: "array of structs",
308 field: func() reflect.StructField {
315 return reflect.TypeOf((*s)(nil)).Elem().Field(0)
318 expected: `[{"txid":"value"},...]`,
321 name: "array of ints",
322 field: func() reflect.StructField {
326 return reflect.TypeOf((*s)(nil)).Elem().Field(0)
329 expected: `[test,...]`,
332 name: "sub struct with jsonrpcusage tag override",
333 field: func() reflect.StructField {
335 Test string `jsonrpcusage:"testusage"`
340 return reflect.TypeOf((*s)(nil)).Elem().Field(0)
343 expected: `{testusage}`,
346 name: "sub struct with string",
347 field: func() reflect.StructField {
354 return reflect.TypeOf((*s)(nil)).Elem().Field(0)
357 expected: `{"txid":"value"}`,
360 name: "sub struct with int",
361 field: func() reflect.StructField {
368 return reflect.TypeOf((*s)(nil)).Elem().Field(0)
371 expected: `{"vout":n}`,
374 name: "sub struct with float",
375 field: func() reflect.StructField {
382 return reflect.TypeOf((*s)(nil)).Elem().Field(0)
385 expected: `{"amount":n.nnn}`,
388 name: "sub struct with sub struct",
389 field: func() reflect.StructField {
399 return reflect.TypeOf((*s)(nil)).Elem().Field(0)
402 expected: `{"template":{"amount":n.nnn}}`,
405 name: "sub struct with slice",
406 field: func() reflect.StructField {
408 Capabilities []string
413 return reflect.TypeOf((*s)(nil)).Elem().Field(0)
416 expected: `{"capabilities":["capability",...]}`,
420 t.Logf("Running %d tests", len(tests))
421 for i, test := range tests {
422 // Ensure usage matches the expected value.
423 usage := btcjson.TstFieldUsage(test.field, test.defValue)
424 if usage != test.expected {
425 t.Errorf("Test #%d (%s) mismatched usage - got %v, "+
426 "want %v", i, test.name, usage, test.expected)