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 }