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 }