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