github.com/braveheart12/just@v0.8.7/networkcoordinator/real_test.go (about) 1 /* 2 * The Clear BSD License 3 * 4 * Copyright (c) 2019 Insolar Technologies 5 * 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without modification, are permitted (subject to the limitations in the disclaimer below) provided that the following conditions are met: 9 * 10 * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 11 * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 12 * Neither the name of Insolar Technologies nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 13 * 14 * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 15 * 16 */ 17 18 package networkcoordinator 19 20 import ( 21 "context" 22 "testing" 23 24 "github.com/insolar/insolar/certificate" 25 "github.com/insolar/insolar/core" 26 "github.com/insolar/insolar/core/message" 27 "github.com/insolar/insolar/core/reply" 28 "github.com/insolar/insolar/testutils" 29 "github.com/pkg/errors" 30 "github.com/stretchr/testify/require" 31 ) 32 33 func mockContractRequester(t *testing.T, nodeRef core.RecordRef, ok bool, r []byte) core.ContractRequester { 34 cr := testutils.NewContractRequesterMock(t) 35 cr.SendRequestFunc = func(ctx context.Context, ref *core.RecordRef, method string, args []interface{}) (core.Reply, error) { 36 require.Equal(t, nodeRef, *ref) 37 require.Equal(t, "GetNodeInfo", method) 38 require.Equal(t, 0, len(args)) 39 if ok { 40 return &reply.CallMethod{ 41 Result: r, 42 }, nil 43 } 44 return nil, errors.New("test_error") 45 } 46 return cr 47 } 48 49 func TestRealNetworkCoordinator_New(t *testing.T) { 50 coord := newRealNetworkCoordinator(nil, nil, nil, nil) 51 require.Equal(t, &realNetworkCoordinator{}, coord) 52 } 53 54 func TestRealNetworkCoordinator_GetCert(t *testing.T) { 55 nodeRef := testutils.RandomRef() 56 certNodeRef := testutils.RandomRef() 57 58 cr := mockContractRequester(t, nodeRef, true, mockReply(t)) 59 60 ns := testutils.NewNetworkSwitcherMock(t) 61 ns.GetStateFunc = func() core.NetworkState { 62 return core.CompleteNetworkState 63 } 64 65 mb := mockMessageBus(t, true, &nodeRef, &certNodeRef) 66 cm := mockCertificateManager(t, &certNodeRef, &certNodeRef, true) 67 cs := mockCryptographyService(t, true) 68 69 coord := newRealNetworkCoordinator(cm, cr, mb, cs) 70 ctx := context.Background() 71 result, err := coord.GetCert(ctx, &nodeRef) 72 require.NoError(t, err) 73 74 cert := result.(*certificate.Certificate) 75 require.Equal(t, "test_node_public_key", cert.PublicKey) 76 require.Equal(t, nodeRef.String(), cert.Reference) 77 require.Equal(t, "virtual", cert.Role) 78 require.Equal(t, 0, cert.MajorityRule) 79 require.Equal(t, uint(0), cert.MinRoles.Virtual) 80 require.Equal(t, uint(0), cert.MinRoles.HeavyMaterial) 81 require.Equal(t, uint(0), cert.MinRoles.LightMaterial) 82 require.Equal(t, []string{}, cert.PulsarPublicKeys) 83 require.Equal(t, "test_root_domain_ref", cert.RootDomainReference) 84 require.Equal(t, 1, len(cert.BootstrapNodes)) 85 require.Equal(t, "test_discovery_public_key", cert.BootstrapNodes[0].PublicKey) 86 require.Equal(t, []byte("test_network_sign"), cert.BootstrapNodes[0].NetworkSign) 87 require.Equal(t, "test_discovery_host", cert.BootstrapNodes[0].Host) 88 require.Equal(t, []byte("test_sig"), cert.BootstrapNodes[0].NodeSign) 89 require.Equal(t, certNodeRef.String(), cert.BootstrapNodes[0].NodeRef) 90 } 91 92 func TestRealNetworkCoordinator_GetCert_getNodeInfoError(t *testing.T) { 93 nodeRef := testutils.RandomRef() 94 95 cr := mockContractRequester(t, nodeRef, false, nil) 96 97 coord := newRealNetworkCoordinator(nil, cr, nil, nil) 98 ctx := context.Background() 99 _, err := coord.GetCert(ctx, &nodeRef) 100 require.EqualError(t, err, "[ GetCert ] Couldn't get node info: [ GetCert ] Couldn't call GetNodeInfo: test_error") 101 } 102 103 func TestRealNetworkCoordinator_GetCert_DeserializeError(t *testing.T) { 104 nodeRef := testutils.RandomRef() 105 106 cr := mockContractRequester(t, nodeRef, true, []byte("")) 107 108 coord := newRealNetworkCoordinator(nil, cr, nil, nil) 109 ctx := context.Background() 110 _, err := coord.GetCert(ctx, &nodeRef) 111 require.EqualError(t, err, "[ GetCert ] Couldn't get node info: [ GetCert ] Couldn't extract response: [ NodeInfoResponse ] Can't unmarshal response: [ UnMarshalResponse ]: [ Deserialize ]: EOF") 112 } 113 114 func TestRealNetworkCoordinator_GetCert_UnsignedCertificateError(t *testing.T) { 115 nodeRef := testutils.RandomRef() 116 certNodeRef := testutils.RandomRef() 117 118 cr := mockContractRequester(t, nodeRef, true, mockReply(t)) 119 120 ns := testutils.NewNetworkSwitcherMock(t) 121 ns.GetStateFunc = func() core.NetworkState { 122 return core.CompleteNetworkState 123 } 124 125 cm := mockCertificateManager(t, &certNodeRef, &certNodeRef, false) 126 coord := newRealNetworkCoordinator(cm, cr, nil, nil) 127 ctx := context.Background() 128 _, err := coord.GetCert(ctx, &nodeRef) 129 require.EqualError(t, err, "[ GetCert ] Couldn't create certificate: test_error") 130 } 131 132 func TestRealNetworkCoordinator_GetCert_SignCertError(t *testing.T) { 133 nodeRef := testutils.RandomRef() 134 certNodeRef := testutils.RandomRef() 135 136 cr := mockContractRequester(t, nodeRef, true, mockReply(t)) 137 138 ns := testutils.NewNetworkSwitcherMock(t) 139 ns.GetStateFunc = func() core.NetworkState { 140 return core.CompleteNetworkState 141 } 142 143 cm := mockCertificateManager(t, &certNodeRef, &certNodeRef, true) 144 cs := mockCryptographyService(t, false) 145 146 coord := newRealNetworkCoordinator(cm, cr, nil, cs) 147 ctx := context.Background() 148 _, err := coord.GetCert(ctx, &nodeRef) 149 require.EqualError(t, err, "[ GetCert ] Couldn't request cert sign: [ SignCert ] Couldn't sign: test_error") 150 } 151 152 func TestRealNetworkCoordinator_requestCertSignSelfDiscoveryNode(t *testing.T) { 153 nodeRef := testutils.RandomRef() 154 certNodeRef := testutils.RandomRef() 155 156 cr := mockContractRequester(t, nodeRef, true, mockReply(t)) 157 158 ns := testutils.NewNetworkSwitcherMock(t) 159 ns.GetStateFunc = func() core.NetworkState { 160 return core.CompleteNetworkState 161 } 162 163 mb := mockMessageBus(t, true, &nodeRef, &certNodeRef) 164 165 cm := mockCertificateManager(t, &certNodeRef, &certNodeRef, true) 166 cs := mockCryptographyService(t, true) 167 168 coord := newRealNetworkCoordinator(cm, cr, mb, cs) 169 ctx := context.Background() 170 dNode := certificate.BootstrapNode{ 171 PublicKey: "test_discovery_public_key", 172 Host: "test_discovery_host", 173 NetworkSign: []byte("test_network_sign"), 174 NodeRef: certNodeRef.String(), 175 } 176 result, err := coord.requestCertSign(ctx, &dNode, &nodeRef) 177 require.NoError(t, err) 178 require.Equal(t, []byte("test_sig"), result) 179 } 180 181 func TestRealNetworkCoordinator_requestCertSignOtherDiscoveryNode(t *testing.T) { 182 nodeRef := testutils.RandomRef() 183 certNodeRef := testutils.RandomRef() 184 discoveryNodeRef := testutils.RandomRef() 185 186 cr := mockContractRequester(t, nodeRef, true, mockReply(t)) 187 188 ns := testutils.NewNetworkSwitcherMock(t) 189 ns.GetStateFunc = func() core.NetworkState { 190 return core.CompleteNetworkState 191 } 192 193 mb := mockMessageBus(t, true, &nodeRef, &discoveryNodeRef) 194 195 cm := mockCertificateManager(t, &certNodeRef, &discoveryNodeRef, true) 196 ps := testutils.NewPulseStorageMock(t) 197 ps.CurrentFunc = func(ctx context.Context) (*core.Pulse, error) { 198 return &core.Pulse{}, nil 199 } 200 201 coord := newRealNetworkCoordinator(cm, cr, mb, nil) 202 ctx := context.Background() 203 dNode := certificate.BootstrapNode{ 204 PublicKey: "test_discovery_public_key", 205 Host: "test_discovery_host", 206 NetworkSign: []byte("test_network_sign"), 207 NodeRef: discoveryNodeRef.String(), 208 } 209 result, err := coord.requestCertSign(ctx, &dNode, &nodeRef) 210 require.NoError(t, err) 211 require.Equal(t, []byte("test_sig"), result) 212 } 213 214 func TestRealNetworkCoordinator_requestCertSignSelfDiscoveryNode_signCertError(t *testing.T) { 215 nodeRef := testutils.RandomRef() 216 certNodeRef := testutils.RandomRef() 217 218 cr := mockContractRequester(t, nodeRef, false, nil) 219 220 ns := testutils.NewNetworkSwitcherMock(t) 221 ns.GetStateFunc = func() core.NetworkState { 222 return core.CompleteNetworkState 223 } 224 225 cm := mockCertificateManager(t, &certNodeRef, &certNodeRef, true) 226 coord := newRealNetworkCoordinator(cm, cr, nil, nil) 227 ctx := context.Background() 228 dNode := certificate.BootstrapNode{ 229 PublicKey: "test_discovery_public_key", 230 Host: "test_discovery_host", 231 NetworkSign: []byte("test_network_sign"), 232 NodeRef: certNodeRef.String(), 233 } 234 _, err := coord.requestCertSign(ctx, &dNode, &nodeRef) 235 require.EqualError(t, err, "[ SignCert ] Couldn't extract response: [ GetCert ] Couldn't call GetNodeInfo: test_error") 236 } 237 238 func TestRealNetworkCoordinator_requestCertSignOtherDiscoveryNode_CurrentPulseError(t *testing.T) { 239 nodeRef := testutils.RandomRef() 240 certNodeRef := testutils.RandomRef() 241 discoveryNodeRef := testutils.RandomRef() 242 243 cr := mockContractRequester(t, nodeRef, true, mockReply(t)) 244 245 ns := testutils.NewNetworkSwitcherMock(t) 246 ns.GetStateFunc = func() core.NetworkState { 247 return core.CompleteNetworkState 248 } 249 250 mb := mockMessageBus(t, false, &nodeRef, &discoveryNodeRef) 251 cm := mockCertificateManager(t, &certNodeRef, &certNodeRef, true) 252 253 coord := newRealNetworkCoordinator(cm, cr, mb, nil) 254 ctx := context.Background() 255 dNode := certificate.BootstrapNode{ 256 PublicKey: "test_discovery_public_key", 257 Host: "test_discovery_host", 258 NetworkSign: []byte("test_network_sign"), 259 NodeRef: discoveryNodeRef.String(), 260 } 261 _, err := coord.requestCertSign(ctx, &dNode, &nodeRef) 262 require.EqualError(t, err, "test_error") 263 } 264 265 func TestRealNetworkCoordinator_requestCertSignOtherDiscoveryNode_SendError(t *testing.T) { 266 nodeRef := testutils.RandomRef() 267 certNodeRef := testutils.RandomRef() 268 discoveryNodeRef := testutils.RandomRef() 269 270 cr := mockContractRequester(t, nodeRef, true, mockReply(t)) 271 272 ns := testutils.NewNetworkSwitcherMock(t) 273 ns.GetStateFunc = func() core.NetworkState { 274 return core.CompleteNetworkState 275 } 276 277 mb := mockMessageBus(t, false, &nodeRef, &discoveryNodeRef) 278 279 cm := mockCertificateManager(t, &certNodeRef, &discoveryNodeRef, true) 280 281 ps := testutils.NewPulseStorageMock(t) 282 ps.CurrentFunc = func(ctx context.Context) (*core.Pulse, error) { 283 return &core.Pulse{}, nil 284 } 285 286 coord := newRealNetworkCoordinator(cm, cr, mb, nil) 287 ctx := context.Background() 288 dNode := certificate.BootstrapNode{ 289 PublicKey: "test_discovery_public_key", 290 Host: "test_discovery_host", 291 NetworkSign: []byte("test_network_sign"), 292 NodeRef: discoveryNodeRef.String(), 293 } 294 _, err := coord.requestCertSign(ctx, &dNode, &nodeRef) 295 require.EqualError(t, err, "test_error") 296 } 297 298 func TestRealNetworkCoordinator_signCertHandler(t *testing.T) { 299 nodeRef := testutils.RandomRef() 300 301 cr := mockContractRequester(t, nodeRef, true, mockReply(t)) 302 cs := mockCryptographyService(t, true) 303 304 coord := newRealNetworkCoordinator(nil, cr, nil, cs) 305 ctx := context.Background() 306 result, err := coord.signCertHandler(ctx, &message.Parcel{Msg: &message.NodeSignPayload{NodeRef: &nodeRef}}) 307 require.NoError(t, err) 308 require.Equal(t, []byte("test_sig"), result.(*reply.NodeSign).Sign) 309 } 310 311 func TestRealNetworkCoordinator_signCertHandler_NodeInfoError(t *testing.T) { 312 nodeRef := testutils.RandomRef() 313 314 cr := mockContractRequester(t, nodeRef, false, nil) 315 316 coord := newRealNetworkCoordinator(nil, cr, nil, nil) 317 ctx := context.Background() 318 _, err := coord.signCertHandler(ctx, &message.Parcel{Msg: &message.NodeSignPayload{NodeRef: &nodeRef}}) 319 require.EqualError(t, err, "[ SignCert ] Couldn't extract response: [ SignCert ] Couldn't extract response: [ GetCert ] Couldn't call GetNodeInfo: test_error") 320 } 321 322 func TestRealNetworkCoordinator_signCertHandler_SignError(t *testing.T) { 323 nodeRef := testutils.RandomRef() 324 325 cr := mockContractRequester(t, nodeRef, true, mockReply(t)) 326 cs := mockCryptographyService(t, false) 327 328 coord := newRealNetworkCoordinator(nil, cr, nil, cs) 329 ctx := context.Background() 330 _, err := coord.signCertHandler(ctx, &message.Parcel{Msg: &message.NodeSignPayload{NodeRef: &nodeRef}}) 331 require.EqualError(t, err, "[ SignCert ] Couldn't extract response: [ SignCert ] Couldn't sign: test_error") 332 } 333 334 func TestRealNetworkCoordinator_signCert(t *testing.T) { 335 nodeRef := testutils.RandomRef() 336 337 cr := mockContractRequester(t, nodeRef, true, mockReply(t)) 338 cs := mockCryptographyService(t, true) 339 340 coord := newRealNetworkCoordinator(nil, cr, nil, cs) 341 ctx := context.Background() 342 result, err := coord.signCert(ctx, &nodeRef) 343 require.NoError(t, err) 344 require.Equal(t, []byte("test_sig"), result) 345 } 346 347 func TestRealNetworkCoordinator_signCert_NodeInfoError(t *testing.T) { 348 nodeRef := testutils.RandomRef() 349 350 cr := mockContractRequester(t, nodeRef, false, nil) 351 352 coord := newRealNetworkCoordinator(nil, cr, nil, nil) 353 ctx := context.Background() 354 _, err := coord.signCert(ctx, &nodeRef) 355 require.EqualError(t, err, "[ SignCert ] Couldn't extract response: [ GetCert ] Couldn't call GetNodeInfo: test_error") 356 } 357 358 func TestRealNetworkCoordinator_signCert_SignError(t *testing.T) { 359 nodeRef := testutils.RandomRef() 360 361 cr := mockContractRequester(t, nodeRef, true, mockReply(t)) 362 cs := mockCryptographyService(t, false) 363 364 coord := newRealNetworkCoordinator(nil, cr, nil, cs) 365 ctx := context.Background() 366 _, err := coord.signCert(ctx, &nodeRef) 367 require.EqualError(t, err, "[ SignCert ] Couldn't sign: test_error") 368 } 369 370 func TestRealNetworkCoordinator_getNodeInfo(t *testing.T) { 371 nodeRef := testutils.RandomRef() 372 373 cr := mockContractRequester(t, nodeRef, true, mockReply(t)) 374 375 coord := newRealNetworkCoordinator(nil, cr, nil, nil) 376 ctx := context.Background() 377 key, role, err := coord.getNodeInfo(ctx, &nodeRef) 378 require.NoError(t, err) 379 require.Equal(t, "test_node_public_key", key) 380 require.Equal(t, "virtual", role) 381 } 382 383 func TestRealNetworkCoordinator_getNodeInfo_SendRequestError(t *testing.T) { 384 nodeRef := testutils.RandomRef() 385 386 cr := mockContractRequester(t, nodeRef, false, nil) 387 388 coord := newRealNetworkCoordinator(nil, cr, nil, nil) 389 ctx := context.Background() 390 _, _, err := coord.getNodeInfo(ctx, &nodeRef) 391 require.EqualError(t, err, "[ GetCert ] Couldn't call GetNodeInfo: test_error") 392 } 393 394 func TestRealNetworkCoordinator_getNodeInfo_ExtractError(t *testing.T) { 395 nodeRef := testutils.RandomRef() 396 397 cr := mockContractRequester(t, nodeRef, true, []byte("")) 398 399 coord := newRealNetworkCoordinator(nil, cr, nil, nil) 400 ctx := context.Background() 401 _, _, err := coord.getNodeInfo(ctx, &nodeRef) 402 require.EqualError(t, err, "[ GetCert ] Couldn't extract response: [ NodeInfoResponse ] Can't unmarshal response: [ UnMarshalResponse ]: [ Deserialize ]: EOF") 403 }