Search in sources :

Example 1 with HelloMessage

use of org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.HelloMessage in project besu by hyperledger.

the class DeFramerTest method decode_handlesNoSharedCaps.

@Test
public void decode_handlesNoSharedCaps() {
    ChannelFuture future = NettyMocks.channelFuture(false);
    when(channel.closeFuture()).thenReturn(future);
    PeerInfo remotePeerInfo = new PeerInfo(p2pVersion, "bla", Arrays.asList(Capability.create("eth", 254)), 30303, Peer.randomId());
    HelloMessage helloMessage = HelloMessage.create(remotePeerInfo);
    ByteBuf data = Unpooled.wrappedBuffer(helloMessage.getData().toArray());
    when(framer.deframe(eq(data))).thenReturn(new RawMessage(helloMessage.getCode(), helloMessage.getData())).thenReturn(null);
    List<Object> out = new ArrayList<>();
    deFramer.decode(ctx, data, out);
    assertThat(connectFuture).isDone();
    assertThat(connectFuture).isCompletedExceptionally();
    assertThatThrownBy(connectFuture::get).hasCauseInstanceOf(IncompatiblePeerException.class);
    assertThat(out).isEmpty();
    // Next phase of pipeline should be setup
    verify(pipeline, times(1)).addLast(any());
}
Also used : ChannelFuture(io.netty.channel.ChannelFuture) HelloMessage(org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.HelloMessage) PeerInfo(org.hyperledger.besu.ethereum.p2p.rlpx.wire.PeerInfo) ArrayList(java.util.ArrayList) ByteBuf(io.netty.buffer.ByteBuf) RawMessage(org.hyperledger.besu.ethereum.p2p.rlpx.wire.RawMessage) Test(org.junit.Test)

Example 2 with HelloMessage

use of org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.HelloMessage in project besu by hyperledger.

the class DeFramerTest method decode_handlesHelloFromPeerWithAdvertisedPortOf0.

@Test
public void decode_handlesHelloFromPeerWithAdvertisedPortOf0() throws ExecutionException, InterruptedException {
    ChannelFuture future = NettyMocks.channelFuture(false);
    when(channel.closeFuture()).thenReturn(future);
    final Peer peer = createRemotePeer();
    final PeerInfo remotePeerInfo = new PeerInfo(p2pVersion, clientId, capabilities, 0, peer.getId());
    final DeFramer deFramer = createDeFramer(null);
    HelloMessage helloMessage = HelloMessage.create(remotePeerInfo);
    ByteBuf data = Unpooled.wrappedBuffer(helloMessage.getData().toArray());
    when(framer.deframe(eq(data))).thenReturn(new RawMessage(helloMessage.getCode(), helloMessage.getData())).thenReturn(null);
    List<Object> out = new ArrayList<>();
    deFramer.decode(ctx, data, out);
    assertThat(connectFuture).isDone();
    assertThat(connectFuture).isNotCompletedExceptionally();
    PeerConnection peerConnection = connectFuture.get();
    assertThat(peerConnection.getPeerInfo()).isEqualTo(remotePeerInfo);
    assertThat(out).isEmpty();
    final EnodeURL expectedEnode = EnodeURLImpl.builder().ipAddress(remoteAddress.getAddress()).nodeId(peer.getId()).disableListening().disableDiscovery().build();
    assertThat(peerConnection.getPeer().getEnodeURL()).isEqualTo(expectedEnode);
    // Next phase of pipeline should be setup
    verify(pipeline, times(1)).addLast(any());
    // Next message should be pushed out
    PingMessage nextMessage = PingMessage.get();
    ByteBuf nextData = Unpooled.wrappedBuffer(nextMessage.getData().toArray());
    when(framer.deframe(eq(nextData))).thenReturn(new RawMessage(nextMessage.getCode(), nextMessage.getData())).thenReturn(null);
    verify(pipeline, times(1)).addLast(any());
    deFramer.decode(ctx, nextData, out);
    assertThat(out.size()).isEqualTo(1);
}
Also used : ChannelFuture(io.netty.channel.ChannelFuture) HelloMessage(org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.HelloMessage) PeerConnection(org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnection) PeerInfo(org.hyperledger.besu.ethereum.p2p.rlpx.wire.PeerInfo) Peer(org.hyperledger.besu.ethereum.p2p.peers.Peer) DefaultPeer(org.hyperledger.besu.ethereum.p2p.peers.DefaultPeer) ArrayList(java.util.ArrayList) ByteBuf(io.netty.buffer.ByteBuf) PingMessage(org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.PingMessage) EnodeURL(org.hyperledger.besu.plugin.data.EnodeURL) RawMessage(org.hyperledger.besu.ethereum.p2p.rlpx.wire.RawMessage) Test(org.junit.Test)

