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