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  }