github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/cmd/swarm/config_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 //版权所有2017 Go Ethereum作者 10 //此文件是Go以太坊的一部分。 11 // 12 //Go以太坊是免费软件:您可以重新发布和/或修改它 13 //根据GNU通用公共许可证的条款 14 //自由软件基金会,或者许可证的第3版,或者 15 //(由您选择)任何更高版本。 16 // 17 //Go以太坊的分布希望它会有用, 18 //但没有任何保证;甚至没有 19 //适销性或特定用途的适用性。见 20 //GNU通用公共许可证了解更多详细信息。 21 // 22 //你应该已经收到一份GNU通用公共许可证的副本 23 //一起去以太坊吧。如果没有,请参见<http://www.gnu.org/licenses/>。 24 25 package main 26 27 import ( 28 "fmt" 29 "io" 30 "io/ioutil" 31 "net" 32 "os" 33 "os/exec" 34 "testing" 35 "time" 36 37 "github.com/ethereum/go-ethereum/rpc" 38 "github.com/ethereum/go-ethereum/swarm" 39 "github.com/ethereum/go-ethereum/swarm/api" 40 41 "github.com/docker/docker/pkg/reexec" 42 ) 43 44 func TestDumpConfig(t *testing.T) { 45 swarm := runSwarm(t, "dumpconfig") 46 defaultConf := api.NewConfig() 47 out, err := tomlSettings.Marshal(&defaultConf) 48 if err != nil { 49 t.Fatal(err) 50 } 51 swarm.Expect(string(out)) 52 swarm.ExpectExit() 53 } 54 55 func TestConfigFailsSwapEnabledNoSwapApi(t *testing.T) { 56 flags := []string{ 57 fmt.Sprintf("--%s", SwarmNetworkIdFlag.Name), "42", 58 fmt.Sprintf("--%s", SwarmPortFlag.Name), "54545", 59 fmt.Sprintf("--%s", SwarmSwapEnabledFlag.Name), 60 } 61 62 swarm := runSwarm(t, flags...) 63 swarm.Expect("Fatal: " + SWARM_ERR_SWAP_SET_NO_API + "\n") 64 swarm.ExpectExit() 65 } 66 67 func TestConfigFailsNoBzzAccount(t *testing.T) { 68 flags := []string{ 69 fmt.Sprintf("--%s", SwarmNetworkIdFlag.Name), "42", 70 fmt.Sprintf("--%s", SwarmPortFlag.Name), "54545", 71 } 72 73 swarm := runSwarm(t, flags...) 74 swarm.Expect("Fatal: " + SWARM_ERR_NO_BZZACCOUNT + "\n") 75 swarm.ExpectExit() 76 } 77 78 func TestConfigCmdLineOverrides(t *testing.T) { 79 dir, err := ioutil.TempDir("", "bzztest") 80 if err != nil { 81 t.Fatal(err) 82 } 83 defer os.RemoveAll(dir) 84 85 conf, account := getTestAccount(t, dir) 86 node := &testNode{Dir: dir} 87 88 //指定端口 89 httpPort, err := assignTCPPort() 90 if err != nil { 91 t.Fatal(err) 92 } 93 94 flags := []string{ 95 fmt.Sprintf("--%s", SwarmNetworkIdFlag.Name), "42", 96 fmt.Sprintf("--%s", SwarmPortFlag.Name), httpPort, 97 fmt.Sprintf("--%s", SwarmSyncDisabledFlag.Name), 98 fmt.Sprintf("--%s", CorsStringFlag.Name), "*", 99 fmt.Sprintf("--%s", SwarmAccountFlag.Name), account.Address.String(), 100 fmt.Sprintf("--%s", SwarmDeliverySkipCheckFlag.Name), 101 fmt.Sprintf("--%s", EnsAPIFlag.Name), "", 102 "--datadir", dir, 103 "--ipcpath", conf.IPCPath, 104 } 105 node.Cmd = runSwarm(t, flags...) 106 node.Cmd.InputLine(testPassphrase) 107 defer func() { 108 if t.Failed() { 109 node.Shutdown() 110 } 111 }() 112 // 113 for start := time.Now(); time.Since(start) < 10*time.Second; time.Sleep(50 * time.Millisecond) { 114 node.Client, err = rpc.Dial(conf.IPCEndpoint()) 115 if err == nil { 116 break 117 } 118 } 119 if node.Client == nil { 120 t.Fatal(err) 121 } 122 123 // 124 var info swarm.Info 125 if err := node.Client.Call(&info, "bzz_info"); err != nil { 126 t.Fatal(err) 127 } 128 129 if info.Port != httpPort { 130 t.Fatalf("Expected port to be %s, got %s", httpPort, info.Port) 131 } 132 133 if info.NetworkID != 42 { 134 t.Fatalf("Expected network ID to be %d, got %d", 42, info.NetworkID) 135 } 136 137 if info.SyncEnabled { 138 t.Fatal("Expected Sync to be disabled, but is true") 139 } 140 141 if !info.DeliverySkipCheck { 142 t.Fatal("Expected DeliverySkipCheck to be enabled, but it is not") 143 } 144 145 if info.Cors != "*" { 146 t.Fatalf("Expected Cors flag to be set to %s, got %s", "*", info.Cors) 147 } 148 149 node.Shutdown() 150 } 151 152 func TestConfigFileOverrides(t *testing.T) { 153 154 //指定端口 155 httpPort, err := assignTCPPort() 156 if err != nil { 157 t.Fatal(err) 158 } 159 160 // 161 // 162 defaultConf := api.NewConfig() 163 // 164 defaultConf.SyncEnabled = false 165 defaultConf.DeliverySkipCheck = true 166 defaultConf.NetworkID = 54 167 defaultConf.Port = httpPort 168 defaultConf.DbCapacity = 9000000 169 defaultConf.HiveParams.KeepAliveInterval = 6000000000 170 defaultConf.Swap.Params.Strategy.AutoCashInterval = 600 * time.Second 171 // 172 // 173 out, err := tomlSettings.Marshal(&defaultConf) 174 if err != nil { 175 t.Fatalf("Error creating TOML file in TestFileOverride: %v", err) 176 } 177 //创建文件 178 f, err := ioutil.TempFile("", "testconfig.toml") 179 if err != nil { 180 t.Fatalf("Error writing TOML file in TestFileOverride: %v", err) 181 } 182 //写入文件 183 _, err = f.WriteString(string(out)) 184 if err != nil { 185 t.Fatalf("Error writing TOML file in TestFileOverride: %v", err) 186 } 187 f.Sync() 188 189 dir, err := ioutil.TempDir("", "bzztest") 190 if err != nil { 191 t.Fatal(err) 192 } 193 defer os.RemoveAll(dir) 194 conf, account := getTestAccount(t, dir) 195 node := &testNode{Dir: dir} 196 197 flags := []string{ 198 fmt.Sprintf("--%s", SwarmTomlConfigPathFlag.Name), f.Name(), 199 fmt.Sprintf("--%s", SwarmAccountFlag.Name), account.Address.String(), 200 "--ens-api", "", 201 "--ipcpath", conf.IPCPath, 202 "--datadir", dir, 203 } 204 node.Cmd = runSwarm(t, flags...) 205 node.Cmd.InputLine(testPassphrase) 206 defer func() { 207 if t.Failed() { 208 node.Shutdown() 209 } 210 }() 211 //等待节点启动 212 for start := time.Now(); time.Since(start) < 10*time.Second; time.Sleep(50 * time.Millisecond) { 213 node.Client, err = rpc.Dial(conf.IPCEndpoint()) 214 if err == nil { 215 break 216 } 217 } 218 if node.Client == nil { 219 t.Fatal(err) 220 } 221 222 // 223 var info swarm.Info 224 if err := node.Client.Call(&info, "bzz_info"); err != nil { 225 t.Fatal(err) 226 } 227 228 if info.Port != httpPort { 229 t.Fatalf("Expected port to be %s, got %s", httpPort, info.Port) 230 } 231 232 if info.NetworkID != 54 { 233 t.Fatalf("Expected network ID to be %d, got %d", 54, info.NetworkID) 234 } 235 236 if info.SyncEnabled { 237 t.Fatal("Expected Sync to be disabled, but is true") 238 } 239 240 if !info.DeliverySkipCheck { 241 t.Fatal("Expected DeliverySkipCheck to be enabled, but it is not") 242 } 243 244 if info.DbCapacity != 9000000 { 245 t.Fatalf("Expected network ID to be %d, got %d", 54, info.NetworkID) 246 } 247 248 if info.HiveParams.KeepAliveInterval != 6000000000 { 249 t.Fatalf("Expected HiveParams KeepAliveInterval to be %d, got %d", uint64(6000000000), uint64(info.HiveParams.KeepAliveInterval)) 250 } 251 252 if info.Swap.Params.Strategy.AutoCashInterval != 600*time.Second { 253 t.Fatalf("Expected SwapParams AutoCashInterval to be %ds, got %d", 600, info.Swap.Params.Strategy.AutoCashInterval) 254 } 255 256 //如果info.syncparams.keybufferresize!= 512 { 257 // 258 //} 259 260 node.Shutdown() 261 } 262 263 func TestConfigEnvVars(t *testing.T) { 264 //指定端口 265 httpPort, err := assignTCPPort() 266 if err != nil { 267 t.Fatal(err) 268 } 269 270 envVars := os.Environ() 271 envVars = append(envVars, fmt.Sprintf("%s=%s", SwarmPortFlag.EnvVar, httpPort)) 272 envVars = append(envVars, fmt.Sprintf("%s=%s", SwarmNetworkIdFlag.EnvVar, "999")) 273 envVars = append(envVars, fmt.Sprintf("%s=%s", CorsStringFlag.EnvVar, "*")) 274 envVars = append(envVars, fmt.Sprintf("%s=%s", SwarmSyncDisabledFlag.EnvVar, "true")) 275 envVars = append(envVars, fmt.Sprintf("%s=%s", SwarmDeliverySkipCheckFlag.EnvVar, "true")) 276 277 dir, err := ioutil.TempDir("", "bzztest") 278 if err != nil { 279 t.Fatal(err) 280 } 281 defer os.RemoveAll(dir) 282 conf, account := getTestAccount(t, dir) 283 node := &testNode{Dir: dir} 284 flags := []string{ 285 fmt.Sprintf("--%s", SwarmAccountFlag.Name), account.Address.String(), 286 "--ens-api", "", 287 "--datadir", dir, 288 "--ipcpath", conf.IPCPath, 289 } 290 291 //node.cmd=runswarm(t,flags…) 292 //node.cmd.cmd.env=环境变量 293 // 294 cmd := &exec.Cmd{ 295 Path: reexec.Self(), 296 Args: append([]string{"swarm-test"}, flags...), 297 Stderr: os.Stderr, 298 Stdout: os.Stdout, 299 } 300 cmd.Env = envVars 301 // 302 //如果犯错!= nIL{ 303 //致死性(Err) 304 // 305 // 306 var stdin io.WriteCloser 307 if stdin, err = cmd.StdinPipe(); err != nil { 308 t.Fatal(err) 309 } 310 if err := cmd.Start(); err != nil { 311 t.Fatal(err) 312 } 313 314 //命令输入行(testpassphrase) 315 io.WriteString(stdin, testPassphrase+"\n") 316 defer func() { 317 if t.Failed() { 318 node.Shutdown() 319 cmd.Process.Kill() 320 } 321 }() 322 //等待节点启动 323 for start := time.Now(); time.Since(start) < 10*time.Second; time.Sleep(50 * time.Millisecond) { 324 node.Client, err = rpc.Dial(conf.IPCEndpoint()) 325 if err == nil { 326 break 327 } 328 } 329 330 if node.Client == nil { 331 t.Fatal(err) 332 } 333 334 //加载信息 335 var info swarm.Info 336 if err := node.Client.Call(&info, "bzz_info"); err != nil { 337 t.Fatal(err) 338 } 339 340 if info.Port != httpPort { 341 t.Fatalf("Expected port to be %s, got %s", httpPort, info.Port) 342 } 343 344 if info.NetworkID != 999 { 345 t.Fatalf("Expected network ID to be %d, got %d", 999, info.NetworkID) 346 } 347 348 if info.Cors != "*" { 349 t.Fatalf("Expected Cors flag to be set to %s, got %s", "*", info.Cors) 350 } 351 352 if info.SyncEnabled { 353 t.Fatal("Expected Sync to be disabled, but is true") 354 } 355 356 if !info.DeliverySkipCheck { 357 t.Fatal("Expected DeliverySkipCheck to be enabled, but it is not") 358 } 359 360 node.Shutdown() 361 cmd.Process.Kill() 362 } 363 364 func TestConfigCmdLineOverridesFile(t *testing.T) { 365 366 //指定端口 367 httpPort, err := assignTCPPort() 368 if err != nil { 369 t.Fatal(err) 370 } 371 372 // 373 // 374 defaultConf := api.NewConfig() 375 // 376 defaultConf.SyncEnabled = true 377 defaultConf.NetworkID = 54 378 defaultConf.Port = "8588" 379 defaultConf.DbCapacity = 9000000 380 defaultConf.HiveParams.KeepAliveInterval = 6000000000 381 defaultConf.Swap.Params.Strategy.AutoCashInterval = 600 * time.Second 382 // 383 // 384 out, err := tomlSettings.Marshal(&defaultConf) 385 if err != nil { 386 t.Fatalf("Error creating TOML file in TestFileOverride: %v", err) 387 } 388 //写入文件 389 fname := "testconfig.toml" 390 f, err := ioutil.TempFile("", fname) 391 if err != nil { 392 t.Fatalf("Error writing TOML file in TestFileOverride: %v", err) 393 } 394 defer os.Remove(fname) 395 //写入文件 396 _, err = f.WriteString(string(out)) 397 if err != nil { 398 t.Fatalf("Error writing TOML file in TestFileOverride: %v", err) 399 } 400 f.Sync() 401 402 dir, err := ioutil.TempDir("", "bzztest") 403 if err != nil { 404 t.Fatal(err) 405 } 406 defer os.RemoveAll(dir) 407 conf, account := getTestAccount(t, dir) 408 node := &testNode{Dir: dir} 409 410 expectNetworkId := uint64(77) 411 412 flags := []string{ 413 fmt.Sprintf("--%s", SwarmNetworkIdFlag.Name), "77", 414 fmt.Sprintf("--%s", SwarmPortFlag.Name), httpPort, 415 fmt.Sprintf("--%s", SwarmSyncDisabledFlag.Name), 416 fmt.Sprintf("--%s", SwarmTomlConfigPathFlag.Name), f.Name(), 417 fmt.Sprintf("--%s", SwarmAccountFlag.Name), account.Address.String(), 418 "--ens-api", "", 419 "--datadir", dir, 420 "--ipcpath", conf.IPCPath, 421 } 422 node.Cmd = runSwarm(t, flags...) 423 node.Cmd.InputLine(testPassphrase) 424 defer func() { 425 if t.Failed() { 426 node.Shutdown() 427 } 428 }() 429 //等待节点启动 430 for start := time.Now(); time.Since(start) < 10*time.Second; time.Sleep(50 * time.Millisecond) { 431 node.Client, err = rpc.Dial(conf.IPCEndpoint()) 432 if err == nil { 433 break 434 } 435 } 436 if node.Client == nil { 437 t.Fatal(err) 438 } 439 440 //加载信息 441 var info swarm.Info 442 if err := node.Client.Call(&info, "bzz_info"); err != nil { 443 t.Fatal(err) 444 } 445 446 if info.Port != httpPort { 447 t.Fatalf("Expected port to be %s, got %s", httpPort, info.Port) 448 } 449 450 if info.NetworkID != expectNetworkId { 451 t.Fatalf("Expected network ID to be %d, got %d", expectNetworkId, info.NetworkID) 452 } 453 454 if info.SyncEnabled { 455 t.Fatal("Expected Sync to be disabled, but is true") 456 } 457 458 if info.LocalStoreParams.DbCapacity != 9000000 { 459 t.Fatalf("Expected Capacity to be %d, got %d", 9000000, info.LocalStoreParams.DbCapacity) 460 } 461 462 if info.HiveParams.KeepAliveInterval != 6000000000 { 463 t.Fatalf("Expected HiveParams KeepAliveInterval to be %d, got %d", uint64(6000000000), uint64(info.HiveParams.KeepAliveInterval)) 464 } 465 466 if info.Swap.Params.Strategy.AutoCashInterval != 600*time.Second { 467 t.Fatalf("Expected SwapParams AutoCashInterval to be %ds, got %d", 600, info.Swap.Params.Strategy.AutoCashInterval) 468 } 469 470 //如果info.syncparams.keybufferresize!= 512 { 471 //t.fatalf(“预期的info.syncparams.keybufferresize为%d,得到的是%d”,512,info.syncparams.keybufferresize) 472 //} 473 474 node.Shutdown() 475 } 476 477 func TestValidateConfig(t *testing.T) { 478 for _, c := range []struct { 479 cfg *api.Config 480 err string 481 }{ 482 { 483 cfg: &api.Config{EnsAPIs: []string{ 484 "/data/testnet/geth.ipc", 485 }}, 486 }, 487 { 488 cfg: &api.Config{EnsAPIs: []string{ 489 "http://127.0.0.1:1234“, 490 }}, 491 }, 492 { 493 cfg: &api.Config{EnsAPIs: []string{ 494 "ws://127.0.0.1:1234“, 495 }}, 496 }, 497 { 498 cfg: &api.Config{EnsAPIs: []string{ 499 "test:/data/testnet/geth.ipc", 500 }}, 501 }, 502 { 503 cfg: &api.Config{EnsAPIs: []string{ 504 "test:ws://127.0.0.1:1234“, 505 }}, 506 }, 507 { 508 cfg: &api.Config{EnsAPIs: []string{ 509 "314159265dD8dbb310642f98f50C066173C1259b@/data/testnet/geth.ipc", 510 }}, 511 }, 512 { 513 cfg: &api.Config{EnsAPIs: []string{ 514 "314159265dD8dbb310642f98f50C066173C1259b@http://127.0.0.1:1234“, 515 }}, 516 }, 517 { 518 cfg: &api.Config{EnsAPIs: []string{ 519 "314159265dD8dbb310642f98f50C066173C1259b@ws://127.0.0.1:1234“, 520 }}, 521 }, 522 { 523 cfg: &api.Config{EnsAPIs: []string{ 524 "test:314159265dD8dbb310642f98f50C066173C1259b@/data/testnet/geth.ipc", 525 }}, 526 }, 527 { 528 cfg: &api.Config{EnsAPIs: []string{ 529 "eth:314159265dD8dbb310642f98f50C066173C1259b@http://127.0.0.1:1234“, 530 }}, 531 }, 532 { 533 cfg: &api.Config{EnsAPIs: []string{ 534 "eth:314159265dD8dbb310642f98f50C066173C1259b@ws:// 535 }}, 536 }, 537 { 538 cfg: &api.Config{EnsAPIs: []string{ 539 "eth:", 540 }}, 541 err: "invalid format [tld:][contract-addr@]url for ENS API endpoint configuration \"eth:\": missing url", 542 }, 543 { 544 cfg: &api.Config{EnsAPIs: []string{ 545 "314159265dD8dbb310642f98f50C066173C1259b@", 546 }}, 547 err: "invalid format [tld:][contract-addr@]url for ENS API endpoint configuration \"314159265dD8dbb310642f98f50C066173C1259b@\": missing url", 548 }, 549 { 550 cfg: &api.Config{EnsAPIs: []string{ 551 ":314159265dD8dbb310642f98f50C066173C1259", 552 }}, 553 err: "invalid format [tld:][contract-addr@]url for ENS API endpoint configuration \":314159265dD8dbb310642f98f50C066173C1259\": missing tld", 554 }, 555 { 556 cfg: &api.Config{EnsAPIs: []string{ 557 "@/data/testnet/geth.ipc", 558 }}, 559 err: "invalid format [tld:][contract-addr@]url for ENS API endpoint configuration \"@/data/testnet/geth.ipc\": missing contract address", 560 }, 561 } { 562 err := validateConfig(c.cfg) 563 if c.err != "" && err.Error() != c.err { 564 t.Errorf("expected error %q, got %q", c.err, err) 565 } 566 if c.err == "" && err != nil { 567 t.Errorf("unexpected error %q", err) 568 } 569 } 570 } 571 572 func assignTCPPort() (string, error) { 573 l, err := net.Listen("tcp", "127.0.0.1:0") 574 if err != nil { 575 return "", err 576 } 577 l.Close() 578 _, port, err := net.SplitHostPort(l.Addr().String()) 579 if err != nil { 580 return "", err 581 } 582 return port, nil 583 }