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