github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/swarm/network/simulation/node_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:43</date>
    10  //</624450114651426816>
    11  
    12  
    13  package simulation
    14  
    15  import (
    16  	"context"
    17  	"fmt"
    18  	"sync"
    19  	"testing"
    20  	"time"
    21  
    22  	"github.com/ethereum/go-ethereum/log"
    23  	"github.com/ethereum/go-ethereum/node"
    24  	"github.com/ethereum/go-ethereum/p2p/enode"
    25  	"github.com/ethereum/go-ethereum/p2p/simulations"
    26  	"github.com/ethereum/go-ethereum/p2p/simulations/adapters"
    27  	"github.com/ethereum/go-ethereum/swarm/network"
    28  )
    29  
    30  func TestUpDownNodeIDs(t *testing.T) {
    31  	sim := New(noopServiceFuncMap)
    32  	defer sim.Close()
    33  
    34  	ids, err := sim.AddNodes(10)
    35  	if err != nil {
    36  		t.Fatal(err)
    37  	}
    38  
    39  	gotIDs := sim.NodeIDs()
    40  
    41  	if !equalNodeIDs(ids, gotIDs) {
    42  		t.Error("returned nodes are not equal to added ones")
    43  	}
    44  
    45  	stoppedIDs, err := sim.StopRandomNodes(3)
    46  	if err != nil {
    47  		t.Fatal(err)
    48  	}
    49  
    50  	gotIDs = sim.UpNodeIDs()
    51  
    52  	for _, id := range gotIDs {
    53  		if !sim.Net.GetNode(id).Up {
    54  			t.Errorf("node %s should not be down", id)
    55  		}
    56  	}
    57  
    58  	if !equalNodeIDs(ids, append(gotIDs, stoppedIDs...)) {
    59  		t.Error("returned nodes are not equal to added ones")
    60  	}
    61  
    62  	gotIDs = sim.DownNodeIDs()
    63  
    64  	for _, id := range gotIDs {
    65  		if sim.Net.GetNode(id).Up {
    66  			t.Errorf("node %s should not be up", id)
    67  		}
    68  	}
    69  
    70  	if !equalNodeIDs(stoppedIDs, gotIDs) {
    71  		t.Error("returned nodes are not equal to the stopped ones")
    72  	}
    73  }
    74  
    75  func equalNodeIDs(one, other []enode.ID) bool {
    76  	if len(one) != len(other) {
    77  		return false
    78  	}
    79  	var count int
    80  	for _, a := range one {
    81  		var found bool
    82  		for _, b := range other {
    83  			if a == b {
    84  				found = true
    85  				break
    86  			}
    87  		}
    88  		if found {
    89  			count++
    90  		} else {
    91  			return false
    92  		}
    93  	}
    94  	return count == len(one)
    95  }
    96  
    97  func TestAddNode(t *testing.T) {
    98  	sim := New(noopServiceFuncMap)
    99  	defer sim.Close()
   100  
   101  	id, err := sim.AddNode()
   102  	if err != nil {
   103  		t.Fatal(err)
   104  	}
   105  
   106  	n := sim.Net.GetNode(id)
   107  	if n == nil {
   108  		t.Fatal("node not found")
   109  	}
   110  
   111  	if !n.Up {
   112  		t.Error("node not started")
   113  	}
   114  }
   115  
   116  func TestAddNodeWithMsgEvents(t *testing.T) {
   117  	sim := New(noopServiceFuncMap)
   118  	defer sim.Close()
   119  
   120  	id, err := sim.AddNode(AddNodeWithMsgEvents(true))
   121  	if err != nil {
   122  		t.Fatal(err)
   123  	}
   124  
   125  	if !sim.Net.GetNode(id).Config.EnableMsgEvents {
   126  		t.Error("EnableMsgEvents is false")
   127  	}
   128  
   129  	id, err = sim.AddNode(AddNodeWithMsgEvents(false))
   130  	if err != nil {
   131  		t.Fatal(err)
   132  	}
   133  
   134  	if sim.Net.GetNode(id).Config.EnableMsgEvents {
   135  		t.Error("EnableMsgEvents is true")
   136  	}
   137  }
   138  
   139  func TestAddNodeWithService(t *testing.T) {
   140  	sim := New(map[string]ServiceFunc{
   141  		"noop1": noopServiceFunc,
   142  		"noop2": noopServiceFunc,
   143  	})
   144  	defer sim.Close()
   145  
   146  	id, err := sim.AddNode(AddNodeWithService("noop1"))
   147  	if err != nil {
   148  		t.Fatal(err)
   149  	}
   150  
   151  	n := sim.Net.GetNode(id).Node.(*adapters.SimNode)
   152  	if n.Service("noop1") == nil {
   153  		t.Error("service noop1 not found on node")
   154  	}
   155  	if n.Service("noop2") != nil {
   156  		t.Error("service noop2 should not be found on node")
   157  	}
   158  }
   159  
   160  func TestAddNodeMultipleServices(t *testing.T) {
   161  	sim := New(map[string]ServiceFunc{
   162  		"noop1": noopServiceFunc,
   163  		"noop2": noopService2Func,
   164  	})
   165  	defer sim.Close()
   166  
   167  	id, err := sim.AddNode()
   168  	if err != nil {
   169  		t.Fatal(err)
   170  	}
   171  
   172  	n := sim.Net.GetNode(id).Node.(*adapters.SimNode)
   173  	if n.Service("noop1") == nil {
   174  		t.Error("service noop1 not found on node")
   175  	}
   176  	if n.Service("noop2") == nil {
   177  		t.Error("service noop2 not found on node")
   178  	}
   179  }
   180  
   181  func TestAddNodeDuplicateServiceError(t *testing.T) {
   182  	sim := New(map[string]ServiceFunc{
   183  		"noop1": noopServiceFunc,
   184  		"noop2": noopServiceFunc,
   185  	})
   186  	defer sim.Close()
   187  
   188  	wantErr := "duplicate service: *simulation.noopService"
   189  	_, err := sim.AddNode()
   190  	if err.Error() != wantErr {
   191  		t.Errorf("got error %q, want %q", err, wantErr)
   192  	}
   193  }
   194  
   195  func TestAddNodes(t *testing.T) {
   196  	sim := New(noopServiceFuncMap)
   197  	defer sim.Close()
   198  
   199  	nodesCount := 12
   200  
   201  	ids, err := sim.AddNodes(nodesCount)
   202  	if err != nil {
   203  		t.Fatal(err)
   204  	}
   205  
   206  	count := len(ids)
   207  	if count != nodesCount {
   208  		t.Errorf("expected %v nodes, got %v", nodesCount, count)
   209  	}
   210  
   211  	count = len(sim.Net.GetNodes())
   212  	if count != nodesCount {
   213  		t.Errorf("expected %v nodes, got %v", nodesCount, count)
   214  	}
   215  }
   216  
   217  func TestAddNodesAndConnectFull(t *testing.T) {
   218  	sim := New(noopServiceFuncMap)
   219  	defer sim.Close()
   220  
   221  	n := 12
   222  
   223  	ids, err := sim.AddNodesAndConnectFull(n)
   224  	if err != nil {
   225  		t.Fatal(err)
   226  	}
   227  
   228  	simulations.VerifyFull(t, sim.Net, ids)
   229  }
   230  
   231  func TestAddNodesAndConnectChain(t *testing.T) {
   232  	sim := New(noopServiceFuncMap)
   233  	defer sim.Close()
   234  
   235  	_, err := sim.AddNodesAndConnectChain(12)
   236  	if err != nil {
   237  		t.Fatal(err)
   238  	}
   239  
   240  //添加另一组要测试的节点
   241  //如果连接两条链条
   242  	_, err = sim.AddNodesAndConnectChain(7)
   243  	if err != nil {
   244  		t.Fatal(err)
   245  	}
   246  
   247  	simulations.VerifyChain(t, sim.Net, sim.UpNodeIDs())
   248  }
   249  
   250  func TestAddNodesAndConnectRing(t *testing.T) {
   251  	sim := New(noopServiceFuncMap)
   252  	defer sim.Close()
   253  
   254  	ids, err := sim.AddNodesAndConnectRing(12)
   255  	if err != nil {
   256  		t.Fatal(err)
   257  	}
   258  
   259  	simulations.VerifyRing(t, sim.Net, ids)
   260  }
   261  
   262  func TestAddNodesAndConnectStar(t *testing.T) {
   263  	sim := New(noopServiceFuncMap)
   264  	defer sim.Close()
   265  
   266  	ids, err := sim.AddNodesAndConnectStar(12)
   267  	if err != nil {
   268  		t.Fatal(err)
   269  	}
   270  
   271  	simulations.VerifyStar(t, sim.Net, ids, 0)
   272  }
   273  
   274  //测试上载快照是否有效
   275  func TestUploadSnapshot(t *testing.T) {
   276  	log.Debug("Creating simulation")
   277  	s := New(map[string]ServiceFunc{
   278  		"bzz": func(ctx *adapters.ServiceContext, b *sync.Map) (node.Service, func(), error) {
   279  			addr := network.NewAddr(ctx.Config.Node())
   280  			hp := network.NewHiveParams()
   281  			hp.Discovery = false
   282  			config := &network.BzzConfig{
   283  				OverlayAddr:  addr.Over(),
   284  				UnderlayAddr: addr.Under(),
   285  				HiveParams:   hp,
   286  			}
   287  			kad := network.NewKademlia(addr.Over(), network.NewKadParams())
   288  			return network.NewBzz(config, kad, nil, nil, nil), nil, nil
   289  		},
   290  	})
   291  	defer s.Close()
   292  
   293  	nodeCount := 16
   294  	log.Debug("Uploading snapshot")
   295  	err := s.UploadSnapshot(fmt.Sprintf("../stream/testing/snapshot_%d.json", nodeCount))
   296  	if err != nil {
   297  		t.Fatalf("Error uploading snapshot to simulation network: %v", err)
   298  	}
   299  
   300  	ctx := context.Background()
   301  	log.Debug("Starting simulation...")
   302  	s.Run(ctx, func(ctx context.Context, sim *Simulation) error {
   303  		log.Debug("Checking")
   304  		nodes := sim.UpNodeIDs()
   305  		if len(nodes) != nodeCount {
   306  			t.Fatal("Simulation network node number doesn't match snapshot node number")
   307  		}
   308  		return nil
   309  	})
   310  	log.Debug("Done.")
   311  }
   312  
   313  func TestStartStopNode(t *testing.T) {
   314  	sim := New(noopServiceFuncMap)
   315  	defer sim.Close()
   316  
   317  	id, err := sim.AddNode()
   318  	if err != nil {
   319  		t.Fatal(err)
   320  	}
   321  
   322  	n := sim.Net.GetNode(id)
   323  	if n == nil {
   324  		t.Fatal("node not found")
   325  	}
   326  	if !n.Up {
   327  		t.Error("node not started")
   328  	}
   329  
   330  	err = sim.StopNode(id)
   331  	if err != nil {
   332  		t.Fatal(err)
   333  	}
   334  	if n.Up {
   335  		t.Error("node not stopped")
   336  	}
   337  
   338  //在此休眠以确保network.watchpeerevents延迟功能
   339  //在重新启动节点之前设置了“node.up=false”。
   340  //P2P/模拟/网络。go:215
   341  //
   342  //相同节点停止并再次启动,并且在启动时
   343  //WatchPeerEvents在Goroutine中启动。如果节点停止
   344  //然后很快就开始了,Goroutine可能会被安排在后面
   345  //然后启动并强制其defer函数中的“node.up=false”。
   346  //这将使测试不可靠。
   347  	time.Sleep(time.Second)
   348  
   349  	err = sim.StartNode(id)
   350  	if err != nil {
   351  		t.Fatal(err)
   352  	}
   353  	if !n.Up {
   354  		t.Error("node not started")
   355  	}
   356  }
   357  
   358  func TestStartStopRandomNode(t *testing.T) {
   359  	sim := New(noopServiceFuncMap)
   360  	defer sim.Close()
   361  
   362  	_, err := sim.AddNodes(3)
   363  	if err != nil {
   364  		t.Fatal(err)
   365  	}
   366  
   367  	id, err := sim.StopRandomNode()
   368  	if err != nil {
   369  		t.Fatal(err)
   370  	}
   371  
   372  	n := sim.Net.GetNode(id)
   373  	if n == nil {
   374  		t.Fatal("node not found")
   375  	}
   376  	if n.Up {
   377  		t.Error("node not stopped")
   378  	}
   379  
   380  	id2, err := sim.StopRandomNode()
   381  	if err != nil {
   382  		t.Fatal(err)
   383  	}
   384  
   385  //在此休眠以确保network.watchpeerevents延迟功能
   386  //在重新启动节点之前设置了“node.up=false”。
   387  //P2P/模拟/网络。go:215
   388  //
   389  //相同节点停止并再次启动,并且在启动时
   390  //WatchPeerEvents在Goroutine中启动。如果节点停止
   391  //然后很快就开始了,Goroutine可能会被安排在后面
   392  //然后启动并强制其defer函数中的“node.up=false”。
   393  //这将使测试不可靠。
   394  	time.Sleep(time.Second)
   395  
   396  	idStarted, err := sim.StartRandomNode()
   397  	if err != nil {
   398  		t.Fatal(err)
   399  	}
   400  
   401  	if idStarted != id && idStarted != id2 {
   402  		t.Error("unexpected started node ID")
   403  	}
   404  }
   405  
   406  func TestStartStopRandomNodes(t *testing.T) {
   407  	sim := New(noopServiceFuncMap)
   408  	defer sim.Close()
   409  
   410  	_, err := sim.AddNodes(10)
   411  	if err != nil {
   412  		t.Fatal(err)
   413  	}
   414  
   415  	ids, err := sim.StopRandomNodes(3)
   416  	if err != nil {
   417  		t.Fatal(err)
   418  	}
   419  
   420  	for _, id := range ids {
   421  		n := sim.Net.GetNode(id)
   422  		if n == nil {
   423  			t.Fatal("node not found")
   424  		}
   425  		if n.Up {
   426  			t.Error("node not stopped")
   427  		}
   428  	}
   429  
   430  //在此休眠以确保network.watchpeerevents延迟功能
   431  //在重新启动节点之前设置了“node.up=false”。
   432  //P2P/模拟/网络。go:215
   433  //
   434  //相同节点停止并再次启动,并且在启动时
   435  //WatchPeerEvents在Goroutine中启动。如果节点停止
   436  //然后很快就开始了,Goroutine可能会被安排在后面
   437  //然后启动并强制其defer函数中的“node.up=false”。
   438  //这将使测试不可靠。
   439  	time.Sleep(time.Second)
   440  
   441  	ids, err = sim.StartRandomNodes(2)
   442  	if err != nil {
   443  		t.Fatal(err)
   444  	}
   445  
   446  	for _, id := range ids {
   447  		n := sim.Net.GetNode(id)
   448  		if n == nil {
   449  			t.Fatal("node not found")
   450  		}
   451  		if !n.Up {
   452  			t.Error("node not started")
   453  		}
   454  	}
   455  }
   456