github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/swarm/pss/client/client_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 //</624342677244088320> 11 12 // 13 // 14 // 15 // 16 // 17 // 18 // 19 // 20 // 21 // 22 // 23 // 24 // 25 // 26 // 27 28 package client 29 30 import ( 31 "bytes" 32 "context" 33 "flag" 34 "fmt" 35 "math/rand" 36 "os" 37 "sync" 38 "testing" 39 "time" 40 41 "github.com/ethereum/go-ethereum/common/hexutil" 42 "github.com/ethereum/go-ethereum/log" 43 "github.com/ethereum/go-ethereum/node" 44 "github.com/ethereum/go-ethereum/p2p" 45 "github.com/ethereum/go-ethereum/p2p/discover" 46 "github.com/ethereum/go-ethereum/p2p/simulations" 47 "github.com/ethereum/go-ethereum/p2p/simulations/adapters" 48 "github.com/ethereum/go-ethereum/rpc" 49 "github.com/ethereum/go-ethereum/swarm/network" 50 "github.com/ethereum/go-ethereum/swarm/pss" 51 "github.com/ethereum/go-ethereum/swarm/state" 52 whisper "github.com/ethereum/go-ethereum/whisper/whisperv5" 53 ) 54 55 type protoCtrl struct { 56 C chan bool 57 protocol *pss.Protocol 58 run func(*p2p.Peer, p2p.MsgReadWriter) error 59 } 60 61 var ( 62 debugdebugflag = flag.Bool("vv", false, "veryverbose") 63 debugflag = flag.Bool("v", false, "verbose") 64 w *whisper.Whisper 65 wapi *whisper.PublicWhisperAPI 66 // 67 psslogmain log.Logger 68 pssprotocols map[string]*protoCtrl 69 sendLimit = uint16(256) 70 ) 71 72 var services = newServices() 73 74 func init() { 75 flag.Parse() 76 rand.Seed(time.Now().Unix()) 77 78 adapters.RegisterServices(services) 79 80 loglevel := log.LvlInfo 81 if *debugflag { 82 loglevel = log.LvlDebug 83 } else if *debugdebugflag { 84 loglevel = log.LvlTrace 85 } 86 87 psslogmain = log.New("psslog", "*") 88 hs := log.StreamHandler(os.Stderr, log.TerminalFormat(true)) 89 hf := log.LvlFilterHandler(loglevel, hs) 90 h := log.CallerFileHandler(hf) 91 log.Root().SetHandler(h) 92 93 w = whisper.New(&whisper.DefaultConfig) 94 wapi = whisper.NewPublicWhisperAPI(w) 95 96 pssprotocols = make(map[string]*protoCtrl) 97 } 98 99 // 100 func TestClientHandshake(t *testing.T) { 101 sendLimit = 3 102 103 clients, err := setupNetwork(2) 104 if err != nil { 105 t.Fatal(err) 106 } 107 108 lpsc, err := NewClientWithRPC(clients[0]) 109 if err != nil { 110 t.Fatal(err) 111 } 112 rpsc, err := NewClientWithRPC(clients[1]) 113 if err != nil { 114 t.Fatal(err) 115 } 116 lpssping := &pss.Ping{ 117 OutC: make(chan bool), 118 InC: make(chan bool), 119 Pong: false, 120 } 121 rpssping := &pss.Ping{ 122 OutC: make(chan bool), 123 InC: make(chan bool), 124 Pong: false, 125 } 126 lproto := pss.NewPingProtocol(lpssping) 127 rproto := pss.NewPingProtocol(rpssping) 128 129 ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) 130 defer cancel() 131 err = lpsc.RunProtocol(ctx, lproto) 132 if err != nil { 133 t.Fatal(err) 134 } 135 err = rpsc.RunProtocol(ctx, rproto) 136 if err != nil { 137 t.Fatal(err) 138 } 139 topic := pss.PingTopic.String() 140 141 var loaddr string 142 err = clients[0].Call(&loaddr, "pss_baseAddr") 143 if err != nil { 144 t.Fatalf("rpc get node 1 baseaddr fail: %v", err) 145 } 146 var roaddr string 147 err = clients[1].Call(&roaddr, "pss_baseAddr") 148 if err != nil { 149 t.Fatalf("rpc get node 2 baseaddr fail: %v", err) 150 } 151 152 var lpubkey string 153 err = clients[0].Call(&lpubkey, "pss_getPublicKey") 154 if err != nil { 155 t.Fatalf("rpc get node 1 pubkey fail: %v", err) 156 } 157 var rpubkey string 158 err = clients[1].Call(&rpubkey, "pss_getPublicKey") 159 if err != nil { 160 t.Fatalf("rpc get node 2 pubkey fail: %v", err) 161 } 162 163 err = clients[0].Call(nil, "pss_setPeerPublicKey", rpubkey, topic, roaddr) 164 if err != nil { 165 t.Fatal(err) 166 } 167 err = clients[1].Call(nil, "pss_setPeerPublicKey", lpubkey, topic, loaddr) 168 if err != nil { 169 t.Fatal(err) 170 } 171 172 time.Sleep(time.Second) 173 174 roaddrbytes, err := hexutil.Decode(roaddr) 175 if err != nil { 176 t.Fatal(err) 177 } 178 err = lpsc.AddPssPeer(rpubkey, roaddrbytes, pss.PingProtocol) 179 if err != nil { 180 t.Fatal(err) 181 } 182 183 time.Sleep(time.Second) 184 185 for i := uint16(0); i <= sendLimit; i++ { 186 lpssping.OutC <- false 187 got := <-rpssping.InC 188 log.Warn("ok", "idx", i, "got", got) 189 time.Sleep(time.Second) 190 } 191 192 rw := lpsc.peerPool[pss.PingTopic][rpubkey] 193 lpsc.RemovePssPeer(rpubkey, pss.PingProtocol) 194 if err := rw.WriteMsg(p2p.Msg{ 195 Size: 3, 196 Payload: bytes.NewReader([]byte("foo")), 197 }); err == nil { 198 t.Fatalf("expected error on write") 199 } 200 } 201 202 func setupNetwork(numnodes int) (clients []*rpc.Client, err error) { 203 nodes := make([]*simulations.Node, numnodes) 204 clients = make([]*rpc.Client, numnodes) 205 if numnodes < 2 { 206 return nil, fmt.Errorf("Minimum two nodes in network") 207 } 208 adapter := adapters.NewSimAdapter(services) 209 net := simulations.NewNetwork(adapter, &simulations.NetworkConfig{ 210 ID: "0", 211 DefaultService: "bzz", 212 }) 213 for i := 0; i < numnodes; i++ { 214 nodeconf := adapters.RandomNodeConfig() 215 nodeconf.Services = []string{"bzz", "pss"} 216 nodes[i], err = net.NewNodeWithConfig(nodeconf) 217 if err != nil { 218 return nil, fmt.Errorf("error creating node 1: %v", err) 219 } 220 err = net.Start(nodes[i].ID()) 221 if err != nil { 222 return nil, fmt.Errorf("error starting node 1: %v", err) 223 } 224 if i > 0 { 225 err = net.Connect(nodes[i].ID(), nodes[i-1].ID()) 226 if err != nil { 227 return nil, fmt.Errorf("error connecting nodes: %v", err) 228 } 229 } 230 clients[i], err = nodes[i].Client() 231 if err != nil { 232 return nil, fmt.Errorf("create node 1 rpc client fail: %v", err) 233 } 234 } 235 if numnodes > 2 { 236 err = net.Connect(nodes[0].ID(), nodes[len(nodes)-1].ID()) 237 if err != nil { 238 return nil, fmt.Errorf("error connecting first and last nodes") 239 } 240 } 241 return clients, nil 242 } 243 244 func newServices() adapters.Services { 245 stateStore := state.NewInmemoryStore() 246 kademlias := make(map[discover.NodeID]*network.Kademlia) 247 kademlia := func(id discover.NodeID) *network.Kademlia { 248 if k, ok := kademlias[id]; ok { 249 return k 250 } 251 addr := network.NewAddrFromNodeID(id) 252 params := network.NewKadParams() 253 params.MinProxBinSize = 2 254 params.MaxBinSize = 3 255 params.MinBinSize = 1 256 params.MaxRetries = 1000 257 params.RetryExponent = 2 258 params.RetryInterval = 1000000 259 kademlias[id] = network.NewKademlia(addr.Over(), params) 260 return kademlias[id] 261 } 262 return adapters.Services{ 263 "pss": func(ctx *adapters.ServiceContext) (node.Service, error) { 264 ctxlocal, cancel := context.WithTimeout(context.Background(), time.Second) 265 defer cancel() 266 keys, err := wapi.NewKeyPair(ctxlocal) 267 privkey, err := w.GetPrivateKey(keys) 268 psparams := pss.NewPssParams().WithPrivateKey(privkey) 269 pskad := kademlia(ctx.Config.ID) 270 ps, err := pss.NewPss(pskad, psparams) 271 if err != nil { 272 return nil, err 273 } 274 pshparams := pss.NewHandshakeParams() 275 pshparams.SymKeySendLimit = sendLimit 276 err = pss.SetHandshakeController(ps, pshparams) 277 if err != nil { 278 return nil, fmt.Errorf("handshake controller fail: %v", err) 279 } 280 return ps, nil 281 }, 282 "bzz": func(ctx *adapters.ServiceContext) (node.Service, error) { 283 addr := network.NewAddrFromNodeID(ctx.Config.ID) 284 hp := network.NewHiveParams() 285 hp.Discovery = false 286 config := &network.BzzConfig{ 287 OverlayAddr: addr.Over(), 288 UnderlayAddr: addr.Under(), 289 HiveParams: hp, 290 } 291 return network.NewBzz(config, kademlia(ctx.Config.ID), stateStore, nil, nil), nil 292 }, 293 } 294 } 295 296 // 297 type testStore struct { 298 sync.Mutex 299 300 values map[string][]byte 301 } 302 303 func newTestStore() *testStore { 304 return &testStore{values: make(map[string][]byte)} 305 } 306 307 func (t *testStore) Load(key string) ([]byte, error) { 308 return nil, nil 309 } 310 311 func (t *testStore) Save(key string, v []byte) error { 312 return nil 313 } 314