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