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