github.com/letterj/go-ethereum@v1.8.22-0.20190204142846-520024dfd689/les/peer_test.go (about)

     1  package les
     2  
     3  import (
     4  	"math/big"
     5  	"testing"
     6  
     7  	"github.com/ethereum/go-ethereum/common"
     8  	"github.com/ethereum/go-ethereum/les/flowcontrol"
     9  	"github.com/ethereum/go-ethereum/p2p"
    10  	"github.com/ethereum/go-ethereum/p2p/enode"
    11  	"github.com/ethereum/go-ethereum/rlp"
    12  )
    13  
    14  const (
    15  	test_networkid   = 10
    16  	protocol_version = 2123
    17  )
    18  
    19  var (
    20  	hash    = common.HexToHash("some string")
    21  	genesis = common.HexToHash("genesis hash")
    22  	headNum = uint64(1234)
    23  	td      = big.NewInt(123)
    24  )
    25  
    26  //ulc connects to trusted peer and send announceType=announceTypeSigned
    27  func TestPeerHandshakeSetAnnounceTypeToAnnounceTypeSignedForTrustedPeer(t *testing.T) {
    28  
    29  	var id enode.ID = newNodeID(t).ID()
    30  
    31  	//peer to connect(on ulc side)
    32  	p := peer{
    33  		Peer:      p2p.NewPeer(id, "test peer", []p2p.Cap{}),
    34  		version:   protocol_version,
    35  		isTrusted: true,
    36  		rw: &rwStub{
    37  			WriteHook: func(recvList keyValueList) {
    38  				//checking that ulc sends to peer allowedRequests=onlyAnnounceRequests and announceType = announceTypeSigned
    39  				recv := recvList.decode()
    40  				var reqType uint64
    41  
    42  				err := recv.get("announceType", &reqType)
    43  				if err != nil {
    44  					t.Fatal(err)
    45  				}
    46  
    47  				if reqType != announceTypeSigned {
    48  					t.Fatal("Expected announceTypeSigned")
    49  				}
    50  			},
    51  			ReadHook: func(l keyValueList) keyValueList {
    52  				l = l.add("serveHeaders", nil)
    53  				l = l.add("serveChainSince", uint64(0))
    54  				l = l.add("serveStateSince", uint64(0))
    55  				l = l.add("txRelay", nil)
    56  				l = l.add("flowControl/BL", uint64(0))
    57  				l = l.add("flowControl/MRR", uint64(0))
    58  				l = l.add("flowControl/MRC", RequestCostList{})
    59  
    60  				return l
    61  			},
    62  		},
    63  		network: test_networkid,
    64  	}
    65  
    66  	err := p.Handshake(td, hash, headNum, genesis, nil)
    67  	if err != nil {
    68  		t.Fatalf("Handshake error: %s", err)
    69  	}
    70  
    71  	if p.announceType != announceTypeSigned {
    72  		t.Fatal("Incorrect announceType")
    73  	}
    74  }
    75  
    76  func TestPeerHandshakeAnnounceTypeSignedForTrustedPeersPeerNotInTrusted(t *testing.T) {
    77  	var id enode.ID = newNodeID(t).ID()
    78  	p := peer{
    79  		Peer:    p2p.NewPeer(id, "test peer", []p2p.Cap{}),
    80  		version: protocol_version,
    81  		rw: &rwStub{
    82  			WriteHook: func(recvList keyValueList) {
    83  				//checking that ulc sends to peer allowedRequests=noRequests and announceType != announceTypeSigned
    84  				recv := recvList.decode()
    85  				var reqType uint64
    86  
    87  				err := recv.get("announceType", &reqType)
    88  				if err != nil {
    89  					t.Fatal(err)
    90  				}
    91  
    92  				if reqType == announceTypeSigned {
    93  					t.Fatal("Expected not announceTypeSigned")
    94  				}
    95  			},
    96  			ReadHook: func(l keyValueList) keyValueList {
    97  				l = l.add("serveHeaders", nil)
    98  				l = l.add("serveChainSince", uint64(0))
    99  				l = l.add("serveStateSince", uint64(0))
   100  				l = l.add("txRelay", nil)
   101  				l = l.add("flowControl/BL", uint64(0))
   102  				l = l.add("flowControl/MRR", uint64(0))
   103  				l = l.add("flowControl/MRC", RequestCostList{})
   104  
   105  				return l
   106  			},
   107  		},
   108  		network: test_networkid,
   109  	}
   110  
   111  	err := p.Handshake(td, hash, headNum, genesis, nil)
   112  	if err != nil {
   113  		t.Fatal(err)
   114  	}
   115  	if p.announceType == announceTypeSigned {
   116  		t.Fatal("Incorrect announceType")
   117  	}
   118  }
   119  
   120  func TestPeerHandshakeDefaultAllRequests(t *testing.T) {
   121  	var id enode.ID = newNodeID(t).ID()
   122  
   123  	s := generateLesServer()
   124  
   125  	p := peer{
   126  		Peer:    p2p.NewPeer(id, "test peer", []p2p.Cap{}),
   127  		version: protocol_version,
   128  		rw: &rwStub{
   129  			ReadHook: func(l keyValueList) keyValueList {
   130  				l = l.add("announceType", uint64(announceTypeSigned))
   131  				l = l.add("allowedRequests", uint64(0))
   132  
   133  				return l
   134  			},
   135  		},
   136  		network: test_networkid,
   137  	}
   138  
   139  	err := p.Handshake(td, hash, headNum, genesis, s)
   140  	if err != nil {
   141  		t.Fatal(err)
   142  	}
   143  
   144  	if p.isOnlyAnnounce {
   145  		t.Fatal("Incorrect announceType")
   146  	}
   147  }
   148  
   149  func TestPeerHandshakeServerSendOnlyAnnounceRequestsHeaders(t *testing.T) {
   150  	var id enode.ID = newNodeID(t).ID()
   151  
   152  	s := generateLesServer()
   153  	s.onlyAnnounce = true
   154  
   155  	p := peer{
   156  		Peer:    p2p.NewPeer(id, "test peer", []p2p.Cap{}),
   157  		version: protocol_version,
   158  		rw: &rwStub{
   159  			ReadHook: func(l keyValueList) keyValueList {
   160  				l = l.add("announceType", uint64(announceTypeSigned))
   161  
   162  				return l
   163  			},
   164  			WriteHook: func(l keyValueList) {
   165  				for _, v := range l {
   166  					if v.Key == "serveHeaders" ||
   167  						v.Key == "serveChainSince" ||
   168  						v.Key == "serveStateSince" ||
   169  						v.Key == "txRelay" {
   170  						t.Fatalf("%v exists", v.Key)
   171  					}
   172  				}
   173  			},
   174  		},
   175  		network: test_networkid,
   176  	}
   177  
   178  	err := p.Handshake(td, hash, headNum, genesis, s)
   179  	if err != nil {
   180  		t.Fatal(err)
   181  	}
   182  }
   183  func TestPeerHandshakeClientReceiveOnlyAnnounceRequestsHeaders(t *testing.T) {
   184  	var id enode.ID = newNodeID(t).ID()
   185  
   186  	p := peer{
   187  		Peer:    p2p.NewPeer(id, "test peer", []p2p.Cap{}),
   188  		version: protocol_version,
   189  		rw: &rwStub{
   190  			ReadHook: func(l keyValueList) keyValueList {
   191  				l = l.add("flowControl/BL", uint64(0))
   192  				l = l.add("flowControl/MRR", uint64(0))
   193  				l = l.add("flowControl/MRC", RequestCostList{})
   194  
   195  				l = l.add("announceType", uint64(announceTypeSigned))
   196  
   197  				return l
   198  			},
   199  		},
   200  		network:   test_networkid,
   201  		isTrusted: true,
   202  	}
   203  
   204  	err := p.Handshake(td, hash, headNum, genesis, nil)
   205  	if err != nil {
   206  		t.Fatal(err)
   207  	}
   208  
   209  	if !p.isOnlyAnnounce {
   210  		t.Fatal("isOnlyAnnounce must be true")
   211  	}
   212  }
   213  
   214  func TestPeerHandshakeClientReturnErrorOnUselessPeer(t *testing.T) {
   215  	var id enode.ID = newNodeID(t).ID()
   216  
   217  	p := peer{
   218  		Peer:    p2p.NewPeer(id, "test peer", []p2p.Cap{}),
   219  		version: protocol_version,
   220  		rw: &rwStub{
   221  			ReadHook: func(l keyValueList) keyValueList {
   222  				l = l.add("flowControl/BL", uint64(0))
   223  				l = l.add("flowControl/MRR", uint64(0))
   224  				l = l.add("flowControl/MRC", RequestCostList{})
   225  
   226  				l = l.add("announceType", uint64(announceTypeSigned))
   227  
   228  				return l
   229  			},
   230  		},
   231  		network: test_networkid,
   232  	}
   233  
   234  	err := p.Handshake(td, hash, headNum, genesis, nil)
   235  	if err == nil {
   236  		t.FailNow()
   237  	}
   238  }
   239  
   240  func generateLesServer() *LesServer {
   241  	s := &LesServer{
   242  		defParams: &flowcontrol.ServerParams{
   243  			BufLimit:    uint64(300000000),
   244  			MinRecharge: uint64(50000),
   245  		},
   246  		fcManager: flowcontrol.NewClientManager(1, 2, 3),
   247  		fcCostStats: &requestCostStats{
   248  			stats: make(map[uint64]*linReg, len(reqList)),
   249  		},
   250  	}
   251  	for _, code := range reqList {
   252  		s.fcCostStats.stats[code] = &linReg{cnt: 100}
   253  	}
   254  	return s
   255  }
   256  
   257  type rwStub struct {
   258  	ReadHook  func(l keyValueList) keyValueList
   259  	WriteHook func(l keyValueList)
   260  }
   261  
   262  func (s *rwStub) ReadMsg() (p2p.Msg, error) {
   263  	payload := keyValueList{}
   264  	payload = payload.add("protocolVersion", uint64(protocol_version))
   265  	payload = payload.add("networkId", uint64(test_networkid))
   266  	payload = payload.add("headTd", td)
   267  	payload = payload.add("headHash", hash)
   268  	payload = payload.add("headNum", headNum)
   269  	payload = payload.add("genesisHash", genesis)
   270  
   271  	if s.ReadHook != nil {
   272  		payload = s.ReadHook(payload)
   273  	}
   274  
   275  	size, p, err := rlp.EncodeToReader(payload)
   276  	if err != nil {
   277  		return p2p.Msg{}, err
   278  	}
   279  
   280  	return p2p.Msg{
   281  		Size:    uint32(size),
   282  		Payload: p,
   283  	}, nil
   284  }
   285  
   286  func (s *rwStub) WriteMsg(m p2p.Msg) error {
   287  	recvList := keyValueList{}
   288  	if err := m.Decode(&recvList); err != nil {
   289  		return err
   290  	}
   291  
   292  	if s.WriteHook != nil {
   293  		s.WriteHook(recvList)
   294  	}
   295  
   296  	return nil
   297  }