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