github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/cmd/swarm/feeds_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 //</624450070820950016> 11 12 13 package main 14 15 import ( 16 "bytes" 17 "encoding/json" 18 "io/ioutil" 19 "os" 20 "testing" 21 22 "github.com/ethereum/go-ethereum/common/hexutil" 23 "github.com/ethereum/go-ethereum/crypto" 24 "github.com/ethereum/go-ethereum/log" 25 "github.com/ethereum/go-ethereum/swarm/api" 26 swarm "github.com/ethereum/go-ethereum/swarm/api/client" 27 swarmhttp "github.com/ethereum/go-ethereum/swarm/api/http" 28 "github.com/ethereum/go-ethereum/swarm/storage/feed" 29 "github.com/ethereum/go-ethereum/swarm/storage/feed/lookup" 30 "github.com/ethereum/go-ethereum/swarm/testutil" 31 ) 32 33 func TestCLIFeedUpdate(t *testing.T) { 34 srv := swarmhttp.NewTestSwarmServer(t, func(api *api.API) swarmhttp.TestServer { 35 return swarmhttp.NewServer(api, "") 36 }, nil) 37 log.Info("starting a test swarm server") 38 defer srv.Close() 39 40 // 41 privkeyHex := "0000000000000000000000000000000000000000000000000000000000001979" 42 privKey, _ := crypto.HexToECDSA(privkeyHex) 43 address := crypto.PubkeyToAddress(privKey.PublicKey) 44 45 pkFileName := testutil.TempFileWithContent(t, privkeyHex) 46 defer os.Remove(pkFileName) 47 48 //撰写主题。我们要引用米格尔·德·塞万提斯的话 49 var topic feed.Topic 50 subject := []byte("Miguel de Cervantes") 51 copy(topic[:], subject[:]) 52 name := "quotes" 53 54 //为更新准备一些数据 55 data := []byte("En boca cerrada no entran moscas") 56 hexData := hexutil.Encode(data) 57 58 flags := []string{ 59 "--bzzapi", srv.URL, 60 "--bzzaccount", pkFileName, 61 "feed", "update", 62 "--topic", topic.Hex(), 63 "--name", name, 64 hexData} 65 66 //创建一个更新并期待一个没有错误的退出 67 log.Info("updating a feed with 'swarm feed update'") 68 cmd := runSwarm(t, flags...) 69 cmd.ExpectExit() 70 71 //现在尝试使用客户端获取更新 72 client := swarm.NewClient(srv.URL) 73 74 //创建与以前相同的主题,这次 75 //我们使用newtopic自动创建主题。 76 topic, err := feed.NewTopic(name, subject) 77 if err != nil { 78 t.Fatal(err) 79 } 80 81 //feed配置我们要查找的更新。 82 fd := feed.Feed{ 83 Topic: topic, 84 User: address, 85 } 86 87 //生成查询以获取最新更新 88 query := feed.NewQueryLatest(&fd, lookup.NoClue) 89 90 //检索内容! 91 reader, err := client.QueryFeed(query, "") 92 if err != nil { 93 t.Fatal(err) 94 } 95 96 retrieved, err := ioutil.ReadAll(reader) 97 if err != nil { 98 t.Fatal(err) 99 } 100 101 //检查我们是否检索了发送的信息 102 if !bytes.Equal(data, retrieved) { 103 t.Fatalf("Received %s, expected %s", retrieved, data) 104 } 105 106 //现在检索下一次更新的信息 107 flags = []string{ 108 "--bzzapi", srv.URL, 109 "feed", "info", 110 "--topic", topic.Hex(), 111 "--user", address.Hex(), 112 } 113 114 log.Info("getting feed info with 'swarm feed info'") 115 cmd = runSwarm(t, flags...) 116 _, matches := cmd.ExpectRegexp(`.*`) //regex hack提取stdout 117 cmd.ExpectExit() 118 119 //验证是否可以将结果反序列化为有效的JSON 120 var request feed.Request 121 err = json.Unmarshal([]byte(matches[0]), &request) 122 if err != nil { 123 t.Fatal(err) 124 } 125 126 // 127 if request.Feed != fd { 128 t.Fatalf("Expected feed to be: %s, got %s", fd, request.Feed) 129 } 130 131 // 132 flags = []string{ 133 "--bzzapi", srv.URL, 134 "--bzzaccount", pkFileName, 135 "feed", "create", 136 "--topic", topic.Hex(), 137 } 138 139 log.Info("Publishing manifest with 'swarm feed create'") 140 cmd = runSwarm(t, flags...) 141 _, matches = cmd.ExpectRegexp(`[a-f\d]{64}`) 142 cmd.ExpectExit() 143 144 manifestAddress := matches[0] // 145 146 // 147 reader, err = client.QueryFeed(nil, manifestAddress) 148 if err != nil { 149 t.Fatal(err) 150 } 151 152 retrieved, err = ioutil.ReadAll(reader) 153 if err != nil { 154 t.Fatal(err) 155 } 156 157 if !bytes.Equal(data, retrieved) { 158 t.Fatalf("Received %s, expected %s", retrieved, data) 159 } 160 161 // 162 flags = []string{ 163 "--bzzapi", srv.URL, 164 "feed", "create", 165 "--topic", topic.Hex(), 166 "--user", "0xaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", //不同用户 167 } 168 169 log.Info("Publishing manifest with 'swarm feed create' for a different user") 170 cmd = runSwarm(t, flags...) 171 _, matches = cmd.ExpectRegexp(`[a-f\d]{64}`) 172 cmd.ExpectExit() 173 174 manifestAddress = matches[0] // 175 176 // 177 flags = []string{ 178 "--bzzapi", srv.URL, 179 "--bzzaccount", pkFileName, 180 "feed", "update", 181 "--manifest", manifestAddress, 182 hexData} 183 184 // 185 log.Info("updating a feed with 'swarm feed update'") 186 cmd = runSwarm(t, flags...) 187 cmd.ExpectRegexp("Fatal:.*") //目前检测故障的最佳方法。 188 cmd.ExpectExit() 189 if cmd.ExitStatus() == 0 { 190 t.Fatal("Expected nonzero exit code when updating a manifest with the wrong user. Got 0.") 191 } 192 } 193