github.com/nspcc-dev/neo-go@v0.105.2-0.20240517133400-6be757af3eba/pkg/neorpc/result/version_test.go (about)

     1  package result
     2  
     3  import (
     4  	"encoding/json"
     5  	"testing"
     6  
     7  	"github.com/nspcc-dev/neo-go/pkg/config"
     8  	"github.com/nspcc-dev/neo-go/pkg/encoding/fixedn"
     9  	"github.com/stretchr/testify/require"
    10  )
    11  
    12  func TestVersion_MarshalUnmarshalJSON(t *testing.T) {
    13  	responseFromGoOld := `{
    14          "network": 860833102,
    15          "nonce": 1677922561,
    16          "protocol": {
    17              "addressversion": 53,
    18              "initialgasdistribution": "52000000",
    19              "maxtraceableblocks": 2102400,
    20              "maxtransactionsperblock": 512,
    21              "maxvaliduntilblockincrement": 5760,
    22              "memorypoolmaxtransactions": 50000,
    23              "msperblock": 15000,
    24              "network": 860833102,
    25              "validatorscount": 7
    26          },
    27          "tcpport": 10333,
    28          "useragent": "/NEO-GO:0.98.2/",
    29          "wsport": 10334
    30      }`
    31  	responseFromGoNew := `{
    32          "nonce": 1677922561,
    33          "protocol": {
    34              "addressversion": 53,
    35              "initialgasdistribution": 5200000000000000,
    36              "maxtraceableblocks": 2102400,
    37              "maxtransactionsperblock": 512,
    38              "maxvaliduntilblockincrement": 5760,
    39              "memorypoolmaxtransactions": 50000,
    40              "msperblock": 15000,
    41              "network": 860833102,
    42              "validatorscount": 7,
    43              "hardforks": [{"name": "Aspidochelone", "blockheight": 123}, {"name": "Basilisk", "blockheight": 1234}]
    44          },
    45          "rpc": {
    46              "maxiteratorresultitems": 100,
    47              "sessionenabled": true
    48          },
    49          "tcpport": 10333,
    50          "useragent": "/NEO-GO:0.98.6/",
    51          "wsport": 10334
    52      }`
    53  	responseFromSharp := `{
    54          "nonce": 1677922561,
    55          "protocol": {
    56              "addressversion": 53,
    57              "initialgasdistribution": 5200000000000000,
    58              "maxtraceableblocks": 2102400,
    59              "maxtransactionsperblock": 512,
    60              "maxvaliduntilblockincrement": 5760,
    61              "memorypoolmaxtransactions": 50000,
    62              "msperblock": 15000,
    63              "network": 860833102,
    64              "validatorscount": 7,
    65              "hardforks": [{"name": "HF_Aspidochelone", "blockheight": 123}, {"name": "HF_Basilisk", "blockheight": 1234}]
    66          },
    67          "rpc": {
    68              "maxiteratorresultitems": 100,
    69              "sessionenabled": true
    70          },
    71          "tcpport": 10333,
    72          "useragent": "/Neo:3.1.0/",
    73          "wsport": 10334
    74      }`
    75  	v := &Version{
    76  		TCPPort:   10333,
    77  		WSPort:    10334,
    78  		Nonce:     1677922561,
    79  		UserAgent: "/NEO-GO:0.98.6/",
    80  		RPC: RPC{
    81  			MaxIteratorResultItems: 100,
    82  			SessionEnabled:         true,
    83  		},
    84  		Protocol: Protocol{
    85  			AddressVersion:              53,
    86  			Network:                     860833102,
    87  			MillisecondsPerBlock:        15000,
    88  			MaxTraceableBlocks:          2102400,
    89  			MaxValidUntilBlockIncrement: 5760,
    90  			MaxTransactionsPerBlock:     512,
    91  			MemoryPoolMaxTransactions:   50000,
    92  			ValidatorsCount:             7,
    93  			// Unmarshalled InitialGasDistribution should always be a valid Fixed8 for both old and new clients.
    94  			InitialGasDistribution: fixedn.Fixed8FromInt64(52000000),
    95  			StateRootInHeader:      false,
    96  			Hardforks:              map[config.Hardfork]uint32{config.HFAspidochelone: 123, config.HFBasilisk: 1234},
    97  		},
    98  	}
    99  	t.Run("MarshalJSON", func(t *testing.T) {
   100  		actual, err := json.Marshal(v)
   101  		require.NoError(t, err)
   102  		require.JSONEq(t, responseFromGoNew, string(actual))
   103  	})
   104  	t.Run("UnmarshalJSON", func(t *testing.T) {
   105  		t.Run("Go node response", func(t *testing.T) {
   106  			t.Run("old RPC server", func(t *testing.T) {
   107  				actual := &Version{}
   108  				require.Error(t, json.Unmarshal([]byte(responseFromGoOld), actual))
   109  			})
   110  			t.Run("new RPC server", func(t *testing.T) {
   111  				actual := &Version{}
   112  				require.NoError(t, json.Unmarshal([]byte(responseFromGoNew), actual))
   113  				require.Equal(t, v, actual)
   114  			})
   115  		})
   116  		t.Run("Sharp node response", func(t *testing.T) {
   117  			actual := &Version{}
   118  			require.NoError(t, json.Unmarshal([]byte(responseFromSharp), actual))
   119  			expected := new(Version)
   120  			*expected = *v
   121  			expected.UserAgent = "/Neo:3.1.0/"
   122  			require.Equal(t, expected, actual)
   123  		})
   124  	})
   125  }