Example 3 with HelloMessage

use of org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.HelloMessage in project besu by hyperledger.

the class DeFramerTest method decode_shouldHandleRemoteSocketAddressIsNull.

@Test
public void decode_shouldHandleRemoteSocketAddressIsNull() {
    final Peer peer = createRemotePeer();
    final PeerInfo remotePeerInfo = new PeerInfo(p2pVersion, clientId, capabilities, 0, peer.getId());
    HelloMessage helloMessage = HelloMessage.create(remotePeerInfo);
    ByteBuf data = Unpooled.wrappedBuffer(helloMessage.getData().toArray());
    when(framer.deframe(any())).thenReturn(new RawMessage(helloMessage.getCode(), helloMessage.getData())).thenReturn(null);
    when(ctx.channel().remoteAddress()).thenReturn(null);
    ChannelFuture future = NettyMocks.channelFuture(true);
    when(ctx.writeAndFlush(any())).thenReturn(future);
    List<Object> out = new ArrayList<>();
    deFramer.decode(ctx, data, out);
    assertThat(connectFuture).isDone();
    assertThat(connectFuture).isCompletedExceptionally();
    assertThatThrownBy(connectFuture::get).hasCauseInstanceOf(PeerChannelClosedException.class);
    verify(ctx).close();
    assertThat(out).isEmpty();
}
Also used : ChannelFuture(io.netty.channel.ChannelFuture) HelloMessage(org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.HelloMessage) PeerInfo(org.hyperledger.besu.ethereum.p2p.rlpx.wire.PeerInfo) Peer(org.hyperledger.besu.ethereum.p2p.peers.Peer) DefaultPeer(org.hyperledger.besu.ethereum.p2p.peers.DefaultPeer) ArrayList(java.util.ArrayList) ByteBuf(io.netty.buffer.ByteBuf) RawMessage(org.hyperledger.besu.ethereum.p2p.rlpx.wire.RawMessage) Test(org.junit.Test)

Example 4 with HelloMessage

use of org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.HelloMessage in project besu by hyperledger.

the class DeFramerTest method decode_handlesUnexpectedPeerId.

@Test
public void decode_handlesUnexpectedPeerId() {
    ChannelFuture future = NettyMocks.channelFuture(false);
    when(channel.closeFuture()).thenReturn(future);
    final Peer peer = createRemotePeer();
    final Bytes mismatchedId = Peer.randomId();
    final PeerInfo remotePeerInfo = new PeerInfo(p2pVersion, clientId, capabilities, peer.getEnodeURL().getListeningPortOrZero(), mismatchedId);
    final DeFramer deFramer = createDeFramer(peer);
    HelloMessage helloMessage = HelloMessage.create(remotePeerInfo);
    ByteBuf data = Unpooled.wrappedBuffer(helloMessage.getData().toArray());
    when(framer.deframe(eq(data))).thenReturn(new RawMessage(helloMessage.getCode(), helloMessage.getData())).thenReturn(null);
    List<Object> out = new ArrayList<>();
    deFramer.decode(ctx, data, out);
    assertThat(connectFuture).isDone();
    assertThat(connectFuture).isCompletedExceptionally();
    assertThatThrownBy(connectFuture::get).hasCauseInstanceOf(UnexpectedPeerConnectionException.class).hasMessageContaining("Expected id " + peer.getId().toString());
    assertThat(out).isEmpty();
    // Next phase of pipeline should be setup
    verify(pipeline, times(1)).addLast(any());
}
Also used : ChannelFuture(io.netty.channel.ChannelFuture) HelloMessage(org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.HelloMessage) PeerInfo(org.hyperledger.besu.ethereum.p2p.rlpx.wire.PeerInfo) Peer(org.hyperledger.besu.ethereum.p2p.peers.Peer) DefaultPeer(org.hyperledger.besu.ethereum.p2p.peers.DefaultPeer) ArrayList(java.util.ArrayList) ByteBuf(io.netty.buffer.ByteBuf) Bytes(org.apache.tuweni.bytes.Bytes) UnexpectedPeerConnectionException(org.hyperledger.besu.ethereum.p2p.network.exceptions.UnexpectedPeerConnectionException) RawMessage(org.hyperledger.besu.ethereum.p2p.rlpx.wire.RawMessage) Test(org.junit.Test)

