github.com/okex/exchain@v1.8.0/libs/tendermint/p2p/transport_test.go (about)

     1  package p2p
     2  
     3  import (
     4  	"fmt"
     5  	"math/rand"
     6  	"net"
     7  	"reflect"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/okex/exchain/libs/tendermint/crypto/ed25519"
    12  	"github.com/okex/exchain/libs/tendermint/p2p/conn"
    13  )
    14  
    15  var defaultNodeName = "host_peer"
    16  
    17  func emptyNodeInfo() NodeInfo {
    18  	return DefaultNodeInfo{}
    19  }
    20  
    21  // newMultiplexTransport returns a tcp connected multiplexed peer
    22  // using the default MConnConfig. It's a convenience function used
    23  // for testing.
    24  func newMultiplexTransport(
    25  	nodeInfo NodeInfo,
    26  	nodeKey NodeKey,
    27  ) *MultiplexTransport {
    28  	return NewMultiplexTransport(
    29  		nodeInfo, nodeKey, conn.DefaultMConnConfig(),
    30  	)
    31  }
    32  
    33  func TestTransportMultiplexConnFilter(t *testing.T) {
    34  	mt := newMultiplexTransport(
    35  		emptyNodeInfo(),
    36  		NodeKey{
    37  			PrivKey: ed25519.GenPrivKey(),
    38  		},
    39  	)
    40  	id := mt.nodeKey.ID()
    41  
    42  	MultiplexTransportConnFilters(
    43  		func(_ ConnSet, _ net.Conn, _ []net.IP) error { return nil },
    44  		func(_ ConnSet, _ net.Conn, _ []net.IP) error { return nil },
    45  		func(_ ConnSet, _ net.Conn, _ []net.IP) error {
    46  			return fmt.Errorf("rejected")
    47  		},
    48  	)(mt)
    49  
    50  	addr, err := NewNetAddressString(IDAddressString(id, "127.0.0.1:0"))
    51  	if err != nil {
    52  		t.Fatal(err)
    53  	}
    54  
    55  	if err := mt.Listen(*addr); err != nil {
    56  		t.Fatal(err)
    57  	}
    58  
    59  	errc := make(chan error)
    60  
    61  	go func() {
    62  		addr := NewNetAddress(id, mt.listener.Addr())
    63  
    64  		_, err := addr.Dial()
    65  		if err != nil {
    66  			errc <- err
    67  			return
    68  		}
    69  
    70  		close(errc)
    71  	}()
    72  
    73  	if err := <-errc; err != nil {
    74  		t.Errorf("connection failed: %v", err)
    75  	}
    76  
    77  	_, err = mt.Accept(peerConfig{})
    78  	if err, ok := err.(ErrRejected); ok {
    79  		if !err.IsFiltered() {
    80  			t.Errorf("expected peer to be filtered")
    81  		}
    82  	} else {
    83  		t.Errorf("expected ErrRejected")
    84  	}
    85  }
    86  
    87  func TestTransportMultiplexConnFilterTimeout(t *testing.T) {
    88  	mt := newMultiplexTransport(
    89  		emptyNodeInfo(),
    90  		NodeKey{
    91  			PrivKey: ed25519.GenPrivKey(),
    92  		},
    93  	)
    94  	id := mt.nodeKey.ID()
    95  
    96  	MultiplexTransportFilterTimeout(5 * time.Millisecond)(mt)
    97  	MultiplexTransportConnFilters(
    98  		func(_ ConnSet, _ net.Conn, _ []net.IP) error {
    99  			time.Sleep(10 * time.Millisecond)
   100  			return nil
   101  		},
   102  	)(mt)
   103  
   104  	addr, err := NewNetAddressString(IDAddressString(id, "127.0.0.1:0"))
   105  	if err != nil {
   106  		t.Fatal(err)
   107  	}
   108  
   109  	if err := mt.Listen(*addr); err != nil {
   110  		t.Fatal(err)
   111  	}
   112  
   113  	errc := make(chan error)
   114  
   115  	go func() {
   116  		addr := NewNetAddress(id, mt.listener.Addr())
   117  
   118  		_, err := addr.Dial()
   119  		if err != nil {
   120  			errc <- err
   121  			return
   122  		}
   123  
   124  		close(errc)
   125  	}()
   126  
   127  	if err := <-errc; err != nil {
   128  		t.Errorf("connection failed: %v", err)
   129  	}
   130  
   131  	_, err = mt.Accept(peerConfig{})
   132  	if _, ok := err.(ErrFilterTimeout); !ok {
   133  		t.Errorf("expected ErrFilterTimeout")
   134  	}
   135  }
   136  
   137  func TestTransportMultiplexMaxIncomingConnections(t *testing.T) {
   138  	mt := newMultiplexTransport(
   139  		emptyNodeInfo(),
   140  		NodeKey{
   141  			PrivKey: ed25519.GenPrivKey(),
   142  		},
   143  	)
   144  	id := mt.nodeKey.ID()
   145  
   146  	MultiplexTransportMaxIncomingConnections(0)(mt)
   147  
   148  	addr, err := NewNetAddressString(IDAddressString(id, "127.0.0.1:0"))
   149  	if err != nil {
   150  		t.Fatal(err)
   151  	}
   152  
   153  	if err := mt.Listen(*addr); err != nil {
   154  		t.Fatal(err)
   155  	}
   156  
   157  	errc := make(chan error)
   158  	go func() {
   159  		addr := NewNetAddress(id, mt.listener.Addr())
   160  		time.Sleep(300 * time.Millisecond)
   161  		_, err := addr.Dial()
   162  		if err != nil {
   163  			errc <- err
   164  			return
   165  		}
   166  		close(errc)
   167  	}()
   168  
   169  	if err := <-errc; err != nil {
   170  		t.Errorf("connection failed: %v", err)
   171  	}
   172  
   173  	_, err = mt.Accept(peerConfig{})
   174  	if err == nil {
   175  		t.Errorf("expected connection reset by peer error, got nil")
   176  	}
   177  }
   178  
   179  func TestTransportMultiplexAcceptMultiple(t *testing.T) {
   180  	mt := testSetupMultiplexTransport(t)
   181  	laddr := NewNetAddress(mt.nodeKey.ID(), mt.listener.Addr())
   182  
   183  	var (
   184  		seed     = rand.New(rand.NewSource(time.Now().UnixNano()))
   185  		nDialers = seed.Intn(64) + 64
   186  		errc     = make(chan error, nDialers)
   187  	)
   188  
   189  	// Setup dialers.
   190  	for i := 0; i < nDialers; i++ {
   191  		go testDialer(*laddr, errc)
   192  	}
   193  
   194  	// Catch connection errors.
   195  	for i := 0; i < nDialers; i++ {
   196  		if err := <-errc; err != nil {
   197  			t.Fatal(err)
   198  		}
   199  	}
   200  
   201  	ps := []Peer{}
   202  
   203  	// Accept all peers.
   204  	for i := 0; i < cap(errc); i++ {
   205  		p, err := mt.Accept(peerConfig{})
   206  		if err != nil {
   207  			t.Fatal(err)
   208  		}
   209  
   210  		if err := p.Start(); err != nil {
   211  			t.Fatal(err)
   212  		}
   213  
   214  		ps = append(ps, p)
   215  	}
   216  
   217  	if have, want := len(ps), cap(errc); have != want {
   218  		t.Errorf("have %v, want %v", have, want)
   219  	}
   220  
   221  	// Stop all peers.
   222  	for _, p := range ps {
   223  		if err := p.Stop(); err != nil {
   224  			t.Fatal(err)
   225  		}
   226  	}
   227  
   228  	if err := mt.Close(); err != nil {
   229  		t.Errorf("close errored: %v", err)
   230  	}
   231  }
   232  
   233  func testDialer(dialAddr NetAddress, errc chan error) {
   234  	var (
   235  		pv     = ed25519.GenPrivKey()
   236  		dialer = newMultiplexTransport(
   237  			testNodeInfo(PubKeyToID(pv.PubKey()), defaultNodeName),
   238  			NodeKey{
   239  				PrivKey: pv,
   240  			},
   241  		)
   242  	)
   243  
   244  	_, err := dialer.Dial(dialAddr, peerConfig{})
   245  	if err != nil {
   246  		errc <- err
   247  		return
   248  	}
   249  
   250  	// Signal that the connection was established.
   251  	errc <- nil
   252  }
   253  
   254  func TestTransportMultiplexAcceptNonBlocking(t *testing.T) {
   255  	mt := testSetupMultiplexTransport(t)
   256  
   257  	var (
   258  		fastNodePV   = ed25519.GenPrivKey()
   259  		fastNodeInfo = testNodeInfo(PubKeyToID(fastNodePV.PubKey()), "fastnode")
   260  		done         = make(chan error)
   261  		fastc        = make(chan struct{})
   262  		slowc        = make(chan struct{})
   263  	)
   264  
   265  	// Simulate slow Peer.
   266  	go func() {
   267  		addr := NewNetAddress(mt.nodeKey.ID(), mt.listener.Addr())
   268  
   269  		c, err := addr.Dial()
   270  		if err != nil {
   271  			t.Errorf("slow_peer dial err, err: %s", err.Error())
   272  			return
   273  		}
   274  
   275  		close(slowc)
   276  
   277  		select {
   278  		case <-fastc:
   279  			// Fast peer connected.
   280  		case <-time.After(500 * time.Millisecond):
   281  			// We error if the fast peer didn't succeed.
   282  			t.Errorf("slow_peer recv timed out")
   283  			return
   284  		}
   285  
   286  		sc, err := upgradeSecretConn(c, 500*time.Millisecond, ed25519.GenPrivKey())
   287  		if err != nil {
   288  			t.Errorf("slow_peer upgradeSecretConn err: %s", err.Error())
   289  			return
   290  		}
   291  
   292  		_, err = handshake(sc, 500*time.Millisecond,
   293  			testNodeInfo(
   294  				PubKeyToID(ed25519.GenPrivKey().PubKey()),
   295  				"slow_peer",
   296  			))
   297  		if err != nil {
   298  			t.Errorf("slow_peer handshake err: %s", err.Error())
   299  			return
   300  		}
   301  	}()
   302  
   303  	// Simulate fast Peer.
   304  	go func() {
   305  		<-slowc
   306  
   307  		var (
   308  			dialer = newMultiplexTransport(
   309  				fastNodeInfo,
   310  				NodeKey{
   311  					PrivKey: fastNodePV,
   312  				},
   313  			)
   314  		)
   315  		addr := NewNetAddress(mt.nodeKey.ID(), mt.listener.Addr())
   316  
   317  		_, err := dialer.Dial(*addr, peerConfig{})
   318  		if err != nil {
   319  			t.Errorf("fast_peer Dial err: %s", err.Error())
   320  			return
   321  		}
   322  		close(fastc)
   323  		close(done)
   324  
   325  	}()
   326  
   327  	<-done
   328  	p, err := mt.Accept(peerConfig{})
   329  	if err != nil {
   330  		t.Fatal(err)
   331  	}
   332  
   333  	if have, want := p.NodeInfo(), fastNodeInfo; !reflect.DeepEqual(have, want) {
   334  		t.Errorf("have %v, want %v", have, want)
   335  	}
   336  }
   337  
   338  func TestTransportMultiplexValidateNodeInfo(t *testing.T) {
   339  	mt := testSetupMultiplexTransport(t)
   340  
   341  	errc := make(chan error)
   342  
   343  	go func() {
   344  		var (
   345  			pv     = ed25519.GenPrivKey()
   346  			dialer = newMultiplexTransport(
   347  				testNodeInfo(PubKeyToID(pv.PubKey()), ""), // Should not be empty
   348  				NodeKey{
   349  					PrivKey: pv,
   350  				},
   351  			)
   352  		)
   353  
   354  		addr := NewNetAddress(mt.nodeKey.ID(), mt.listener.Addr())
   355  
   356  		_, err := dialer.Dial(*addr, peerConfig{})
   357  		if err != nil {
   358  			errc <- err
   359  			return
   360  		}
   361  
   362  		close(errc)
   363  	}()
   364  
   365  	if err := <-errc; err != nil {
   366  		t.Errorf("connection failed: %v", err)
   367  	}
   368  
   369  	_, err := mt.Accept(peerConfig{})
   370  	if err, ok := err.(ErrRejected); ok {
   371  		if !err.IsNodeInfoInvalid() {
   372  			t.Errorf("expected NodeInfo to be invalid")
   373  		}
   374  	} else {
   375  		t.Errorf("expected ErrRejected")
   376  	}
   377  }
   378  
   379  func TestTransportMultiplexRejectMissmatchID(t *testing.T) {
   380  	mt := testSetupMultiplexTransport(t)
   381  
   382  	errc := make(chan error)
   383  
   384  	go func() {
   385  		dialer := newMultiplexTransport(
   386  			testNodeInfo(
   387  				PubKeyToID(ed25519.GenPrivKey().PubKey()), "dialer",
   388  			),
   389  			NodeKey{
   390  				PrivKey: ed25519.GenPrivKey(),
   391  			},
   392  		)
   393  		addr := NewNetAddress(mt.nodeKey.ID(), mt.listener.Addr())
   394  
   395  		_, err := dialer.Dial(*addr, peerConfig{})
   396  		if err != nil {
   397  			errc <- err
   398  			return
   399  		}
   400  
   401  		close(errc)
   402  	}()
   403  
   404  	if err := <-errc; err != nil {
   405  		t.Errorf("connection failed: %v", err)
   406  	}
   407  
   408  	_, err := mt.Accept(peerConfig{})
   409  	if err, ok := err.(ErrRejected); ok {
   410  		if !err.IsAuthFailure() {
   411  			t.Errorf("expected auth failure")
   412  		}
   413  	} else {
   414  		t.Errorf("expected ErrRejected")
   415  	}
   416  }
   417  
   418  func TestTransportMultiplexDialRejectWrongID(t *testing.T) {
   419  	mt := testSetupMultiplexTransport(t)
   420  
   421  	var (
   422  		pv     = ed25519.GenPrivKey()
   423  		dialer = newMultiplexTransport(
   424  			testNodeInfo(PubKeyToID(pv.PubKey()), ""), // Should not be empty
   425  			NodeKey{
   426  				PrivKey: pv,
   427  			},
   428  		)
   429  	)
   430  
   431  	wrongID := PubKeyToID(ed25519.GenPrivKey().PubKey())
   432  	addr := NewNetAddress(wrongID, mt.listener.Addr())
   433  
   434  	_, err := dialer.Dial(*addr, peerConfig{})
   435  	if err != nil {
   436  		t.Logf("connection failed: %v", err)
   437  		if err, ok := err.(ErrRejected); ok {
   438  			if !err.IsAuthFailure() {
   439  				t.Errorf("expected auth failure")
   440  			}
   441  		} else {
   442  			t.Errorf("expected ErrRejected")
   443  		}
   444  	}
   445  }
   446  
   447  func TestTransportMultiplexRejectIncompatible(t *testing.T) {
   448  	mt := testSetupMultiplexTransport(t)
   449  
   450  	errc := make(chan error)
   451  
   452  	go func() {
   453  		var (
   454  			pv     = ed25519.GenPrivKey()
   455  			dialer = newMultiplexTransport(
   456  				testNodeInfoWithNetwork(PubKeyToID(pv.PubKey()), "dialer", "incompatible-network"),
   457  				NodeKey{
   458  					PrivKey: pv,
   459  				},
   460  			)
   461  		)
   462  		addr := NewNetAddress(mt.nodeKey.ID(), mt.listener.Addr())
   463  
   464  		_, err := dialer.Dial(*addr, peerConfig{})
   465  		if err != nil {
   466  			errc <- err
   467  			return
   468  		}
   469  
   470  		close(errc)
   471  	}()
   472  
   473  	_, err := mt.Accept(peerConfig{})
   474  	if err, ok := err.(ErrRejected); ok {
   475  		if !err.IsIncompatible() {
   476  			t.Errorf("expected to reject incompatible")
   477  		}
   478  	} else {
   479  		t.Errorf("expected ErrRejected")
   480  	}
   481  }
   482  
   483  func TestTransportMultiplexRejectSelf(t *testing.T) {
   484  	mt := testSetupMultiplexTransport(t)
   485  
   486  	errc := make(chan error)
   487  
   488  	go func() {
   489  		addr := NewNetAddress(mt.nodeKey.ID(), mt.listener.Addr())
   490  
   491  		_, err := mt.Dial(*addr, peerConfig{})
   492  		if err != nil {
   493  			errc <- err
   494  			return
   495  		}
   496  
   497  		close(errc)
   498  	}()
   499  
   500  	if err := <-errc; err != nil {
   501  		if err, ok := err.(ErrRejected); ok {
   502  			if !err.IsSelf() {
   503  				t.Errorf("expected to reject self, got: %v", err)
   504  			}
   505  		} else {
   506  			t.Errorf("expected ErrRejected")
   507  		}
   508  	} else {
   509  		t.Errorf("expected connection failure")
   510  	}
   511  
   512  	_, err := mt.Accept(peerConfig{})
   513  	if err, ok := err.(ErrRejected); ok {
   514  		if !err.IsSelf() {
   515  			t.Errorf("expected to reject self, got: %v", err)
   516  		}
   517  	} else {
   518  		t.Errorf("expected ErrRejected")
   519  	}
   520  }
   521  
   522  func TestTransportConnDuplicateIPFilter(t *testing.T) {
   523  	filter := ConnDuplicateIPFilter()
   524  
   525  	if err := filter(nil, &testTransportConn{}, nil); err != nil {
   526  		t.Fatal(err)
   527  	}
   528  
   529  	var (
   530  		c  = &testTransportConn{}
   531  		cs = NewConnSet()
   532  	)
   533  
   534  	cs.Set(c, []net.IP{
   535  		{10, 0, 10, 1},
   536  		{10, 0, 10, 2},
   537  		{10, 0, 10, 3},
   538  	})
   539  
   540  	if err := filter(cs, c, []net.IP{
   541  		{10, 0, 10, 2},
   542  	}); err == nil {
   543  		t.Errorf("expected Peer to be rejected as duplicate")
   544  	}
   545  }
   546  
   547  func TestTransportHandshake(t *testing.T) {
   548  	ln, err := net.Listen("tcp", "127.0.0.1:0")
   549  	if err != nil {
   550  		t.Fatal(err)
   551  	}
   552  
   553  	var (
   554  		peerPV       = ed25519.GenPrivKey()
   555  		peerNodeInfo = testNodeInfo(PubKeyToID(peerPV.PubKey()), defaultNodeName)
   556  	)
   557  
   558  	go func() {
   559  		c, err := net.Dial(ln.Addr().Network(), ln.Addr().String())
   560  		if err != nil {
   561  			t.Error(err)
   562  			return
   563  		}
   564  
   565  		go func(c net.Conn) {
   566  			_, err := cdc.MarshalBinaryLengthPrefixedWriter(c, peerNodeInfo.(DefaultNodeInfo))
   567  			if err != nil {
   568  				t.Error(err)
   569  			}
   570  		}(c)
   571  		go func(c net.Conn) {
   572  			var ni DefaultNodeInfo
   573  
   574  			_, err := cdc.UnmarshalBinaryLengthPrefixedReader(
   575  				c,
   576  				&ni,
   577  				int64(MaxNodeInfoSize()),
   578  			)
   579  			if err != nil {
   580  				t.Error(err)
   581  			}
   582  		}(c)
   583  	}()
   584  
   585  	c, err := ln.Accept()
   586  	if err != nil {
   587  		t.Fatal(err)
   588  	}
   589  
   590  	ni, err := handshake(c, 500*time.Millisecond, emptyNodeInfo())
   591  	if err != nil {
   592  		t.Fatal(err)
   593  	}
   594  
   595  	if have, want := ni, peerNodeInfo; !reflect.DeepEqual(have, want) {
   596  		t.Errorf("have %v, want %v", have, want)
   597  	}
   598  }
   599  
   600  // create listener
   601  func testSetupMultiplexTransport(t *testing.T) *MultiplexTransport {
   602  	var (
   603  		pv = ed25519.GenPrivKey()
   604  		id = PubKeyToID(pv.PubKey())
   605  		mt = newMultiplexTransport(
   606  			testNodeInfo(
   607  				id, "transport",
   608  			),
   609  			NodeKey{
   610  				PrivKey: pv,
   611  			},
   612  		)
   613  	)
   614  
   615  	addr, err := NewNetAddressString(IDAddressString(id, "127.0.0.1:0"))
   616  	if err != nil {
   617  		t.Fatal(err)
   618  	}
   619  
   620  	if err := mt.Listen(*addr); err != nil {
   621  		t.Fatal(err)
   622  	}
   623  
   624  	return mt
   625  }
   626  
   627  type testTransportAddr struct{}
   628  
   629  func (a *testTransportAddr) Network() string { return "tcp" }
   630  func (a *testTransportAddr) String() string  { return "test.local:1234" }
   631  
   632  type testTransportConn struct{}
   633  
   634  func (c *testTransportConn) Close() error {
   635  	return fmt.Errorf("close() not implemented")
   636  }
   637  
   638  func (c *testTransportConn) LocalAddr() net.Addr {
   639  	return &testTransportAddr{}
   640  }
   641  
   642  func (c *testTransportConn) RemoteAddr() net.Addr {
   643  	return &testTransportAddr{}
   644  }
   645  
   646  func (c *testTransportConn) Read(_ []byte) (int, error) {
   647  	return -1, fmt.Errorf("read() not implemented")
   648  }
   649  
   650  func (c *testTransportConn) SetDeadline(_ time.Time) error {
   651  	return fmt.Errorf("setDeadline() not implemented")
   652  }
   653  
   654  func (c *testTransportConn) SetReadDeadline(_ time.Time) error {
   655  	return fmt.Errorf("setReadDeadline() not implemented")
   656  }
   657  
   658  func (c *testTransportConn) SetWriteDeadline(_ time.Time) error {
   659  	return fmt.Errorf("setWriteDeadline() not implemented")
   660  }
   661  
   662  func (c *testTransportConn) Write(_ []byte) (int, error) {
   663  	return -1, fmt.Errorf("write() not implemented")
   664  }