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