github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/swarm/network/simulation/node_test.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  //
    10  //
    11  //
    12  //
    13  //
    14  //
    15  //
    16  //
    17  //
    18  //
    19  //
    20  //
    21  //
    22  //
    23  //
    24  
    25  package simulation
    26  
    27  import (
    28  	"context"
    29  	"fmt"
    30  	"sync"
    31  	"testing"
    32  	"time"
    33  
    34  	"github.com/ethereum/go-ethereum/log"
    35  	"github.com/ethereum/go-ethereum/node"
    36  	"github.com/ethereum/go-ethereum/p2p/discover"
    37  	"github.com/ethereum/go-ethereum/p2p/simulations/adapters"
    38  	"github.com/ethereum/go-ethereum/swarm/network"
    39  )
    40  
    41  func TestUpDownNodeIDs(t *testing.T) {
    42  	sim := New(noopServiceFuncMap)
    43  	defer sim.Close()
    44  
    45  	ids, err := sim.AddNodes(10)
    46  	if err != nil {
    47  		t.Fatal(err)
    48  	}
    49  
    50  	gotIDs := sim.NodeIDs()
    51  
    52  	if !equalNodeIDs(ids, gotIDs) {
    53  		t.Error("returned nodes are not equal to added ones")
    54  	}
    55  
    56  	stoppedIDs, err := sim.StopRandomNodes(3)
    57  	if err != nil {
    58  		t.Fatal(err)
    59  	}
    60  
    61  	gotIDs = sim.UpNodeIDs()
    62  
    63  	for _, id := range gotIDs {
    64  		if !sim.Net.GetNode(id).Up {
    65  			t.Errorf("node %s should not be down", id)
    66  		}
    67  	}
    68  
    69  	if !equalNodeIDs(ids, append(gotIDs, stoppedIDs...)) {
    70  		t.Error("returned nodes are not equal to added ones")
    71  	}
    72  
    73  	gotIDs = sim.DownNodeIDs()
    74  
    75  	for _, id := range gotIDs {
    76  		if sim.Net.GetNode(id).Up {
    77  			t.Errorf("node %s should not be up", id)
    78  		}
    79  	}
    80  
    81  	if !equalNodeIDs(stoppedIDs, gotIDs) {
    82  		t.Error("returned nodes are not equal to the stopped ones")
    83  	}
    84  }
    85  
    86  func equalNodeIDs(one, other []discover.NodeID) bool {
    87  	if len(one) != len(other) {
    88  		return false
    89  	}
    90  	var count int
    91  	for _, a := range one {
    92  		var found bool
    93  		for _, b := range other {
    94  			if a == b {
    95  				found = true
    96  				break
    97  			}
    98  		}
    99  		if found {
   100  			count++
   101  		} else {
   102  			return false
   103  		}
   104  	}
   105  	return count == len(one)
   106  }
   107  
   108  func TestAddNode(t *testing.T) {
   109  	sim := New(noopServiceFuncMap)
   110  	defer sim.Close()
   111  
   112  	id, err := sim.AddNode()
   113  	if err != nil {
   114  		t.Fatal(err)
   115  	}
   116  
   117  	n := sim.Net.GetNode(id)
   118  	if n == nil {
   119  		t.Fatal("node not found")
   120  	}
   121  
   122  	if !n.Up {
   123  		t.Error("node not started")
   124  	}
   125  }
   126  
   127  func TestAddNodeWithMsgEvents(t *testing.T) {
   128  	sim := New(noopServiceFuncMap)
   129  	defer sim.Close()
   130  
   131  	id, err := sim.AddNode(AddNodeWithMsgEvents(true))
   132  	if err != nil {
   133  		t.Fatal(err)
   134  	}
   135  
   136  	if !sim.Net.GetNode(id).Config.EnableMsgEvents {
   137  		t.Error("EnableMsgEvents is false")
   138  	}
   139  
   140  	id, err = sim.AddNode(AddNodeWithMsgEvents(false))
   141  	if err != nil {
   142  		t.Fatal(err)
   143  	}
   144  
   145  	if sim.Net.GetNode(id).Config.EnableMsgEvents {
   146  		t.Error("EnableMsgEvents is true")
   147  	}
   148  }
   149  
   150  func TestAddNodeWithService(t *testing.T) {
   151  	sim := New(map[string]ServiceFunc{
   152  		"noop1": noopServiceFunc,
   153  		"noop2": noopServiceFunc,
   154  	})
   155  	defer sim.Close()
   156  
   157  	id, err := sim.AddNode(AddNodeWithService("noop1"))
   158  	if err != nil {
   159  		t.Fatal(err)
   160  	}
   161  
   162  	n := sim.Net.GetNode(id).Node.(*adapters.SimNode)
   163  	if n.Service("noop1") == nil {
   164  		t.Error("service noop1 not found on node")
   165  	}
   166  	if n.Service("noop2") != nil {
   167  		t.Error("service noop2 should not be found on node")
   168  	}
   169  }
   170  
   171  func TestAddNodes(t *testing.T) {
   172  	sim := New(noopServiceFuncMap)
   173  	defer sim.Close()
   174  
   175  	nodesCount := 12
   176  
   177  	ids, err := sim.AddNodes(nodesCount)
   178  	if err != nil {
   179  		t.Fatal(err)
   180  	}
   181  
   182  	count := len(ids)
   183  	if count != nodesCount {
   184  		t.Errorf("expected %v nodes, got %v", nodesCount, count)
   185  	}
   186  
   187  	count = len(sim.Net.GetNodes())
   188  	if count != nodesCount {
   189  		t.Errorf("expected %v nodes, got %v", nodesCount, count)
   190  	}
   191  }
   192  
   193  func TestAddNodesAndConnectFull(t *testing.T) {
   194  	sim := New(noopServiceFuncMap)
   195  	defer sim.Close()
   196  
   197  	n := 12
   198  
   199  	ids, err := sim.AddNodesAndConnectFull(n)
   200  	if err != nil {
   201  		t.Fatal(err)
   202  	}
   203  
   204  	testFull(t, sim, ids)
   205  }
   206  
   207  func TestAddNodesAndConnectChain(t *testing.T) {
   208  	sim := New(noopServiceFuncMap)
   209  	defer sim.Close()
   210  
   211  	_, err := sim.AddNodesAndConnectChain(12)
   212  	if err != nil {
   213  		t.Fatal(err)
   214  	}
   215  
   216  //
   217  //
   218  	_, err = sim.AddNodesAndConnectChain(7)
   219  	if err != nil {
   220  		t.Fatal(err)
   221  	}
   222  
   223  	testChain(t, sim, sim.UpNodeIDs())
   224  }
   225  
   226  func TestAddNodesAndConnectRing(t *testing.T) {
   227  	sim := New(noopServiceFuncMap)
   228  	defer sim.Close()
   229  
   230  	ids, err := sim.AddNodesAndConnectRing(12)
   231  	if err != nil {
   232  		t.Fatal(err)
   233  	}
   234  
   235  	testRing(t, sim, ids)
   236  }
   237  
   238  func TestAddNodesAndConnectStar(t *testing.T) {
   239  	sim := New(noopServiceFuncMap)
   240  	defer sim.Close()
   241  
   242  	ids, err := sim.AddNodesAndConnectStar(12)
   243  	if err != nil {
   244  		t.Fatal(err)
   245  	}
   246  
   247  	testStar(t, sim, ids, 0)
   248  }
   249  
   250  //
   251  func TestUploadSnapshot(t *testing.T) {
   252  	log.Debug("Creating simulation")
   253  	s := New(map[string]ServiceFunc{
   254  		"bzz": func(ctx *adapters.ServiceContext, b *sync.Map) (node.Service, func(), error) {
   255  			addr := network.NewAddrFromNodeID(ctx.Config.ID)
   256  			hp := network.NewHiveParams()
   257  			hp.Discovery = false
   258  			config := &network.BzzConfig{
   259  				OverlayAddr:  addr.Over(),
   260  				UnderlayAddr: addr.Under(),
   261  				HiveParams:   hp,
   262  			}
   263  			kad := network.NewKademlia(addr.Over(), network.NewKadParams())
   264  			return network.NewBzz(config, kad, nil, nil, nil), nil, nil
   265  		},
   266  	})
   267  	defer s.Close()
   268  
   269  	nodeCount := 16
   270  	log.Debug("Uploading snapshot")
   271  	err := s.UploadSnapshot(fmt.Sprintf("../stream/testing/snapshot_%d.json", nodeCount))
   272  	if err != nil {
   273  		t.Fatalf("Error uploading snapshot to simulation network: %v", err)
   274  	}
   275  
   276  	ctx := context.Background()
   277  	log.Debug("Starting simulation...")
   278  	s.Run(ctx, func(ctx context.Context, sim *Simulation) error {
   279  		log.Debug("Checking")
   280  		nodes := sim.UpNodeIDs()
   281  		if len(nodes) != nodeCount {
   282  			t.Fatal("Simulation network node number doesn't match snapshot node number")
   283  		}
   284  		return nil
   285  	})
   286  	log.Debug("Done.")
   287  }
   288  
   289  func TestPivotNode(t *testing.T) {
   290  	sim := New(noopServiceFuncMap)
   291  	defer sim.Close()
   292  
   293  	id, err := sim.AddNode()
   294  	if err != nil {
   295  		t.Fatal(err)
   296  	}
   297  
   298  	id2, err := sim.AddNode()
   299  	if err != nil {
   300  		t.Fatal(err)
   301  	}
   302  
   303  	if sim.PivotNodeID() != nil {
   304  		t.Error("expected no pivot node")
   305  	}
   306  
   307  	sim.SetPivotNode(id)
   308  
   309  	pid := sim.PivotNodeID()
   310  
   311  	if pid == nil {
   312  		t.Error("pivot node not set")
   313  	} else if *pid != id {
   314  		t.Errorf("expected pivot node %s, got %s", id, *pid)
   315  	}
   316  
   317  	sim.SetPivotNode(id2)
   318  
   319  	pid = sim.PivotNodeID()
   320  
   321  	if pid == nil {
   322  		t.Error("pivot node not set")
   323  	} else if *pid != id2 {
   324  		t.Errorf("expected pivot node %s, got %s", id2, *pid)
   325  	}
   326  }
   327  
   328  func TestStartStopNode(t *testing.T) {
   329  	sim := New(noopServiceFuncMap)
   330  	defer sim.Close()
   331  
   332  	id, err := sim.AddNode()
   333  	if err != nil {
   334  		t.Fatal(err)
   335  	}
   336  
   337  	n := sim.Net.GetNode(id)
   338  	if n == nil {
   339  		t.Fatal("node not found")
   340  	}
   341  	if !n.Up {
   342  		t.Error("node not started")
   343  	}
   344  
   345  	err = sim.StopNode(id)
   346  	if err != nil {
   347  		t.Fatal(err)
   348  	}
   349  	if n.Up {
   350  		t.Error("node not stopped")
   351  	}
   352  
   353  //
   354  //
   355  //
   356  //
   357  //
   358  //
   359  //
   360  //
   361  //
   362  	time.Sleep(time.Second)
   363  
   364  	err = sim.StartNode(id)
   365  	if err != nil {
   366  		t.Fatal(err)
   367  	}
   368  	if !n.Up {
   369  		t.Error("node not started")
   370  	}
   371  }
   372  
   373  func TestStartStopRandomNode(t *testing.T) {
   374  	sim := New(noopServiceFuncMap)
   375  	defer sim.Close()
   376  
   377  	_, err := sim.AddNodes(3)
   378  	if err != nil {
   379  		t.Fatal(err)
   380  	}
   381  
   382  	id, err := sim.StopRandomNode()
   383  	if err != nil {
   384  		t.Fatal(err)
   385  	}
   386  
   387  	n := sim.Net.GetNode(id)
   388  	if n == nil {
   389  		t.Fatal("node not found")
   390  	}
   391  	if n.Up {
   392  		t.Error("node not stopped")
   393  	}
   394  
   395  	id2, err := sim.StopRandomNode()
   396  	if err != nil {
   397  		t.Fatal(err)
   398  	}
   399  
   400  //
   401  //
   402  //
   403  //
   404  //
   405  //
   406  //
   407  //
   408  //
   409  	time.Sleep(time.Second)
   410  
   411  	idStarted, err := sim.StartRandomNode()
   412  	if err != nil {
   413  		t.Fatal(err)
   414  	}
   415  
   416  	if idStarted != id && idStarted != id2 {
   417  		t.Error("unexpected started node ID")
   418  	}
   419  }
   420  
   421  func TestStartStopRandomNodes(t *testing.T) {
   422  	sim := New(noopServiceFuncMap)
   423  	defer sim.Close()
   424  
   425  	_, err := sim.AddNodes(10)
   426  	if err != nil {
   427  		t.Fatal(err)
   428  	}
   429  
   430  	ids, err := sim.StopRandomNodes(3)
   431  	if err != nil {
   432  		t.Fatal(err)
   433  	}
   434  
   435  	for _, id := range ids {
   436  		n := sim.Net.GetNode(id)
   437  		if n == nil {
   438  			t.Fatal("node not found")
   439  		}
   440  		if n.Up {
   441  			t.Error("node not stopped")
   442  		}
   443  	}
   444  
   445  //
   446  //
   447  //
   448  //
   449  //
   450  //
   451  //
   452  //
   453  //
   454  	time.Sleep(time.Second)
   455  
   456  	ids, err = sim.StartRandomNodes(2)
   457  	if err != nil {
   458  		t.Fatal(err)
   459  	}
   460  
   461  	for _, id := range ids {
   462  		n := sim.Net.GetNode(id)
   463  		if n == nil {
   464  			t.Fatal("node not found")
   465  		}
   466  		if !n.Up {
   467  			t.Error("node not started")
   468  		}
   469  	}
   470  }