github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/swarm/network/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:47</date>
    10  //</624342672978481152>
    11  
    12  
    13  package network
    14  
    15  import (
    16  	"flag"
    17  	"fmt"
    18  	"os"
    19  	"sync"
    20  	"testing"
    21  
    22  	"github.com/ethereum/go-ethereum/log"
    23  	"github.com/ethereum/go-ethereum/p2p"
    24  	"github.com/ethereum/go-ethereum/p2p/discover"
    25  	"github.com/ethereum/go-ethereum/p2p/protocols"
    26  	p2ptest "github.com/ethereum/go-ethereum/p2p/testing"
    27  )
    28  
    29  const (
    30  	TestProtocolVersion   = 6
    31  	TestProtocolNetworkID = 3
    32  )
    33  
    34  var (
    35  	loglevel = flag.Int("loglevel", 2, "verbosity of logs")
    36  )
    37  
    38  func init() {
    39  	flag.Parse()
    40  	log.Root().SetHandler(log.LvlFilterHandler(log.Lvl(*loglevel), log.StreamHandler(os.Stderr, log.TerminalFormat(true))))
    41  }
    42  
    43  type testStore struct {
    44  	sync.Mutex
    45  
    46  	values map[string][]byte
    47  }
    48  
    49  func newTestStore() *testStore {
    50  	return &testStore{values: make(map[string][]byte)}
    51  }
    52  
    53  func (t *testStore) Load(key string) ([]byte, error) {
    54  	t.Lock()
    55  	defer t.Unlock()
    56  	v, ok := t.values[key]
    57  	if !ok {
    58  		return nil, fmt.Errorf("key not found: %s", key)
    59  	}
    60  	return v, nil
    61  }
    62  
    63  func (t *testStore) Save(key string, v []byte) error {
    64  	t.Lock()
    65  	defer t.Unlock()
    66  	t.values[key] = v
    67  	return nil
    68  }
    69  
    70  func HandshakeMsgExchange(lhs, rhs *HandshakeMsg, id discover.NodeID) []p2ptest.Exchange {
    71  
    72  	return []p2ptest.Exchange{
    73  		{
    74  			Expects: []p2ptest.Expect{
    75  				{
    76  					Code: 0,
    77  					Msg:  lhs,
    78  					Peer: id,
    79  				},
    80  			},
    81  		},
    82  		{
    83  			Triggers: []p2ptest.Trigger{
    84  				{
    85  					Code: 0,
    86  					Msg:  rhs,
    87  					Peer: id,
    88  				},
    89  			},
    90  		},
    91  	}
    92  }
    93  
    94  func newBzzBaseTester(t *testing.T, n int, addr *BzzAddr, spec *protocols.Spec, run func(*BzzPeer) error) *bzzTester {
    95  	cs := make(map[string]chan bool)
    96  
    97  	srv := func(p *BzzPeer) error {
    98  		defer func() {
    99  			if cs[p.ID().String()] != nil {
   100  				close(cs[p.ID().String()])
   101  			}
   102  		}()
   103  		return run(p)
   104  	}
   105  
   106  	protocol := func(p *p2p.Peer, rw p2p.MsgReadWriter) error {
   107  		return srv(&BzzPeer{
   108  			Peer:      protocols.NewPeer(p, rw, spec),
   109  			localAddr: addr,
   110  			BzzAddr:   NewAddrFromNodeID(p.ID()),
   111  		})
   112  	}
   113  
   114  	s := p2ptest.NewProtocolTester(t, NewNodeIDFromAddr(addr), n, protocol)
   115  
   116  	for _, id := range s.IDs {
   117  		cs[id.String()] = make(chan bool)
   118  	}
   119  
   120  	return &bzzTester{
   121  		addr:           addr,
   122  		ProtocolTester: s,
   123  		cs:             cs,
   124  	}
   125  }
   126  
   127  type bzzTester struct {
   128  	*p2ptest.ProtocolTester
   129  	addr *BzzAddr
   130  	cs   map[string]chan bool
   131  	bzz  *Bzz
   132  }
   133  
   134  func newBzz(addr *BzzAddr, lightNode bool) *Bzz {
   135  	config := &BzzConfig{
   136  		OverlayAddr:  addr.Over(),
   137  		UnderlayAddr: addr.Under(),
   138  		HiveParams:   NewHiveParams(),
   139  		NetworkID:    DefaultNetworkID,
   140  		LightNode:    lightNode,
   141  	}
   142  	kad := NewKademlia(addr.OAddr, NewKadParams())
   143  	bzz := NewBzz(config, kad, nil, nil, nil)
   144  	return bzz
   145  }
   146  
   147  func newBzzHandshakeTester(t *testing.T, n int, addr *BzzAddr, lightNode bool) *bzzTester {
   148  	bzz := newBzz(addr, lightNode)
   149  	pt := p2ptest.NewProtocolTester(t, NewNodeIDFromAddr(addr), n, bzz.runBzz)
   150  
   151  	return &bzzTester{
   152  		addr:           addr,
   153  		ProtocolTester: pt,
   154  		bzz:            bzz,
   155  	}
   156  }
   157  
   158  //应该在一次交换中测试握手吗?并行化
   159  func (s *bzzTester) testHandshake(lhs, rhs *HandshakeMsg, disconnects ...*p2ptest.Disconnect) error {
   160  	var peers []discover.NodeID
   161  	id := NewNodeIDFromAddr(rhs.Addr)
   162  	if len(disconnects) > 0 {
   163  		for _, d := range disconnects {
   164  			peers = append(peers, d.Peer)
   165  		}
   166  	} else {
   167  		peers = []discover.NodeID{id}
   168  	}
   169  
   170  	if err := s.TestExchanges(HandshakeMsgExchange(lhs, rhs, id)...); err != nil {
   171  		return err
   172  	}
   173  
   174  	if len(disconnects) > 0 {
   175  		return s.TestDisconnected(disconnects...)
   176  	}
   177  
   178  //如果我们不期望断开连接,请确保对等端保持连接
   179  	err := s.TestDisconnected(&p2ptest.Disconnect{
   180  		Peer:  s.IDs[0],
   181  		Error: nil,
   182  	})
   183  
   184  	if err == nil {
   185  		return fmt.Errorf("Unexpected peer disconnect")
   186  	}
   187  
   188  	if err.Error() != "timed out waiting for peers to disconnect" {
   189  		return err
   190  	}
   191  
   192  	return nil
   193  }
   194  
   195  func correctBzzHandshake(addr *BzzAddr, lightNode bool) *HandshakeMsg {
   196  	return &HandshakeMsg{
   197  		Version:   TestProtocolVersion,
   198  		NetworkID: TestProtocolNetworkID,
   199  		Addr:      addr,
   200  		LightNode: lightNode,
   201  	}
   202  }
   203  
   204  func TestBzzHandshakeNetworkIDMismatch(t *testing.T) {
   205  	lightNode := false
   206  	addr := RandomAddr()
   207  	s := newBzzHandshakeTester(t, 1, addr, lightNode)
   208  	id := s.IDs[0]
   209  
   210  	err := s.testHandshake(
   211  		correctBzzHandshake(addr, lightNode),
   212  		&HandshakeMsg{Version: TestProtocolVersion, NetworkID: 321, Addr: NewAddrFromNodeID(id)},
   213  		&p2ptest.Disconnect{Peer: id, Error: fmt.Errorf("Handshake error: Message handler error: (msg code 0): network id mismatch 321 (!= 3)")},
   214  	)
   215  
   216  	if err != nil {
   217  		t.Fatal(err)
   218  	}
   219  }
   220  
   221  func TestBzzHandshakeVersionMismatch(t *testing.T) {
   222  	lightNode := false
   223  	addr := RandomAddr()
   224  	s := newBzzHandshakeTester(t, 1, addr, lightNode)
   225  	id := s.IDs[0]
   226  
   227  	err := s.testHandshake(
   228  		correctBzzHandshake(addr, lightNode),
   229  		&HandshakeMsg{Version: 0, NetworkID: TestProtocolNetworkID, Addr: NewAddrFromNodeID(id)},
   230  		&p2ptest.Disconnect{Peer: id, Error: fmt.Errorf("Handshake error: Message handler error: (msg code 0): version mismatch 0 (!= %d)", TestProtocolVersion)},
   231  	)
   232  
   233  	if err != nil {
   234  		t.Fatal(err)
   235  	}
   236  }
   237  
   238  func TestBzzHandshakeSuccess(t *testing.T) {
   239  	lightNode := false
   240  	addr := RandomAddr()
   241  	s := newBzzHandshakeTester(t, 1, addr, lightNode)
   242  	id := s.IDs[0]
   243  
   244  	err := s.testHandshake(
   245  		correctBzzHandshake(addr, lightNode),
   246  		&HandshakeMsg{Version: TestProtocolVersion, NetworkID: TestProtocolNetworkID, Addr: NewAddrFromNodeID(id)},
   247  	)
   248  
   249  	if err != nil {
   250  		t.Fatal(err)
   251  	}
   252  }
   253  
   254  func TestBzzHandshakeLightNode(t *testing.T) {
   255  	var lightNodeTests = []struct {
   256  		name      string
   257  		lightNode bool
   258  	}{
   259  		{"on", true},
   260  		{"off", false},
   261  	}
   262  
   263  	for _, test := range lightNodeTests {
   264  		t.Run(test.name, func(t *testing.T) {
   265  			randomAddr := RandomAddr()
   266  			pt := newBzzHandshakeTester(t, 1, randomAddr, false)
   267  			id := pt.IDs[0]
   268  			addr := NewAddrFromNodeID(id)
   269  
   270  			err := pt.testHandshake(
   271  				correctBzzHandshake(randomAddr, false),
   272  				&HandshakeMsg{Version: TestProtocolVersion, NetworkID: TestProtocolNetworkID, Addr: addr, LightNode: test.lightNode},
   273  			)
   274  
   275  			if err != nil {
   276  				t.Fatal(err)
   277  			}
   278  
   279  			if pt.bzz.handshakes[id].LightNode != test.lightNode {
   280  				t.Fatalf("peer LightNode flag is %v, should be %v", pt.bzz.handshakes[id].LightNode, test.lightNode)
   281  			}
   282  		})
   283  	}
   284  }
   285