github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/swarm/pss/protocol_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:44</date>
    10  //</624450116958294016>
    11  
    12  
    13  package pss
    14  
    15  import (
    16  	"bytes"
    17  	"context"
    18  	"fmt"
    19  	"strconv"
    20  	"strings"
    21  	"testing"
    22  	"time"
    23  
    24  	"github.com/ethereum/go-ethereum/common"
    25  	"github.com/ethereum/go-ethereum/p2p"
    26  	"github.com/ethereum/go-ethereum/p2p/enode"
    27  	"github.com/ethereum/go-ethereum/swarm/log"
    28  )
    29  
    30  type protoCtrl struct {
    31  	C        chan bool
    32  	protocol *Protocol
    33  	run      func(*p2p.Peer, p2p.MsgReadWriter) error
    34  }
    35  
    36  //PSS devp2p仿真的简单乒乓协议测试
    37  func TestProtocol(t *testing.T) {
    38  	t.Run("32", testProtocol)
    39  	t.Run("8", testProtocol)
    40  	t.Run("0", testProtocol)
    41  }
    42  
    43  func testProtocol(t *testing.T) {
    44  
    45  //地址提示大小
    46  	var addrsize int64
    47  	paramstring := strings.Split(t.Name(), "/")
    48  	addrsize, _ = strconv.ParseInt(paramstring[1], 10, 0)
    49  	log.Info("protocol test", "addrsize", addrsize)
    50  
    51  	topic := PingTopic.String()
    52  
    53  	clients, err := setupNetwork(2, false)
    54  	if err != nil {
    55  		t.Fatal(err)
    56  	}
    57  	var loaddrhex string
    58  	err = clients[0].Call(&loaddrhex, "pss_baseAddr")
    59  	if err != nil {
    60  		t.Fatalf("rpc get node 1 baseaddr fail: %v", err)
    61  	}
    62  	loaddrhex = loaddrhex[:2+(addrsize*2)]
    63  	var roaddrhex string
    64  	err = clients[1].Call(&roaddrhex, "pss_baseAddr")
    65  	if err != nil {
    66  		t.Fatalf("rpc get node 2 baseaddr fail: %v", err)
    67  	}
    68  	roaddrhex = roaddrhex[:2+(addrsize*2)]
    69  	lnodeinfo := &p2p.NodeInfo{}
    70  	err = clients[0].Call(&lnodeinfo, "admin_nodeInfo")
    71  	if err != nil {
    72  		t.Fatalf("rpc nodeinfo node 11 fail: %v", err)
    73  	}
    74  
    75  	var lpubkey string
    76  	err = clients[0].Call(&lpubkey, "pss_getPublicKey")
    77  	if err != nil {
    78  		t.Fatalf("rpc get node 1 pubkey fail: %v", err)
    79  	}
    80  	var rpubkey string
    81  	err = clients[1].Call(&rpubkey, "pss_getPublicKey")
    82  	if err != nil {
    83  		t.Fatalf("rpc get node 2 pubkey fail: %v", err)
    84  	}
    85  
    86  time.Sleep(time.Millisecond * 1000) //替换为配置单元正常代码
    87  
    88  	lmsgC := make(chan APIMsg)
    89  	lctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
    90  	defer cancel()
    91  	lsub, err := clients[0].Subscribe(lctx, "pss", lmsgC, "receive", topic, false, false)
    92  	if err != nil {
    93  		t.Fatal(err)
    94  	}
    95  	defer lsub.Unsubscribe()
    96  	rmsgC := make(chan APIMsg)
    97  	rctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
    98  	defer cancel()
    99  	rsub, err := clients[1].Subscribe(rctx, "pss", rmsgC, "receive", topic, false, false)
   100  	if err != nil {
   101  		t.Fatal(err)
   102  	}
   103  	defer rsub.Unsubscribe()
   104  
   105  //设置互惠公钥
   106  	err = clients[0].Call(nil, "pss_setPeerPublicKey", rpubkey, topic, roaddrhex)
   107  	if err != nil {
   108  		t.Fatal(err)
   109  	}
   110  	err = clients[1].Call(nil, "pss_setPeerPublicKey", lpubkey, topic, loaddrhex)
   111  	if err != nil {
   112  		t.Fatal(err)
   113  	}
   114  
   115  //在左侧添加右对等方的公钥作为协议对等方
   116  	p := p2p.NewPeer(enode.ID{}, fmt.Sprintf("%x", common.FromHex(loaddrhex)), []p2p.Cap{})
   117  	_, err = pssprotocols[lnodeinfo.ID].protocol.AddPeer(p, PingTopic, true, rpubkey)
   118  	if err != nil {
   119  		t.Fatal(err)
   120  	}
   121  
   122  //发送Ping Asym,检查交付情况
   123  	pssprotocols[lnodeinfo.ID].C <- false
   124  	select {
   125  	case <-lmsgC:
   126  		log.Debug("lnode ok")
   127  	case cerr := <-lctx.Done():
   128  		t.Fatalf("test message timed out: %v", cerr)
   129  		return
   130  	}
   131  	select {
   132  	case <-rmsgC:
   133  		log.Debug("rnode ok")
   134  	case cerr := <-lctx.Done():
   135  		t.Fatalf("test message timed out: %v", cerr)
   136  	}
   137  
   138  //发送Ping Asym,检查交付情况
   139  	pssprotocols[lnodeinfo.ID].C <- false
   140  	select {
   141  	case <-lmsgC:
   142  		log.Debug("lnode ok")
   143  	case cerr := <-lctx.Done():
   144  		t.Fatalf("test message timed out: %v", cerr)
   145  	}
   146  	select {
   147  	case <-rmsgC:
   148  		log.Debug("rnode ok")
   149  	case cerr := <-lctx.Done():
   150  		t.Fatalf("test message timed out: %v", cerr)
   151  	}
   152  	rw := pssprotocols[lnodeinfo.ID].protocol.pubKeyRWPool[rpubkey]
   153  	pssprotocols[lnodeinfo.ID].protocol.RemovePeer(true, rpubkey)
   154  	if err := rw.WriteMsg(p2p.Msg{
   155  		Size:    3,
   156  		Payload: bytes.NewReader([]byte("foo")),
   157  	}); err == nil {
   158  		t.Fatalf("expected error on write")
   159  	}
   160  }
   161