github.com/MetalBlockchain/metalgo@v1.11.9/ids/node_id_test.go (about)

     1  // Copyright (C) 2019-2024, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package ids
     5  
     6  import (
     7  	"encoding/json"
     8  	"fmt"
     9  	"testing"
    10  
    11  	"github.com/stretchr/testify/require"
    12  
    13  	"github.com/MetalBlockchain/metalgo/utils/cb58"
    14  )
    15  
    16  func TestNodeIDEquality(t *testing.T) {
    17  	require := require.New(t)
    18  
    19  	id := NodeID{24}
    20  	idCopy := NodeID{24}
    21  	require.Equal(id, idCopy)
    22  	id2 := NodeID{}
    23  	require.NotEqual(id, id2)
    24  }
    25  
    26  func TestNodeIDFromString(t *testing.T) {
    27  	require := require.New(t)
    28  
    29  	id := NodeID{'a', 'v', 'a', ' ', 'l', 'a', 'b', 's'}
    30  	idStr := id.String()
    31  	id2, err := NodeIDFromString(idStr)
    32  	require.NoError(err)
    33  	require.Equal(id, id2)
    34  	expected := "NodeID-9tLMkeWFhWXd8QZc4rSiS5meuVXF5kRsz"
    35  	require.Equal(expected, idStr)
    36  }
    37  
    38  func TestNodeIDFromStringError(t *testing.T) {
    39  	tests := []struct {
    40  		in          string
    41  		expectedErr error
    42  	}{
    43  		{
    44  			in:          "",
    45  			expectedErr: cb58.ErrBase58Decoding,
    46  		},
    47  		{
    48  			in:          "foo",
    49  			expectedErr: cb58.ErrMissingChecksum,
    50  		},
    51  		{
    52  			in:          "foobar",
    53  			expectedErr: cb58.ErrBadChecksum,
    54  		},
    55  	}
    56  	for _, tt := range tests {
    57  		t.Run(tt.in, func(t *testing.T) {
    58  			_, err := FromString(tt.in)
    59  			require.ErrorIs(t, err, tt.expectedErr)
    60  		})
    61  	}
    62  }
    63  
    64  func TestNodeIDMarshalJSON(t *testing.T) {
    65  	tests := []struct {
    66  		label string
    67  		in    NodeID
    68  		out   []byte
    69  		err   error
    70  	}{
    71  		{
    72  			"NodeID{}",
    73  			NodeID{},
    74  			[]byte(`"NodeID-111111111111111111116DBWJs"`),
    75  			nil,
    76  		},
    77  		{
    78  			`ID("ava labs")`,
    79  			NodeID{'a', 'v', 'a', ' ', 'l', 'a', 'b', 's'},
    80  			[]byte(`"NodeID-9tLMkeWFhWXd8QZc4rSiS5meuVXF5kRsz"`),
    81  			nil,
    82  		},
    83  	}
    84  	for _, tt := range tests {
    85  		t.Run(tt.label, func(t *testing.T) {
    86  			require := require.New(t)
    87  
    88  			out, err := tt.in.MarshalJSON()
    89  			require.ErrorIs(err, tt.err)
    90  			require.Equal(tt.out, out)
    91  		})
    92  	}
    93  }
    94  
    95  func TestNodeIDUnmarshalJSON(t *testing.T) {
    96  	tests := []struct {
    97  		label       string
    98  		in          []byte
    99  		out         NodeID
   100  		expectedErr error
   101  	}{
   102  		{
   103  			"NodeID{}",
   104  			[]byte("null"),
   105  			NodeID{},
   106  			nil,
   107  		},
   108  		{
   109  			`NodeID("ava labs")`,
   110  			[]byte(`"NodeID-9tLMkeWFhWXd8QZc4rSiS5meuVXF5kRsz"`),
   111  			NodeID{'a', 'v', 'a', ' ', 'l', 'a', 'b', 's'},
   112  			nil,
   113  		},
   114  		{
   115  			"missing start quote",
   116  			[]byte(`NodeID-9tLMkeWFhWXd8QZc4rSiS5meuVXF5kRsz"`),
   117  			NodeID{},
   118  			errMissingQuotes,
   119  		},
   120  		{
   121  			"missing end quote",
   122  			[]byte(`"NodeID-9tLMkeWFhWXd8QZc4rSiS5meuVXF5kRsz`),
   123  			NodeID{},
   124  			errMissingQuotes,
   125  		},
   126  		{
   127  			"NodeID-",
   128  			[]byte(`"NodeID-"`),
   129  			NodeID{},
   130  			errShortNodeID,
   131  		},
   132  		{
   133  			"NodeID-1",
   134  			[]byte(`"NodeID-1"`),
   135  			NodeID{},
   136  			cb58.ErrMissingChecksum,
   137  		},
   138  		{
   139  			"NodeID-9tLMkeWFhWXd8QZc4rSiS5meuVXF5kRsz1",
   140  			[]byte(`"NodeID-1"`),
   141  			NodeID{},
   142  			cb58.ErrMissingChecksum,
   143  		},
   144  	}
   145  	for _, tt := range tests {
   146  		t.Run(tt.label, func(t *testing.T) {
   147  			require := require.New(t)
   148  
   149  			foo := NodeID{}
   150  			err := foo.UnmarshalJSON(tt.in)
   151  			require.ErrorIs(err, tt.expectedErr)
   152  			require.Equal(tt.out, foo)
   153  		})
   154  	}
   155  }
   156  
   157  func TestNodeIDString(t *testing.T) {
   158  	tests := []struct {
   159  		label    string
   160  		id       NodeID
   161  		expected string
   162  	}{
   163  		{"NodeID{}", NodeID{}, "NodeID-111111111111111111116DBWJs"},
   164  		{"NodeID{24}", NodeID{24}, "NodeID-3BuDc2d1Efme5Apba6SJ8w3Tz7qeh6mHt"},
   165  	}
   166  	for _, tt := range tests {
   167  		t.Run(tt.label, func(t *testing.T) {
   168  			require.Equal(t, tt.expected, tt.id.String())
   169  		})
   170  	}
   171  }
   172  
   173  func TestNodeIDMapMarshalling(t *testing.T) {
   174  	require := require.New(t)
   175  
   176  	originalMap := map[NodeID]int{
   177  		{'e', 'v', 'a', ' ', 'l', 'a', 'b', 's'}: 1,
   178  		{'a', 'v', 'a', ' ', 'l', 'a', 'b', 's'}: 2,
   179  	}
   180  	mapJSON, err := json.Marshal(originalMap)
   181  	require.NoError(err)
   182  
   183  	var unmarshalledMap map[NodeID]int
   184  	require.NoError(json.Unmarshal(mapJSON, &unmarshalledMap))
   185  	require.Equal(originalMap, unmarshalledMap)
   186  }
   187  
   188  func TestNodeIDCompare(t *testing.T) {
   189  	tests := []struct {
   190  		a        NodeID
   191  		b        NodeID
   192  		expected int
   193  	}{
   194  		{
   195  			a:        NodeID{1},
   196  			b:        NodeID{0},
   197  			expected: 1,
   198  		},
   199  		{
   200  			a:        NodeID{1},
   201  			b:        NodeID{1},
   202  			expected: 0,
   203  		},
   204  		{
   205  			a:        NodeID{1, 0},
   206  			b:        NodeID{1, 2},
   207  			expected: -1,
   208  		},
   209  	}
   210  	for _, test := range tests {
   211  		t.Run(fmt.Sprintf("%s_%s_%d", test.a, test.b, test.expected), func(t *testing.T) {
   212  			require := require.New(t)
   213  
   214  			require.Equal(test.expected, test.a.Compare(test.b))
   215  			require.Equal(-test.expected, test.b.Compare(test.a))
   216  		})
   217  	}
   218  }