github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/swarm/network/simulations/overlay_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  //</624342674933026816>
    11  
    12  //
    13  //
    14  //
    15  //
    16  //
    17  //
    18  //
    19  //
    20  //
    21  //
    22  //
    23  //
    24  //
    25  //
    26  //
    27  package main
    28  
    29  import (
    30  	"context"
    31  	"encoding/json"
    32  	"fmt"
    33  	"io/ioutil"
    34  	"net/http"
    35  	"net/http/httptest"
    36  	"net/url"
    37  	"testing"
    38  	"time"
    39  
    40  	"github.com/ethereum/go-ethereum/p2p/discover"
    41  	"github.com/ethereum/go-ethereum/p2p/simulations"
    42  	"github.com/ethereum/go-ethereum/swarm/log"
    43  )
    44  
    45  var (
    46  	nodeCount = 16
    47  )
    48  
    49  //
    50  //
    51  //
    52  //
    53  //
    54  //
    55  //
    56  func TestOverlaySim(t *testing.T) {
    57  t.Skip("Test is flaky, see: https://
    58  //
    59  	log.Info("Start simulation backend")
    60  //
    61  	net := newSimulationNetwork()
    62  //
    63  	sim := newOverlaySim(net)
    64  //
    65  	srv := httptest.NewServer(sim)
    66  	defer srv.Close()
    67  
    68  	log.Debug("Http simulation server started. Start simulation network")
    69  //
    70  	resp, err := http.Post(srv.URL+"/start", "application/json", nil)
    71  	if err != nil {
    72  		t.Fatal(err)
    73  	}
    74  	defer resp.Body.Close()
    75  	if resp.StatusCode != http.StatusOK {
    76  		t.Fatalf("Expected Status Code %d, got %d", http.StatusOK, resp.StatusCode)
    77  	}
    78  
    79  	log.Debug("Start mocker")
    80  //
    81  	resp, err = http.PostForm(srv.URL+"/mocker/start",
    82  		url.Values{
    83  			"node-count":  {fmt.Sprintf("%d", nodeCount)},
    84  			"mocker-type": {simulations.GetMockerList()[0]},
    85  		})
    86  	if err != nil {
    87  		t.Fatal(err)
    88  	}
    89  	defer resp.Body.Close()
    90  	if resp.StatusCode != http.StatusOK {
    91  		reason, err := ioutil.ReadAll(resp.Body)
    92  		if err != nil {
    93  			t.Fatal(err)
    94  		}
    95  		t.Fatalf("Expected Status Code %d, got %d, response body %s", http.StatusOK, resp.StatusCode, string(reason))
    96  	}
    97  
    98  //
    99  	var upCount int
   100  	trigger := make(chan discover.NodeID)
   101  
   102  //
   103  	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
   104  	defer cancel()
   105  
   106  //
   107  	go watchSimEvents(net, ctx, trigger)
   108  
   109  //
   110  LOOP:
   111  	for {
   112  		select {
   113  		case <-trigger:
   114  //
   115  			upCount++
   116  //
   117  			if upCount == nodeCount {
   118  				break LOOP
   119  			}
   120  		case <-ctx.Done():
   121  			t.Fatalf("Timed out waiting for up events")
   122  		}
   123  
   124  	}
   125  
   126  //
   127  	log.Info("Get number of nodes")
   128  //
   129  	resp, err = http.Get(srv.URL + "/nodes")
   130  	if err != nil {
   131  		t.Fatal(err)
   132  	}
   133  
   134  	defer resp.Body.Close()
   135  	if resp.StatusCode != http.StatusOK {
   136  		t.Fatalf("err %s", resp.Status)
   137  	}
   138  	b, err := ioutil.ReadAll(resp.Body)
   139  	if err != nil {
   140  		t.Fatal(err)
   141  	}
   142  
   143  //
   144  	var nodesArr []simulations.Node
   145  	err = json.Unmarshal(b, &nodesArr)
   146  	if err != nil {
   147  		t.Fatal(err)
   148  	}
   149  
   150  //
   151  	if len(nodesArr) != nodeCount {
   152  		t.Fatal(fmt.Errorf("Expected %d number of nodes, got %d", nodeCount, len(nodesArr)))
   153  	}
   154  
   155  //
   156  //
   157  	time.Sleep(1 * time.Second)
   158  
   159  	log.Info("Stop the network")
   160  //
   161  	resp, err = http.Post(srv.URL+"/stop", "application/json", nil)
   162  	if err != nil {
   163  		t.Fatal(err)
   164  	}
   165  	defer resp.Body.Close()
   166  	if resp.StatusCode != http.StatusOK {
   167  		t.Fatalf("err %s", resp.Status)
   168  	}
   169  
   170  	log.Info("Reset the network")
   171  //
   172  	resp, err = http.Post(srv.URL+"/reset", "application/json", nil)
   173  	if err != nil {
   174  		t.Fatal(err)
   175  	}
   176  	defer resp.Body.Close()
   177  	if resp.StatusCode != http.StatusOK {
   178  		t.Fatalf("err %s", resp.Status)
   179  	}
   180  }
   181  
   182  //
   183  func watchSimEvents(net *simulations.Network, ctx context.Context, trigger chan discover.NodeID) {
   184  	events := make(chan *simulations.Event)
   185  	sub := net.Events().Subscribe(events)
   186  	defer sub.Unsubscribe()
   187  
   188  	for {
   189  		select {
   190  		case ev := <-events:
   191  //
   192  			if ev.Type == simulations.EventTypeNode {
   193  				if ev.Node.Up {
   194  					log.Debug("got node up event", "event", ev, "node", ev.Node.Config.ID)
   195  					select {
   196  					case trigger <- ev.Node.Config.ID:
   197  					case <-ctx.Done():
   198  						return
   199  					}
   200  				}
   201  			}
   202  		case <-ctx.Done():
   203  			return
   204  		}
   205  	}
   206  }
   207