github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/p2p/simulations/connect_test.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 19:16:41</date> 10 //</624450106787106816> 11 12 13 package simulations 14 15 import ( 16 "testing" 17 18 "github.com/ethereum/go-ethereum/node" 19 "github.com/ethereum/go-ethereum/p2p/enode" 20 "github.com/ethereum/go-ethereum/p2p/simulations/adapters" 21 ) 22 23 func newTestNetwork(t *testing.T, nodeCount int) (*Network, []enode.ID) { 24 t.Helper() 25 adapter := adapters.NewSimAdapter(adapters.Services{ 26 "noopwoop": func(ctx *adapters.ServiceContext) (node.Service, error) { 27 return NewNoopService(nil), nil 28 }, 29 }) 30 31 //创建网络 32 network := NewNetwork(adapter, &NetworkConfig{ 33 DefaultService: "noopwoop", 34 }) 35 36 //创建和启动节点 37 ids := make([]enode.ID, nodeCount) 38 for i := range ids { 39 conf := adapters.RandomNodeConfig() 40 node, err := network.NewNodeWithConfig(conf) 41 if err != nil { 42 t.Fatalf("error creating node: %s", err) 43 } 44 if err := network.Start(node.ID()); err != nil { 45 t.Fatalf("error starting node: %s", err) 46 } 47 ids[i] = node.ID() 48 } 49 50 if len(network.Conns) > 0 { 51 t.Fatal("no connections should exist after just adding nodes") 52 } 53 54 return network, ids 55 } 56 57 func TestConnectToLastNode(t *testing.T) { 58 net, ids := newTestNetwork(t, 10) 59 defer net.Shutdown() 60 61 first := ids[0] 62 if err := net.ConnectToLastNode(first); err != nil { 63 t.Fatal(err) 64 } 65 66 last := ids[len(ids)-1] 67 for i, id := range ids { 68 if id == first || id == last { 69 continue 70 } 71 72 if net.GetConn(first, id) != nil { 73 t.Errorf("connection must not exist with node(ind: %v, id: %v)", i, id) 74 } 75 } 76 77 if net.GetConn(first, last) == nil { 78 t.Error("first and last node must be connected") 79 } 80 } 81 82 func TestConnectToRandomNode(t *testing.T) { 83 net, ids := newTestNetwork(t, 10) 84 defer net.Shutdown() 85 86 err := net.ConnectToRandomNode(ids[0]) 87 if err != nil { 88 t.Fatal(err) 89 } 90 91 var cc int 92 for i, a := range ids { 93 for _, b := range ids[i:] { 94 if net.GetConn(a, b) != nil { 95 cc++ 96 } 97 } 98 } 99 100 if cc != 1 { 101 t.Errorf("expected one connection, got %v", cc) 102 } 103 } 104 105 func TestConnectNodesFull(t *testing.T) { 106 tests := []struct { 107 name string 108 nodeCount int 109 }{ 110 {name: "no node", nodeCount: 0}, 111 {name: "single node", nodeCount: 1}, 112 {name: "2 nodes", nodeCount: 2}, 113 {name: "3 nodes", nodeCount: 3}, 114 {name: "even number of nodes", nodeCount: 12}, 115 {name: "odd number of nodes", nodeCount: 13}, 116 } 117 for _, test := range tests { 118 t.Run(test.name, func(t *testing.T) { 119 net, ids := newTestNetwork(t, test.nodeCount) 120 defer net.Shutdown() 121 122 err := net.ConnectNodesFull(ids) 123 if err != nil { 124 t.Fatal(err) 125 } 126 127 VerifyFull(t, net, ids) 128 }) 129 } 130 } 131 132 func TestConnectNodesChain(t *testing.T) { 133 net, ids := newTestNetwork(t, 10) 134 defer net.Shutdown() 135 136 err := net.ConnectNodesChain(ids) 137 if err != nil { 138 t.Fatal(err) 139 } 140 141 VerifyChain(t, net, ids) 142 } 143 144 func TestConnectNodesRing(t *testing.T) { 145 net, ids := newTestNetwork(t, 10) 146 defer net.Shutdown() 147 148 err := net.ConnectNodesRing(ids) 149 if err != nil { 150 t.Fatal(err) 151 } 152 153 VerifyRing(t, net, ids) 154 } 155 156 func TestConnectNodesStar(t *testing.T) { 157 net, ids := newTestNetwork(t, 10) 158 defer net.Shutdown() 159 160 pivotIndex := 2 161 162 err := net.ConnectNodesStar(ids, ids[pivotIndex]) 163 if err != nil { 164 t.Fatal(err) 165 } 166 167 VerifyStar(t, net, ids, pivotIndex) 168 } 169