github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/node/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  //版权所有2015 Go Ethereum作者
    10  //此文件是Go以太坊库的一部分。
    11  //
    12  //Go-Ethereum库是免费软件:您可以重新分发它和/或修改
    13  //根据GNU发布的较低通用公共许可证的条款
    14  //自由软件基金会,或者许可证的第3版,或者
    15  //(由您选择)任何更高版本。
    16  //
    17  //Go以太坊图书馆的发行目的是希望它会有用,
    18  //但没有任何保证;甚至没有
    19  //适销性或特定用途的适用性。见
    20  //GNU较低的通用公共许可证,了解更多详细信息。
    21  //
    22  //你应该收到一份GNU较低级别的公共许可证副本
    23  //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。
    24  
    25  package node
    26  
    27  import (
    28  	"bytes"
    29  	"io/ioutil"
    30  	"os"
    31  	"path/filepath"
    32  	"runtime"
    33  	"testing"
    34  
    35  	"github.com/ethereum/go-ethereum/crypto"
    36  	"github.com/ethereum/go-ethereum/p2p"
    37  )
    38  
    39  //可以成功创建datadir的测试,是否可以手动配置
    40  //或自动生成的临时文件。
    41  func TestDatadirCreation(t *testing.T) {
    42  //创建一个临时数据目录,并检查它是否可由节点使用
    43  	dir, err := ioutil.TempDir("", "")
    44  	if err != nil {
    45  		t.Fatalf("failed to create manual data dir: %v", err)
    46  	}
    47  	defer os.RemoveAll(dir)
    48  
    49  	if _, err := New(&Config{DataDir: dir}); err != nil {
    50  		t.Fatalf("failed to create stack with existing datadir: %v", err)
    51  	}
    52  //生成一个长的不存在的datadir路径,并检查它是否由节点创建。
    53  	dir = filepath.Join(dir, "a", "b", "c", "d", "e", "f")
    54  	if _, err := New(&Config{DataDir: dir}); err != nil {
    55  		t.Fatalf("failed to create stack with creatable datadir: %v", err)
    56  	}
    57  	if _, err := os.Stat(dir); err != nil {
    58  		t.Fatalf("freshly created datadir not accessible: %v", err)
    59  	}
    60  //验证不可能的datadir创建失败
    61  	file, err := ioutil.TempFile("", "")
    62  	if err != nil {
    63  		t.Fatalf("failed to create temporary file: %v", err)
    64  	}
    65  	defer os.Remove(file.Name())
    66  
    67  	dir = filepath.Join(file.Name(), "invalid/path")
    68  	if _, err := New(&Config{DataDir: dir}); err == nil {
    69  		t.Fatalf("protocol stack created with an invalid datadir")
    70  	}
    71  }
    72  
    73  //测试IPC路径是否正确解析为不同的有效终结点
    74  //平台。
    75  func TestIPCPathResolution(t *testing.T) {
    76  	var tests = []struct {
    77  		DataDir  string
    78  		IPCPath  string
    79  		Windows  bool
    80  		Endpoint string
    81  	}{
    82  		{"", "", false, ""},
    83  		{"data", "", false, ""},
    84  		{"", "geth.ipc", false, filepath.Join(os.TempDir(), "geth.ipc")},
    85  		{"data", "geth.ipc", false, "data/geth.ipc"},
    86  		{"data", "./geth.ipc", false, "./geth.ipc"},
    87  		{"data", "/geth.ipc", false, "/geth.ipc"},
    88  		{"", "", true, ``},
    89  		{"data", "", true, ``},
    90  		{"", "geth.ipc", true, `\\.\pipe\geth.ipc`},
    91  		{"data", "geth.ipc", true, `\\.\pipe\geth.ipc`},
    92  		{"data", `\\.\pipe\geth.ipc`, true, `\\.\pipe\geth.ipc`},
    93  	}
    94  	for i, test := range tests {
    95  //仅在平台/测试匹配时运行
    96  		if (runtime.GOOS == "windows") == test.Windows {
    97  			if endpoint := (&Config{DataDir: test.DataDir, IPCPath: test.IPCPath}).IPCEndpoint(); endpoint != test.Endpoint {
    98  				t.Errorf("test %d: IPC endpoint mismatch: have %s, want %s", i, endpoint, test.Endpoint)
    99  			}
   100  		}
   101  	}
   102  }
   103  
   104  //测试节点键是否可以正确创建、持久化、加载和/或生成
   105  //短暂的
   106  func TestNodeKeyPersistency(t *testing.T) {
   107  //创建临时文件夹并确保没有密钥
   108  	dir, err := ioutil.TempDir("", "node-test")
   109  	if err != nil {
   110  		t.Fatalf("failed to create temporary data directory: %v", err)
   111  	}
   112  	defer os.RemoveAll(dir)
   113  
   114  	keyfile := filepath.Join(dir, "unit-test", datadirPrivateKey)
   115  
   116  //使用预设键配置节点,并确保它不会持久化。
   117  	key, err := crypto.GenerateKey()
   118  	if err != nil {
   119  		t.Fatalf("failed to generate one-shot node key: %v", err)
   120  	}
   121  	config := &Config{Name: "unit-test", DataDir: dir, P2P: p2p.Config{PrivateKey: key}}
   122  	config.NodeKey()
   123  	if _, err := os.Stat(filepath.Join(keyfile)); err == nil {
   124  		t.Fatalf("one-shot node key persisted to data directory")
   125  	}
   126  
   127  //配置一个没有预设键的节点,并确保这一次将其持久化。
   128  	config = &Config{Name: "unit-test", DataDir: dir}
   129  	config.NodeKey()
   130  	if _, err := os.Stat(keyfile); err != nil {
   131  		t.Fatalf("node key not persisted to data directory: %v", err)
   132  	}
   133  	if _, err = crypto.LoadECDSA(keyfile); err != nil {
   134  		t.Fatalf("failed to load freshly persisted node key: %v", err)
   135  	}
   136  	blob1, err := ioutil.ReadFile(keyfile)
   137  	if err != nil {
   138  		t.Fatalf("failed to read freshly persisted node key: %v", err)
   139  	}
   140  
   141  //配置新节点并确保加载以前保存的密钥
   142  	config = &Config{Name: "unit-test", DataDir: dir}
   143  	config.NodeKey()
   144  	blob2, err := ioutil.ReadFile(filepath.Join(keyfile))
   145  	if err != nil {
   146  		t.Fatalf("failed to read previously persisted node key: %v", err)
   147  	}
   148  	if !bytes.Equal(blob1, blob2) {
   149  		t.Fatalf("persisted node key mismatch: have %x, want %x", blob2, blob1)
   150  	}
   151  
   152  //配置临时节点并确保没有密钥在本地转储
   153  	config = &Config{Name: "unit-test", DataDir: ""}
   154  	config.NodeKey()
   155  	if _, err := os.Stat(filepath.Join(".", "unit-test", datadirPrivateKey)); err == nil {
   156  		t.Fatalf("ephemeral node key persisted to disk")
   157  	}
   158  }