github.com/dashpay/godash@v0.0.0-20160726055534-e038a21e0e3d/btcjson/btcdextcmds_test.go (about)

     1  // Copyright (c) 2014 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  	"bytes"
    10  	"encoding/json"
    11  	"fmt"
    12  	"reflect"
    13  	"testing"
    14  
    15  	"github.com/dashpay/godash/btcjson"
    16  )
    17  
    18  // TestBtcdExtCmds tests all of the btcd extended commands marshal and unmarshal
    19  // into valid results include handling of optional fields being omitted in the
    20  // marshalled command, while optional fields with defaults have the default
    21  // assigned on unmarshalled commands.
    22  func TestBtcdExtCmds(t *testing.T) {
    23  	t.Parallel()
    24  
    25  	testID := int(1)
    26  	tests := []struct {
    27  		name         string
    28  		newCmd       func() (interface{}, error)
    29  		staticCmd    func() interface{}
    30  		marshalled   string
    31  		unmarshalled interface{}
    32  	}{
    33  		{
    34  			name: "debuglevel",
    35  			newCmd: func() (interface{}, error) {
    36  				return btcjson.NewCmd("debuglevel", "trace")
    37  			},
    38  			staticCmd: func() interface{} {
    39  				return btcjson.NewDebugLevelCmd("trace")
    40  			},
    41  			marshalled: `{"jsonrpc":"1.0","method":"debuglevel","params":["trace"],"id":1}`,
    42  			unmarshalled: &btcjson.DebugLevelCmd{
    43  				LevelSpec: "trace",
    44  			},
    45  		},
    46  		{
    47  			name: "node",
    48  			newCmd: func() (interface{}, error) {
    49  				return btcjson.NewCmd("node", btcjson.NRemove, "1.1.1.1")
    50  			},
    51  			staticCmd: func() interface{} {
    52  				return btcjson.NewNodeCmd("remove", "1.1.1.1", nil)
    53  			},
    54  			marshalled: `{"jsonrpc":"1.0","method":"node","params":["remove","1.1.1.1"],"id":1}`,
    55  			unmarshalled: &btcjson.NodeCmd{
    56  				SubCmd: btcjson.NRemove,
    57  				Target: "1.1.1.1",
    58  			},
    59  		},
    60  		{
    61  			name: "node",
    62  			newCmd: func() (interface{}, error) {
    63  				return btcjson.NewCmd("node", btcjson.NDisconnect, "1.1.1.1")
    64  			},
    65  			staticCmd: func() interface{} {
    66  				return btcjson.NewNodeCmd("disconnect", "1.1.1.1", nil)
    67  			},
    68  			marshalled: `{"jsonrpc":"1.0","method":"node","params":["disconnect","1.1.1.1"],"id":1}`,
    69  			unmarshalled: &btcjson.NodeCmd{
    70  				SubCmd: btcjson.NDisconnect,
    71  				Target: "1.1.1.1",
    72  			},
    73  		},
    74  		{
    75  			name: "node",
    76  			newCmd: func() (interface{}, error) {
    77  				return btcjson.NewCmd("node", btcjson.NConnect, "1.1.1.1", "perm")
    78  			},
    79  			staticCmd: func() interface{} {
    80  				return btcjson.NewNodeCmd("connect", "1.1.1.1", btcjson.String("perm"))
    81  			},
    82  			marshalled: `{"jsonrpc":"1.0","method":"node","params":["connect","1.1.1.1","perm"],"id":1}`,
    83  			unmarshalled: &btcjson.NodeCmd{
    84  				SubCmd:        btcjson.NConnect,
    85  				Target:        "1.1.1.1",
    86  				ConnectSubCmd: btcjson.String("perm"),
    87  			},
    88  		},
    89  		{
    90  			name: "node",
    91  			newCmd: func() (interface{}, error) {
    92  				return btcjson.NewCmd("node", btcjson.NConnect, "1.1.1.1", "temp")
    93  			},
    94  			staticCmd: func() interface{} {
    95  				return btcjson.NewNodeCmd("connect", "1.1.1.1", btcjson.String("temp"))
    96  			},
    97  			marshalled: `{"jsonrpc":"1.0","method":"node","params":["connect","1.1.1.1","temp"],"id":1}`,
    98  			unmarshalled: &btcjson.NodeCmd{
    99  				SubCmd:        btcjson.NConnect,
   100  				Target:        "1.1.1.1",
   101  				ConnectSubCmd: btcjson.String("temp"),
   102  			},
   103  		},
   104  		{
   105  			name: "generate",
   106  			newCmd: func() (interface{}, error) {
   107  				return btcjson.NewCmd("generate", 1)
   108  			},
   109  			staticCmd: func() interface{} {
   110  				return btcjson.NewGenerateCmd(1)
   111  			},
   112  			marshalled: `{"jsonrpc":"1.0","method":"generate","params":[1],"id":1}`,
   113  			unmarshalled: &btcjson.GenerateCmd{
   114  				NumBlocks: 1,
   115  			},
   116  		},
   117  		{
   118  			name: "getbestblock",
   119  			newCmd: func() (interface{}, error) {
   120  				return btcjson.NewCmd("getbestblock")
   121  			},
   122  			staticCmd: func() interface{} {
   123  				return btcjson.NewGetBestBlockCmd()
   124  			},
   125  			marshalled:   `{"jsonrpc":"1.0","method":"getbestblock","params":[],"id":1}`,
   126  			unmarshalled: &btcjson.GetBestBlockCmd{},
   127  		},
   128  		{
   129  			name: "getcurrentnet",
   130  			newCmd: func() (interface{}, error) {
   131  				return btcjson.NewCmd("getcurrentnet")
   132  			},
   133  			staticCmd: func() interface{} {
   134  				return btcjson.NewGetCurrentNetCmd()
   135  			},
   136  			marshalled:   `{"jsonrpc":"1.0","method":"getcurrentnet","params":[],"id":1}`,
   137  			unmarshalled: &btcjson.GetCurrentNetCmd{},
   138  		},
   139  	}
   140  
   141  	t.Logf("Running %d tests", len(tests))
   142  	for i, test := range tests {
   143  		// Marshal the command as created by the new static command
   144  		// creation function.
   145  		marshalled, err := btcjson.MarshalCmd(testID, test.staticCmd())
   146  		if err != nil {
   147  			t.Errorf("MarshalCmd #%d (%s) unexpected error: %v", i,
   148  				test.name, err)
   149  			continue
   150  		}
   151  
   152  		if !bytes.Equal(marshalled, []byte(test.marshalled)) {
   153  			t.Errorf("Test #%d (%s) unexpected marshalled data - "+
   154  				"got %s, want %s", i, test.name, marshalled,
   155  				test.marshalled)
   156  			continue
   157  		}
   158  
   159  		// Ensure the command is created without error via the generic
   160  		// new command creation function.
   161  		cmd, err := test.newCmd()
   162  		if err != nil {
   163  			t.Errorf("Test #%d (%s) unexpected NewCmd error: %v ",
   164  				i, test.name, err)
   165  		}
   166  
   167  		// Marshal the command as created by the generic new command
   168  		// creation function.
   169  		marshalled, err = btcjson.MarshalCmd(testID, cmd)
   170  		if err != nil {
   171  			t.Errorf("MarshalCmd #%d (%s) unexpected error: %v", i,
   172  				test.name, err)
   173  			continue
   174  		}
   175  
   176  		if !bytes.Equal(marshalled, []byte(test.marshalled)) {
   177  			t.Errorf("Test #%d (%s) unexpected marshalled data - "+
   178  				"got %s, want %s", i, test.name, marshalled,
   179  				test.marshalled)
   180  			continue
   181  		}
   182  
   183  		var request btcjson.Request
   184  		if err := json.Unmarshal(marshalled, &request); err != nil {
   185  			t.Errorf("Test #%d (%s) unexpected error while "+
   186  				"unmarshalling JSON-RPC request: %v", i,
   187  				test.name, err)
   188  			continue
   189  		}
   190  
   191  		cmd, err = btcjson.UnmarshalCmd(&request)
   192  		if err != nil {
   193  			t.Errorf("UnmarshalCmd #%d (%s) unexpected error: %v", i,
   194  				test.name, err)
   195  			continue
   196  		}
   197  
   198  		if !reflect.DeepEqual(cmd, test.unmarshalled) {
   199  			t.Errorf("Test #%d (%s) unexpected unmarshalled command "+
   200  				"- got %s, want %s", i, test.name,
   201  				fmt.Sprintf("(%T) %+[1]v", cmd),
   202  				fmt.Sprintf("(%T) %+[1]v\n", test.unmarshalled))
   203  			continue
   204  		}
   205  	}
   206  }