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