github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/cmd/swarm/export_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  //</624342605513101312>
    11  
    12  
    13  package main
    14  
    15  import (
    16  	"bytes"
    17  	"crypto/md5"
    18  	"crypto/rand"
    19  	"io"
    20  	"io/ioutil"
    21  	"net/http"
    22  	"os"
    23  	"strings"
    24  	"testing"
    25  
    26  	"github.com/ethereum/go-ethereum/swarm"
    27  )
    28  
    29  //testcliswarmexportimport执行以下测试:
    30  //
    31  //
    32  //三。运行本地数据存储的导出
    33  //
    34  //5。导入导出的数据存储
    35  //6。从第二个节点获取上载的随机文件
    36  func TestCLISwarmExportImport(t *testing.T) {
    37  	cluster := newTestCluster(t, 1)
    38  
    39  //
    40  	f, cleanup := generateRandomFile(t, 10000000)
    41  	defer cleanup()
    42  
    43  //用“swarm up”上传文件,并期望得到一个哈希值
    44  	up := runSwarm(t, "--bzzapi", cluster.Nodes[0].URL, "up", f.Name())
    45  	_, matches := up.ExpectRegexp(`[a-f\d]{64}`)
    46  	up.ExpectExit()
    47  	hash := matches[0]
    48  
    49  	var info swarm.Info
    50  	if err := cluster.Nodes[0].Client.Call(&info, "bzz_info"); err != nil {
    51  		t.Fatal(err)
    52  	}
    53  
    54  	cluster.Stop()
    55  	defer cluster.Cleanup()
    56  
    57  //生成export.tar
    58  	exportCmd := runSwarm(t, "db", "export", info.Path+"/chunks", info.Path+"/export.tar", strings.TrimPrefix(info.BzzKey, "0x"))
    59  	exportCmd.ExpectExit()
    60  
    61  //
    62  	cluster2 := newTestCluster(t, 1)
    63  
    64  	var info2 swarm.Info
    65  	if err := cluster2.Nodes[0].Client.Call(&info2, "bzz_info"); err != nil {
    66  		t.Fatal(err)
    67  	}
    68  
    69  //
    70  	cluster2.Stop()
    71  	defer cluster2.Cleanup()
    72  
    73  //导入export.tar
    74  	importCmd := runSwarm(t, "db", "import", info2.Path+"/chunks", info.Path+"/export.tar", strings.TrimPrefix(info2.BzzKey, "0x"))
    75  	importCmd.ExpectExit()
    76  
    77  //旋转第二个群集备份
    78  	cluster2.StartExistingNodes(t, 1, strings.TrimPrefix(info2.BzzAccount, "0x"))
    79  
    80  //尝试获取导入的文件
    81  	res, err := http.Get(cluster2.Nodes[0].URL + "/bzz:/" + hash)
    82  	if err != nil {
    83  		t.Fatal(err)
    84  	}
    85  
    86  	if res.StatusCode != 200 {
    87  		t.Fatalf("expected HTTP status %d, got %s", 200, res.Status)
    88  	}
    89  
    90  //
    91  	mustEqualFiles(t, f, res.Body)
    92  }
    93  
    94  func mustEqualFiles(t *testing.T, up io.Reader, down io.Reader) {
    95  	h := md5.New()
    96  	upLen, err := io.Copy(h, up)
    97  	if err != nil {
    98  		t.Fatal(err)
    99  	}
   100  	upHash := h.Sum(nil)
   101  	h.Reset()
   102  	downLen, err := io.Copy(h, down)
   103  	if err != nil {
   104  		t.Fatal(err)
   105  	}
   106  	downHash := h.Sum(nil)
   107  
   108  	if !bytes.Equal(upHash, downHash) || upLen != downLen {
   109  		t.Fatalf("downloaded imported file md5=%x (length %v) is not the same as the generated one mp5=%x (length %v)", downHash, downLen, upHash, upLen)
   110  	}
   111  }
   112  
   113  func generateRandomFile(t *testing.T, size int) (f *os.File, teardown func()) {
   114  //创建tmp文件
   115  	tmp, err := ioutil.TempFile("", "swarm-test")
   116  	if err != nil {
   117  		t.Fatal(err)
   118  	}
   119  
   120  //
   121  	teardown = func() {
   122  		tmp.Close()
   123  		os.Remove(tmp.Name())
   124  	}
   125  
   126  //
   127  	buf := make([]byte, 10000000)
   128  	_, err = rand.Read(buf)
   129  	if err != nil {
   130  		t.Fatal(err)
   131  	}
   132  	ioutil.WriteFile(tmp.Name(), buf, 0755)
   133  
   134  	return tmp, teardown
   135  }
   136