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 }