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