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