github.com/BlockABC/godash@v0.0.0-20191112120524-f4aa3a32c566/btcjson/cmdinfo_test.go (about)

     1  // Copyright (c) 2015 The btcsuite developers
     2  // Copyright (c) 2016 The Dash developers
     3  // Use of this source code is governed by an ISC
     4  // license that can be found in the LICENSE file.
     5  
     6  package btcjson_test
     7  
     8  import (
     9  	"reflect"
    10  	"testing"
    11  
    12  	"github.com/BlockABC/godash/btcjson"
    13  )
    14  
    15  // TestCmdMethod tests the CmdMethod function to ensure it retunrs the expected
    16  // methods and errors.
    17  func TestCmdMethod(t *testing.T) {
    18  	t.Parallel()
    19  
    20  	tests := []struct {
    21  		name   string
    22  		cmd    interface{}
    23  		method string
    24  		err    error
    25  	}{
    26  		{
    27  			name: "unregistered type",
    28  			cmd:  (*int)(nil),
    29  			err:  btcjson.Error{ErrorCode: btcjson.ErrUnregisteredMethod},
    30  		},
    31  		{
    32  			name:   "nil pointer of registered type",
    33  			cmd:    (*btcjson.GetBlockCmd)(nil),
    34  			method: "getblock",
    35  		},
    36  		{
    37  			name:   "nil instance of registered type",
    38  			cmd:    &btcjson.GetBlockCountCmd{},
    39  			method: "getblockcount",
    40  		},
    41  	}
    42  
    43  	t.Logf("Running %d tests", len(tests))
    44  	for i, test := range tests {
    45  		method, err := btcjson.CmdMethod(test.cmd)
    46  		if reflect.TypeOf(err) != reflect.TypeOf(test.err) {
    47  			t.Errorf("Test #%d (%s) wrong error - got %T (%[3]v), "+
    48  				"want %T", i, test.name, err, test.err)
    49  			continue
    50  		}
    51  		if err != nil {
    52  			gotErrorCode := err.(btcjson.Error).ErrorCode
    53  			if gotErrorCode != test.err.(btcjson.Error).ErrorCode {
    54  				t.Errorf("Test #%d (%s) mismatched error code "+
    55  					"- got %v (%v), want %v", i, test.name,
    56  					gotErrorCode, err,
    57  					test.err.(btcjson.Error).ErrorCode)
    58  				continue
    59  			}
    60  
    61  			continue
    62  		}
    63  
    64  		// Ensure method matches the expected value.
    65  		if method != test.method {
    66  			t.Errorf("Test #%d (%s) mismatched method - got %v, "+
    67  				"want %v", i, test.name, method, test.method)
    68  			continue
    69  		}
    70  	}
    71  }
    72  
    73  // TestMethodUsageFlags tests the MethodUsage function ensure it returns the
    74  // expected flags and errors.
    75  func TestMethodUsageFlags(t *testing.T) {
    76  	t.Parallel()
    77  
    78  	tests := []struct {
    79  		name   string
    80  		method string
    81  		err    error
    82  		flags  btcjson.UsageFlag
    83  	}{
    84  		{
    85  			name:   "unregistered type",
    86  			method: "bogusmethod",
    87  			err:    btcjson.Error{ErrorCode: btcjson.ErrUnregisteredMethod},
    88  		},
    89  		{
    90  			name:   "getblock",
    91  			method: "getblock",
    92  			flags:  0,
    93  		},
    94  		{
    95  			name:   "walletpassphrase",
    96  			method: "walletpassphrase",
    97  			flags:  btcjson.UFWalletOnly,
    98  		},
    99  	}
   100  
   101  	t.Logf("Running %d tests", len(tests))
   102  	for i, test := range tests {
   103  		flags, err := btcjson.MethodUsageFlags(test.method)
   104  		if reflect.TypeOf(err) != reflect.TypeOf(test.err) {
   105  			t.Errorf("Test #%d (%s) wrong error - got %T (%[3]v), "+
   106  				"want %T", i, test.name, err, test.err)
   107  			continue
   108  		}
   109  		if err != nil {
   110  			gotErrorCode := err.(btcjson.Error).ErrorCode
   111  			if gotErrorCode != test.err.(btcjson.Error).ErrorCode {
   112  				t.Errorf("Test #%d (%s) mismatched error code "+
   113  					"- got %v (%v), want %v", i, test.name,
   114  					gotErrorCode, err,
   115  					test.err.(btcjson.Error).ErrorCode)
   116  				continue
   117  			}
   118  
   119  			continue
   120  		}
   121  
   122  		// Ensure flags match the expected value.
   123  		if flags != test.flags {
   124  			t.Errorf("Test #%d (%s) mismatched flags - got %v, "+
   125  				"want %v", i, test.name, flags, test.flags)
   126  			continue
   127  		}
   128  	}
   129  }
   130  
   131  // TestMethodUsageText tests the MethodUsageText function ensure it returns the
   132  // expected text.
   133  func TestMethodUsageText(t *testing.T) {
   134  	t.Parallel()
   135  
   136  	tests := []struct {
   137  		name     string
   138  		method   string
   139  		err      error
   140  		expected string
   141  	}{
   142  		{
   143  			name:   "unregistered type",
   144  			method: "bogusmethod",
   145  			err:    btcjson.Error{ErrorCode: btcjson.ErrUnregisteredMethod},
   146  		},
   147  		{
   148  			name:     "getblockcount",
   149  			method:   "getblockcount",
   150  			expected: "getblockcount",
   151  		},
   152  		{
   153  			name:     "getblock",
   154  			method:   "getblock",
   155  			expected: `getblock "hash" (verbose=true verbosetx=false)`,
   156  		},
   157  	}
   158  
   159  	t.Logf("Running %d tests", len(tests))
   160  	for i, test := range tests {
   161  		usage, err := btcjson.MethodUsageText(test.method)
   162  		if reflect.TypeOf(err) != reflect.TypeOf(test.err) {
   163  			t.Errorf("Test #%d (%s) wrong error - got %T (%[3]v), "+
   164  				"want %T", i, test.name, err, test.err)
   165  			continue
   166  		}
   167  		if err != nil {
   168  			gotErrorCode := err.(btcjson.Error).ErrorCode
   169  			if gotErrorCode != test.err.(btcjson.Error).ErrorCode {
   170  				t.Errorf("Test #%d (%s) mismatched error code "+
   171  					"- got %v (%v), want %v", i, test.name,
   172  					gotErrorCode, err,
   173  					test.err.(btcjson.Error).ErrorCode)
   174  				continue
   175  			}
   176  
   177  			continue
   178  		}
   179  
   180  		// Ensure usage matches the expected value.
   181  		if usage != test.expected {
   182  			t.Errorf("Test #%d (%s) mismatched usage - got %v, "+
   183  				"want %v", i, test.name, usage, test.expected)
   184  			continue
   185  		}
   186  
   187  		// Get the usage again to excerise caching.
   188  		usage, err = btcjson.MethodUsageText(test.method)
   189  		if err != nil {
   190  			t.Errorf("Test #%d (%s) unexpected error: %v", i,
   191  				test.name, err)
   192  			continue
   193  		}
   194  
   195  		// Ensure usage still matches the expected value.
   196  		if usage != test.expected {
   197  			t.Errorf("Test #%d (%s) mismatched usage - got %v, "+
   198  				"want %v", i, test.name, usage, test.expected)
   199  			continue
   200  		}
   201  	}
   202  }
   203  
   204  // TestFieldUsage tests the internal fieldUsage function ensure it returns the
   205  // expected text.
   206  func TestFieldUsage(t *testing.T) {
   207  	t.Parallel()
   208  
   209  	tests := []struct {
   210  		name     string
   211  		field    reflect.StructField
   212  		defValue *reflect.Value
   213  		expected string
   214  	}{
   215  		{
   216  			name: "jsonrpcusage tag override",
   217  			field: func() reflect.StructField {
   218  				type s struct {
   219  					Test int `jsonrpcusage:"testvalue"`
   220  				}
   221  				return reflect.TypeOf((*s)(nil)).Elem().Field(0)
   222  			}(),
   223  			defValue: nil,
   224  			expected: "testvalue",
   225  		},
   226  		{
   227  			name: "generic interface",
   228  			field: func() reflect.StructField {
   229  				type s struct {
   230  					Test interface{}
   231  				}
   232  				return reflect.TypeOf((*s)(nil)).Elem().Field(0)
   233  			}(),
   234  			defValue: nil,
   235  			expected: `test`,
   236  		},
   237  		{
   238  			name: "string without default value",
   239  			field: func() reflect.StructField {
   240  				type s struct {
   241  					Test string
   242  				}
   243  				return reflect.TypeOf((*s)(nil)).Elem().Field(0)
   244  			}(),
   245  			defValue: nil,
   246  			expected: `"test"`,
   247  		},
   248  		{
   249  			name: "string with default value",
   250  			field: func() reflect.StructField {
   251  				type s struct {
   252  					Test string
   253  				}
   254  				return reflect.TypeOf((*s)(nil)).Elem().Field(0)
   255  			}(),
   256  			defValue: func() *reflect.Value {
   257  				value := "default"
   258  				rv := reflect.ValueOf(&value)
   259  				return &rv
   260  			}(),
   261  			expected: `test="default"`,
   262  		},
   263  		{
   264  			name: "array of strings",
   265  			field: func() reflect.StructField {
   266  				type s struct {
   267  					Test []string
   268  				}
   269  				return reflect.TypeOf((*s)(nil)).Elem().Field(0)
   270  			}(),
   271  			defValue: nil,
   272  			expected: `["test",...]`,
   273  		},
   274  		{
   275  			name: "array of strings with plural field name 1",
   276  			field: func() reflect.StructField {
   277  				type s struct {
   278  					Keys []string
   279  				}
   280  				return reflect.TypeOf((*s)(nil)).Elem().Field(0)
   281  			}(),
   282  			defValue: nil,
   283  			expected: `["key",...]`,
   284  		},
   285  		{
   286  			name: "array of strings with plural field name 2",
   287  			field: func() reflect.StructField {
   288  				type s struct {
   289  					Addresses []string
   290  				}
   291  				return reflect.TypeOf((*s)(nil)).Elem().Field(0)
   292  			}(),
   293  			defValue: nil,
   294  			expected: `["address",...]`,
   295  		},
   296  		{
   297  			name: "array of strings with plural field name 3",
   298  			field: func() reflect.StructField {
   299  				type s struct {
   300  					Capabilities []string
   301  				}
   302  				return reflect.TypeOf((*s)(nil)).Elem().Field(0)
   303  			}(),
   304  			defValue: nil,
   305  			expected: `["capability",...]`,
   306  		},
   307  		{
   308  			name: "array of structs",
   309  			field: func() reflect.StructField {
   310  				type s2 struct {
   311  					Txid string
   312  				}
   313  				type s struct {
   314  					Capabilities []s2
   315  				}
   316  				return reflect.TypeOf((*s)(nil)).Elem().Field(0)
   317  			}(),
   318  			defValue: nil,
   319  			expected: `[{"txid":"value"},...]`,
   320  		},
   321  		{
   322  			name: "array of ints",
   323  			field: func() reflect.StructField {
   324  				type s struct {
   325  					Test []int
   326  				}
   327  				return reflect.TypeOf((*s)(nil)).Elem().Field(0)
   328  			}(),
   329  			defValue: nil,
   330  			expected: `[test,...]`,
   331  		},
   332  		{
   333  			name: "sub struct with jsonrpcusage tag override",
   334  			field: func() reflect.StructField {
   335  				type s2 struct {
   336  					Test string `jsonrpcusage:"testusage"`
   337  				}
   338  				type s struct {
   339  					Test s2
   340  				}
   341  				return reflect.TypeOf((*s)(nil)).Elem().Field(0)
   342  			}(),
   343  			defValue: nil,
   344  			expected: `{testusage}`,
   345  		},
   346  		{
   347  			name: "sub struct with string",
   348  			field: func() reflect.StructField {
   349  				type s2 struct {
   350  					Txid string
   351  				}
   352  				type s struct {
   353  					Test s2
   354  				}
   355  				return reflect.TypeOf((*s)(nil)).Elem().Field(0)
   356  			}(),
   357  			defValue: nil,
   358  			expected: `{"txid":"value"}`,
   359  		},
   360  		{
   361  			name: "sub struct with int",
   362  			field: func() reflect.StructField {
   363  				type s2 struct {
   364  					Vout int
   365  				}
   366  				type s struct {
   367  					Test s2
   368  				}
   369  				return reflect.TypeOf((*s)(nil)).Elem().Field(0)
   370  			}(),
   371  			defValue: nil,
   372  			expected: `{"vout":n}`,
   373  		},
   374  		{
   375  			name: "sub struct with float",
   376  			field: func() reflect.StructField {
   377  				type s2 struct {
   378  					Amount float64
   379  				}
   380  				type s struct {
   381  					Test s2
   382  				}
   383  				return reflect.TypeOf((*s)(nil)).Elem().Field(0)
   384  			}(),
   385  			defValue: nil,
   386  			expected: `{"amount":n.nnn}`,
   387  		},
   388  		{
   389  			name: "sub struct with sub struct",
   390  			field: func() reflect.StructField {
   391  				type s3 struct {
   392  					Amount float64
   393  				}
   394  				type s2 struct {
   395  					Template s3
   396  				}
   397  				type s struct {
   398  					Test s2
   399  				}
   400  				return reflect.TypeOf((*s)(nil)).Elem().Field(0)
   401  			}(),
   402  			defValue: nil,
   403  			expected: `{"template":{"amount":n.nnn}}`,
   404  		},
   405  		{
   406  			name: "sub struct with slice",
   407  			field: func() reflect.StructField {
   408  				type s2 struct {
   409  					Capabilities []string
   410  				}
   411  				type s struct {
   412  					Test s2
   413  				}
   414  				return reflect.TypeOf((*s)(nil)).Elem().Field(0)
   415  			}(),
   416  			defValue: nil,
   417  			expected: `{"capabilities":["capability",...]}`,
   418  		},
   419  	}
   420  
   421  	t.Logf("Running %d tests", len(tests))
   422  	for i, test := range tests {
   423  		// Ensure usage matches the expected value.
   424  		usage := btcjson.TstFieldUsage(test.field, test.defValue)
   425  		if usage != test.expected {
   426  			t.Errorf("Test #%d (%s) mismatched usage - got %v, "+
   427  				"want %v", i, test.name, usage, test.expected)
   428  			continue
   429  		}
   430  	}
   431  }