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