github.com/status-im/status-go@v1.1.0/node/geth_status_node_test.go (about)

     1  package node
     2  
     3  import (
     4  	"math"
     5  	"net"
     6  	"os"
     7  	"path"
     8  	"testing"
     9  	"time"
    10  
    11  	gethnode "github.com/ethereum/go-ethereum/node"
    12  	"github.com/ethereum/go-ethereum/p2p"
    13  
    14  	"github.com/stretchr/testify/require"
    15  
    16  	"github.com/status-im/status-go/params"
    17  	"github.com/status-im/status-go/t/helpers"
    18  	"github.com/status-im/status-go/t/utils"
    19  )
    20  
    21  func TestStatusNodeStart(t *testing.T) {
    22  	config, err := utils.MakeTestNodeConfigWithDataDir("", "", params.StatusChainNetworkID)
    23  	require.NoError(t, err)
    24  	n := New(nil)
    25  
    26  	// checks before node is started
    27  	require.Nil(t, n.GethNode())
    28  	require.Nil(t, n.Config())
    29  	require.Nil(t, n.RPCClient())
    30  	require.Equal(t, 0, n.PeerCount())
    31  
    32  	appDB, walletDB, stop, err := setupTestDBs()
    33  	defer func() {
    34  		err := stop()
    35  		if err != nil {
    36  			n.log.Error("stopping db", err)
    37  		}
    38  	}()
    39  	require.NoError(t, err)
    40  	n.appDB = appDB
    41  	n.walletDB = walletDB
    42  
    43  	// start node
    44  	require.NoError(t, n.Start(config, nil))
    45  
    46  	// checks after node is started
    47  	require.True(t, n.IsRunning())
    48  	require.NotNil(t, n.GethNode())
    49  	require.NotNil(t, n.Config())
    50  	require.NotNil(t, n.RPCClient())
    51  	require.Equal(t, 0, n.PeerCount())
    52  	accountManager, err := n.AccountManager()
    53  	require.Nil(t, err)
    54  	require.NotNil(t, accountManager)
    55  	// try to start already started node
    56  	require.EqualError(t, n.Start(config, nil), ErrNodeRunning.Error())
    57  
    58  	// stop node
    59  	require.NoError(t, n.Stop())
    60  	// try to stop already stopped node
    61  	require.EqualError(t, n.Stop(), ErrNoRunningNode.Error())
    62  
    63  	// checks after node is stopped
    64  	require.Nil(t, n.GethNode())
    65  	require.Nil(t, n.RPCClient())
    66  	require.Equal(t, 0, n.PeerCount())
    67  }
    68  
    69  func TestStatusNodeWithDataDir(t *testing.T) {
    70  	dir := t.TempDir()
    71  
    72  	// keystore directory
    73  	keyStoreDir := path.Join(dir, "keystore")
    74  	err := os.MkdirAll(keyStoreDir, os.ModePerm)
    75  	require.NoError(t, err)
    76  
    77  	config := params.NodeConfig{
    78  		DataDir:     dir,
    79  		KeyStoreDir: keyStoreDir,
    80  	}
    81  
    82  	n, stop1, stop2, err := createStatusNode()
    83  	defer func() {
    84  		err := stop1()
    85  		if err != nil {
    86  			n.log.Error("stopping db", err)
    87  		}
    88  	}()
    89  	defer func() {
    90  		err := stop2()
    91  		if err != nil {
    92  			n.log.Error("stopping multiaccount db", err)
    93  		}
    94  	}()
    95  	require.NoError(t, err)
    96  
    97  	require.NoError(t, n.Start(&config, nil))
    98  	require.NoError(t, n.Stop())
    99  }
   100  
   101  func TestStatusNodeAddPeer(t *testing.T) {
   102  	var err error
   103  
   104  	peer, err := gethnode.New(&gethnode.Config{
   105  		P2P: p2p.Config{
   106  			MaxPeers:    math.MaxInt32,
   107  			NoDiscovery: true,
   108  			ListenAddr:  ":0",
   109  		},
   110  		NoUSB: true,
   111  	})
   112  	require.NoError(t, err)
   113  	require.NoError(t, peer.Start())
   114  	defer func() { require.NoError(t, peer.Close()) }()
   115  	peerURL := peer.Server().Self().URLv4()
   116  
   117  	n, stop1, stop2, err := createStatusNode()
   118  	defer func() {
   119  		err := stop1()
   120  		if err != nil {
   121  			n.log.Error("stopping db", err)
   122  		}
   123  	}()
   124  	defer func() {
   125  		err := stop2()
   126  		if err != nil {
   127  			n.log.Error("stopping multiaccount db", err)
   128  		}
   129  	}()
   130  	require.NoError(t, err)
   131  
   132  	// checks before node is started
   133  	require.EqualError(t, n.AddPeer(peerURL), ErrNoRunningNode.Error())
   134  
   135  	// start status node
   136  	config := params.NodeConfig{
   137  		MaxPeers: math.MaxInt32,
   138  	}
   139  	require.NoError(t, n.Start(&config, nil))
   140  	defer func() { require.NoError(t, n.Stop()) }()
   141  
   142  	errCh := helpers.WaitForPeerAsync(n.Server(), peerURL, p2p.PeerEventTypeAdd, time.Second*5)
   143  
   144  	// checks after node is started
   145  	require.NoError(t, n.AddPeer(peerURL))
   146  	require.NoError(t, <-errCh)
   147  	require.Equal(t, 1, n.PeerCount())
   148  }
   149  
   150  func TestStatusNodeDiscoverNode(t *testing.T) {
   151  	config := params.NodeConfig{
   152  		NoDiscovery: true,
   153  		ListenAddr:  "127.0.0.1:0",
   154  	}
   155  
   156  	n, stop1, stop2, err := createStatusNode()
   157  	defer func() {
   158  		err := stop1()
   159  		if err != nil {
   160  			n.log.Error("stopping db", err)
   161  		}
   162  	}()
   163  	defer func() {
   164  		err := stop2()
   165  		if err != nil {
   166  			n.log.Error("stopping multiaccount db", err)
   167  		}
   168  	}()
   169  	require.NoError(t, err)
   170  
   171  	require.NoError(t, n.Start(&config, nil))
   172  	node, err := n.discoverNode()
   173  	require.NoError(t, err)
   174  	require.Equal(t, net.ParseIP("127.0.0.1").To4(), node.IP())
   175  
   176  	config = params.NodeConfig{
   177  		NoDiscovery:   true,
   178  		AdvertiseAddr: "127.0.0.2",
   179  		ListenAddr:    "127.0.0.1:0",
   180  	}
   181  
   182  	n1, stop11, stop12, err := createStatusNode()
   183  	defer func() {
   184  		err := stop11()
   185  		if err != nil {
   186  			n1.log.Error("stopping db", err)
   187  		}
   188  	}()
   189  	defer func() {
   190  		err := stop12()
   191  		if err != nil {
   192  			n1.log.Error("stopping multiaccount db", err)
   193  		}
   194  	}()
   195  	require.NoError(t, err)
   196  
   197  	require.NoError(t, n1.Start(&config, nil))
   198  	node, err = n1.discoverNode()
   199  	require.NoError(t, err)
   200  	require.Equal(t, net.ParseIP("127.0.0.2").To4(), node.IP())
   201  }