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