github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/cmd/swarm/swarm-snapshot/create_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:33</date>
    10  //</624450071856943104>
    11  
    12  
    13  package main
    14  
    15  import (
    16  	"encoding/json"
    17  	"fmt"
    18  	"io/ioutil"
    19  	"os"
    20  	"runtime"
    21  	"sort"
    22  	"strconv"
    23  	"strings"
    24  	"testing"
    25  
    26  	"github.com/ethereum/go-ethereum/p2p/simulations"
    27  )
    28  
    29  //testsnapshotcreate是一个高级别的e2e测试,用于测试快照生成。
    30  //它运行一些带有不同标志值和生成的加载的“创建”命令
    31  //快照文件以验证其内容。
    32  func TestSnapshotCreate(t *testing.T) {
    33  	if runtime.GOOS == "windows" {
    34  		t.Skip()
    35  	}
    36  
    37  	for _, v := range []struct {
    38  		name     string
    39  		nodes    int
    40  		services string
    41  	}{
    42  		{
    43  			name: "defaults",
    44  		},
    45  		{
    46  			name:  "more nodes",
    47  			nodes: defaultNodes + 5,
    48  		},
    49  		{
    50  			name:     "services",
    51  			services: "stream,pss,zorglub",
    52  		},
    53  		{
    54  			name:     "services with bzz",
    55  			services: "bzz,pss",
    56  		},
    57  	} {
    58  		t.Run(v.name, func(t *testing.T) {
    59  			t.Parallel()
    60  
    61  			file, err := ioutil.TempFile("", "swarm-snapshot")
    62  			if err != nil {
    63  				t.Fatal(err)
    64  			}
    65  			defer os.Remove(file.Name())
    66  
    67  			if err = file.Close(); err != nil {
    68  				t.Error(err)
    69  			}
    70  
    71  			args := []string{"create"}
    72  			if v.nodes > 0 {
    73  				args = append(args, "--nodes", strconv.Itoa(v.nodes))
    74  			}
    75  			if v.services != "" {
    76  				args = append(args, "--services", v.services)
    77  			}
    78  			testCmd := runSnapshot(t, append(args, file.Name())...)
    79  
    80  			testCmd.ExpectExit()
    81  			if code := testCmd.ExitStatus(); code != 0 {
    82  				t.Fatalf("command exit code %v, expected 0", code)
    83  			}
    84  
    85  			f, err := os.Open(file.Name())
    86  			if err != nil {
    87  				t.Fatal(err)
    88  			}
    89  			defer func() {
    90  				err := f.Close()
    91  				if err != nil {
    92  					t.Error("closing snapshot file", "err", err)
    93  				}
    94  			}()
    95  
    96  			b, err := ioutil.ReadAll(f)
    97  			if err != nil {
    98  				t.Fatal(err)
    99  			}
   100  			var snap simulations.Snapshot
   101  			err = json.Unmarshal(b, &snap)
   102  			if err != nil {
   103  				t.Fatal(err)
   104  			}
   105  
   106  			wantNodes := v.nodes
   107  			if wantNodes == 0 {
   108  				wantNodes = defaultNodes
   109  			}
   110  			gotNodes := len(snap.Nodes)
   111  			if gotNodes != wantNodes {
   112  				t.Errorf("got %v nodes, want %v", gotNodes, wantNodes)
   113  			}
   114  
   115  			if len(snap.Conns) == 0 {
   116  				t.Error("no connections in a snapshot")
   117  			}
   118  
   119  			var wantServices []string
   120  			if v.services != "" {
   121  				wantServices = strings.Split(v.services, ",")
   122  			} else {
   123  				wantServices = []string{"bzz"}
   124  			}
   125  //对服务名进行排序,以便进行比较
   126  //作为每个节点排序服务的字符串
   127  			sort.Strings(wantServices)
   128  
   129  			for i, n := range snap.Nodes {
   130  				gotServices := n.Node.Config.Services
   131  				sort.Strings(gotServices)
   132  				if fmt.Sprint(gotServices) != fmt.Sprint(wantServices) {
   133  					t.Errorf("got services %v for node %v, want %v", gotServices, i, wantServices)
   134  				}
   135  			}
   136  
   137  		})
   138  	}
   139  }
   140