Example 5 with HelloMessage

use of org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.HelloMessage in project besu by hyperledger.

the class DeFramerTest method decode_handlesHello.

@Test
public void decode_handlesHello() throws ExecutionException, InterruptedException {
    ChannelFuture future = NettyMocks.channelFuture(false);
    when(channel.closeFuture()).thenReturn(future);
    final Peer peer = createRemotePeer();
    final PeerInfo remotePeerInfo = createPeerInfo(peer);
    HelloMessage helloMessage = HelloMessage.create(remotePeerInfo);
    ByteBuf data = Unpooled.wrappedBuffer(helloMessage.getData().toArray());
    when(framer.deframe(eq(data))).thenReturn(new RawMessage(helloMessage.getCode(), helloMessage.getData())).thenReturn(null);
    List<Object> out = new ArrayList<>();
    deFramer.decode(ctx, data, out);
    assertThat(connectFuture).isDone();
    assertThat(connectFuture).isNotCompletedExceptionally();
    PeerConnection peerConnection = connectFuture.get();
    assertThat(peerConnection.getPeerInfo()).isEqualTo(remotePeerInfo);
    EnodeURL expectedEnode = EnodeURLImpl.builder().configureFromEnode(peer.getEnodeURL()).disableDiscovery().build();
    assertThat(peerConnection.getPeer().getEnodeURL()).isEqualTo(expectedEnode);
    assertThat(out).isEmpty();
    // Next phase of pipeline should be setup
    verify(pipeline, times(1)).addLast(any());
    // Next message should be pushed out
    PingMessage nextMessage = PingMessage.get();
    ByteBuf nextData = Unpooled.wrappedBuffer(nextMessage.getData().toArray());
    when(framer.deframe(eq(nextData))).thenReturn(new RawMessage(nextMessage.getCode(), nextMessage.getData())).thenReturn(null);
    verify(pipeline, times(1)).addLast(any());
    deFramer.decode(ctx, nextData, out);
    assertThat(out.size()).isEqualTo(1);
}
Also used : ChannelFuture(io.netty.channel.ChannelFuture) EnodeURL(org.hyperledger.besu.plugin.data.EnodeURL) HelloMessage(org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.HelloMessage) PeerConnection(org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnection) PeerInfo(org.hyperledger.besu.ethereum.p2p.rlpx.wire.PeerInfo) Peer(org.hyperledger.besu.ethereum.p2p.peers.Peer) DefaultPeer(org.hyperledger.besu.ethereum.p2p.peers.DefaultPeer) ArrayList(java.util.ArrayList) ByteBuf(io.netty.buffer.ByteBuf) RawMessage(org.hyperledger.besu.ethereum.p2p.rlpx.wire.RawMessage) PingMessage(org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.PingMessage) Test(org.junit.Test)

Aggregations

ByteBuf (io.netty.buffer.ByteBuf)5 ChannelFuture (io.netty.channel.ChannelFuture)5 ArrayList (java.util.ArrayList)5 PeerInfo (org.hyperledger.besu.ethereum.p2p.rlpx.wire.PeerInfo)5 RawMessage (org.hyperledger.besu.ethereum.p2p.rlpx.wire.RawMessage)5 HelloMessage (org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.HelloMessage)5 Test (org.junit.Test)5 DefaultPeer (org.hyperledger.besu.ethereum.p2p.peers.DefaultPeer)4 Peer (org.hyperledger.besu.ethereum.p2p.peers.Peer)4 PeerConnection (org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnection)2 PingMessage (org.hyperledger.besu.ethereum.p2p.rlpx.wire.messages.PingMessage)2 EnodeURL (org.hyperledger.besu.plugin.data.EnodeURL)2 Bytes (org.apache.tuweni.bytes.Bytes)1 UnexpectedPeerConnectionException (org.hyperledger.besu.ethereum.p2p.network.exceptions.UnexpectedPeerConnectionException)1