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  }