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 }