github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/swarm/pss/protocol_test.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  //
    10  //
    11  //
    12  //
    13  //
    14  //
    15  //
    16  //
    17  //
    18  //
    19  //
    20  //
    21  //
    22  //
    23  //
    24  
    25  package pss
    26  
    27  import (
    28  	"bytes"
    29  	"context"
    30  	"fmt"
    31  	"strconv"
    32  	"strings"
    33  	"testing"
    34  	"time"
    35  
    36  	"github.com/ethereum/go-ethereum/common"
    37  	"github.com/ethereum/go-ethereum/p2p"
    38  	"github.com/ethereum/go-ethereum/p2p/discover"
    39  	"github.com/ethereum/go-ethereum/swarm/log"
    40  )
    41  
    42  type protoCtrl struct {
    43  	C        chan bool
    44  	protocol *Protocol
    45  	run      func(*p2p.Peer, p2p.MsgReadWriter) error
    46  }
    47  
    48  //
    49  func TestProtocol(t *testing.T) {
    50  	t.Run("32", testProtocol)
    51  	t.Run("8", testProtocol)
    52  	t.Run("0", testProtocol)
    53  }
    54  
    55  func testProtocol(t *testing.T) {
    56  
    57  //
    58  	var addrsize int64
    59  	paramstring := strings.Split(t.Name(), "/")
    60  	addrsize, _ = strconv.ParseInt(paramstring[1], 10, 0)
    61  	log.Info("protocol test", "addrsize", addrsize)
    62  
    63  	topic := PingTopic.String()
    64  
    65  	clients, err := setupNetwork(2, false)
    66  	if err != nil {
    67  		t.Fatal(err)
    68  	}
    69  	var loaddrhex string
    70  	err = clients[0].Call(&loaddrhex, "pss_baseAddr")
    71  	if err != nil {
    72  		t.Fatalf("rpc get node 1 baseaddr fail: %v", err)
    73  	}
    74  	loaddrhex = loaddrhex[:2+(addrsize*2)]
    75  	var roaddrhex string
    76  	err = clients[1].Call(&roaddrhex, "pss_baseAddr")
    77  	if err != nil {
    78  		t.Fatalf("rpc get node 2 baseaddr fail: %v", err)
    79  	}
    80  	roaddrhex = roaddrhex[:2+(addrsize*2)]
    81  	lnodeinfo := &p2p.NodeInfo{}
    82  	err = clients[0].Call(&lnodeinfo, "admin_nodeInfo")
    83  	if err != nil {
    84  		t.Fatalf("rpc nodeinfo node 11 fail: %v", err)
    85  	}
    86  
    87  	var lpubkey string
    88  	err = clients[0].Call(&lpubkey, "pss_getPublicKey")
    89  	if err != nil {
    90  		t.Fatalf("rpc get node 1 pubkey fail: %v", err)
    91  	}
    92  	var rpubkey string
    93  	err = clients[1].Call(&rpubkey, "pss_getPublicKey")
    94  	if err != nil {
    95  		t.Fatalf("rpc get node 2 pubkey fail: %v", err)
    96  	}
    97  
    98  time.Sleep(time.Millisecond * 1000) //
    99  
   100  	lmsgC := make(chan APIMsg)
   101  	lctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
   102  	defer cancel()
   103  	lsub, err := clients[0].Subscribe(lctx, "pss", lmsgC, "receive", topic)
   104  	defer lsub.Unsubscribe()
   105  	rmsgC := make(chan APIMsg)
   106  	rctx, cancel := context.WithTimeout(context.Background(), time.Second*10)
   107  	defer cancel()
   108  	rsub, err := clients[1].Subscribe(rctx, "pss", rmsgC, "receive", topic)
   109  	defer rsub.Unsubscribe()
   110  
   111  //
   112  	err = clients[0].Call(nil, "pss_setPeerPublicKey", rpubkey, topic, roaddrhex)
   113  	if err != nil {
   114  		t.Fatal(err)
   115  	}
   116  	err = clients[1].Call(nil, "pss_setPeerPublicKey", lpubkey, topic, loaddrhex)
   117  	if err != nil {
   118  		t.Fatal(err)
   119  	}
   120  
   121  //
   122  nid, _ := discover.HexID("0x00") //
   123  	p := p2p.NewPeer(nid, fmt.Sprintf("%x", common.FromHex(loaddrhex)), []p2p.Cap{})
   124  	_, err = pssprotocols[lnodeinfo.ID].protocol.AddPeer(p, PingTopic, true, rpubkey)
   125  	if err != nil {
   126  		t.Fatal(err)
   127  	}
   128  
   129  //
   130  	pssprotocols[lnodeinfo.ID].C <- false
   131  	select {
   132  	case <-lmsgC:
   133  		log.Debug("lnode ok")
   134  	case cerr := <-lctx.Done():
   135  		t.Fatalf("test message timed out: %v", cerr)
   136  	}
   137  	select {
   138  	case <-rmsgC:
   139  		log.Debug("rnode ok")
   140  	case cerr := <-lctx.Done():
   141  		t.Fatalf("test message timed out: %v", cerr)
   142  	}
   143  
   144  //
   145  	pssprotocols[lnodeinfo.ID].C <- false
   146  	select {
   147  	case <-lmsgC:
   148  		log.Debug("lnode ok")
   149  	case cerr := <-lctx.Done():
   150  		t.Fatalf("test message timed out: %v", cerr)
   151  	}
   152  	select {
   153  	case <-rmsgC:
   154  		log.Debug("rnode ok")
   155  	case cerr := <-lctx.Done():
   156  		t.Fatalf("test message timed out: %v", cerr)
   157  	}
   158  	rw := pssprotocols[lnodeinfo.ID].protocol.pubKeyRWPool[rpubkey]
   159  	pssprotocols[lnodeinfo.ID].protocol.RemovePeer(true, rpubkey)
   160  	if err := rw.WriteMsg(p2p.Msg{
   161  		Size:    3,
   162  		Payload: bytes.NewReader([]byte("foo")),
   163  	}); err == nil {
   164  		t.Fatalf("expected error on write")
   165  	}
   166  }