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