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