github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/node/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 19:16:40</date>
    10  //</624450102127235072>
    11  
    12  
    13  package node
    14  
    15  import (
    16  	"bytes"
    17  	"io/ioutil"
    18  	"os"
    19  	"path/filepath"
    20  	"runtime"
    21  	"testing"
    22  
    23  	"github.com/ethereum/go-ethereum/crypto"
    24  	"github.com/ethereum/go-ethereum/p2p"
    25  )
    26  
    27  //可以成功创建datadir的测试,是否可以手动配置
    28  //或自动生成的临时文件。
    29  func TestDatadirCreation(t *testing.T) {
    30  //创建一个临时数据目录,并检查它是否可由节点使用
    31  	dir, err := ioutil.TempDir("", "")
    32  	if err != nil {
    33  		t.Fatalf("failed to create manual data dir: %v", err)
    34  	}
    35  	defer os.RemoveAll(dir)
    36  
    37  	if _, err := New(&Config{DataDir: dir}); err != nil {
    38  		t.Fatalf("failed to create stack with existing datadir: %v", err)
    39  	}
    40  //生成一个长的不存在的datadir路径,并检查它是否由节点创建。
    41  	dir = filepath.Join(dir, "a", "b", "c", "d", "e", "f")
    42  	if _, err := New(&Config{DataDir: dir}); err != nil {
    43  		t.Fatalf("failed to create stack with creatable datadir: %v", err)
    44  	}
    45  	if _, err := os.Stat(dir); err != nil {
    46  		t.Fatalf("freshly created datadir not accessible: %v", err)
    47  	}
    48  //验证不可能的datadir创建失败
    49  	file, err := ioutil.TempFile("", "")
    50  	if err != nil {
    51  		t.Fatalf("failed to create temporary file: %v", err)
    52  	}
    53  	defer os.Remove(file.Name())
    54  
    55  	dir = filepath.Join(file.Name(), "invalid/path")
    56  	if _, err := New(&Config{DataDir: dir}); err == nil {
    57  		t.Fatalf("protocol stack created with an invalid datadir")
    58  	}
    59  }
    60  
    61  //测试IPC路径是否正确解析为不同的有效终结点
    62  //平台。
    63  func TestIPCPathResolution(t *testing.T) {
    64  	var tests = []struct {
    65  		DataDir  string
    66  		IPCPath  string
    67  		Windows  bool
    68  		Endpoint string
    69  	}{
    70  		{"", "", false, ""},
    71  		{"data", "", false, ""},
    72  		{"", "geth.ipc", false, filepath.Join(os.TempDir(), "geth.ipc")},
    73  		{"data", "geth.ipc", false, "data/geth.ipc"},
    74  		{"data", "./geth.ipc", false, "./geth.ipc"},
    75  		{"data", "/geth.ipc", false, "/geth.ipc"},
    76  		{"", "", true, ``},
    77  		{"data", "", true, ``},
    78  		{"", "geth.ipc", true, `\\.\pipe\geth.ipc`},
    79  		{"data", "geth.ipc", true, `\\.\pipe\geth.ipc`},
    80  		{"data", `\\.\pipe\geth.ipc`, true, `\\.\pipe\geth.ipc`},
    81  	}
    82  	for i, test := range tests {
    83  //仅在平台/测试匹配时运行
    84  		if (runtime.GOOS == "windows") == test.Windows {
    85  			if endpoint := (&Config{DataDir: test.DataDir, IPCPath: test.IPCPath}).IPCEndpoint(); endpoint != test.Endpoint {
    86  				t.Errorf("test %d: IPC endpoint mismatch: have %s, want %s", i, endpoint, test.Endpoint)
    87  			}
    88  		}
    89  	}
    90  }
    91  
    92  //测试节点键是否可以正确创建、持久化、加载和/或生成
    93  //短暂的
    94  func TestNodeKeyPersistency(t *testing.T) {
    95  //创建临时文件夹并确保没有密钥
    96  	dir, err := ioutil.TempDir("", "node-test")
    97  	if err != nil {
    98  		t.Fatalf("failed to create temporary data directory: %v", err)
    99  	}
   100  	defer os.RemoveAll(dir)
   101  
   102  	keyfile := filepath.Join(dir, "unit-test", datadirPrivateKey)
   103  
   104  //使用预设键配置节点,并确保它不会持久化。
   105  	key, err := crypto.GenerateKey()
   106  	if err != nil {
   107  		t.Fatalf("failed to generate one-shot node key: %v", err)
   108  	}
   109  	config := &Config{Name: "unit-test", DataDir: dir, P2P: p2p.Config{PrivateKey: key}}
   110  	config.NodeKey()
   111  	if _, err := os.Stat(filepath.Join(keyfile)); err == nil {
   112  		t.Fatalf("one-shot node key persisted to data directory")
   113  	}
   114  
   115  //配置一个没有预设键的节点,并确保这一次将其持久化。
   116  	config = &Config{Name: "unit-test", DataDir: dir}
   117  	config.NodeKey()
   118  	if _, err := os.Stat(keyfile); err != nil {
   119  		t.Fatalf("node key not persisted to data directory: %v", err)
   120  	}
   121  	if _, err = crypto.LoadECDSA(keyfile); err != nil {
   122  		t.Fatalf("failed to load freshly persisted node key: %v", err)
   123  	}
   124  	blob1, err := ioutil.ReadFile(keyfile)
   125  	if err != nil {
   126  		t.Fatalf("failed to read freshly persisted node key: %v", err)
   127  	}
   128  
   129  //配置新节点并确保加载以前保存的密钥
   130  	config = &Config{Name: "unit-test", DataDir: dir}
   131  	config.NodeKey()
   132  	blob2, err := ioutil.ReadFile(filepath.Join(keyfile))
   133  	if err != nil {
   134  		t.Fatalf("failed to read previously persisted node key: %v", err)
   135  	}
   136  	if !bytes.Equal(blob1, blob2) {
   137  		t.Fatalf("persisted node key mismatch: have %x, want %x", blob2, blob1)
   138  	}
   139  
   140  //配置临时节点并确保没有密钥在本地转储
   141  	config = &Config{Name: "unit-test", DataDir: ""}
   142  	config.NodeKey()
   143  	if _, err := os.Stat(filepath.Join(".", "unit-test", datadirPrivateKey)); err == nil {
   144  		t.Fatalf("ephemeral node key persisted to disk")
   145  	}
   146  }
   147