use of org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnection in project besu by hyperledger.
the class P2PPlainNetworkTest method rejectIncomingConnectionFromBlacklistedPeer.
@Test
public void rejectIncomingConnectionFromBlacklistedPeer() throws Exception {
final PeerPermissionsDenylist localBlacklist = PeerPermissionsDenylist.create();
try (final P2PNetwork localNetwork = builder("partner1client1").peerPermissions(localBlacklist).build();
final P2PNetwork remoteNetwork = builder("partner2client1").build()) {
localNetwork.start();
remoteNetwork.start();
final EnodeURL localEnode = localNetwork.getLocalEnode().get();
final Bytes localId = localEnode.getNodeId();
final int localPort = localEnode.getListeningPort().get();
final EnodeURL remoteEnode = remoteNetwork.getLocalEnode().get();
final Bytes remoteId = remoteEnode.getNodeId();
final int remotePort = remoteEnode.getListeningPort().get();
final Peer localPeer = createPeer(localId, localPort);
final Peer remotePeer = createPeer(remoteId, remotePort);
// Blacklist the remote peer
localBlacklist.add(remotePeer);
// Setup disconnect listener
final CompletableFuture<PeerConnection> peerFuture = new CompletableFuture<>();
final CompletableFuture<DisconnectReason> reasonFuture = new CompletableFuture<>();
remoteNetwork.subscribeDisconnect((peerConnection, reason, initiatedByPeer) -> {
peerFuture.complete(peerConnection);
reasonFuture.complete(reason);
});
// Remote connect to local
final CompletableFuture<PeerConnection> connectFuture = remoteNetwork.connect(localPeer);
// Check connection is made, and then a disconnect is registered at remote
Assertions.assertThat(connectFuture.get(5L, TimeUnit.SECONDS).getPeerInfo().getNodeId()).isEqualTo(localId);
Assertions.assertThat(peerFuture.get(5L, TimeUnit.SECONDS).getPeerInfo().getNodeId()).isEqualTo(localId);
assertThat(reasonFuture.get(5L, TimeUnit.SECONDS)).isEqualByComparingTo(DisconnectReason.UNKNOWN);
}
}
use of org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnection in project besu by hyperledger.
the class PeerReputationManagerTest method generatePeerConnection.
private PeerConnection generatePeerConnection() {
final Bytes nodeId = Peer.randomId();
final PeerConnection conn = mock(PeerConnection.class);
final PeerInfo peerInfo = mock(PeerInfo.class);
final Peer peer = generatePeer();
when(peerInfo.getNodeId()).thenReturn(nodeId);
when(conn.getPeerInfo()).thenReturn(peerInfo);
when(conn.getPeer()).thenReturn(peer);
return conn;
}
use of org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnection in project besu by hyperledger.
the class PeerReputationManagerTest method blacklistPeerForBadBehavior.
@Test
public void blacklistPeerForBadBehavior() {
final PeerConnection peer = generatePeerConnection();
checkPermissions(blacklist, peer.getPeer(), true);
peerReputationManager.onDisconnect(peer, DisconnectReason.BREACH_OF_PROTOCOL, false);
checkPermissions(blacklist, peer.getPeer(), false);
}
use of org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnection in project besu by hyperledger.
the class PeerReputationManagerTest method doesNotBlacklistPeerForNormalDisconnect.
@Test
public void doesNotBlacklistPeerForNormalDisconnect() {
final PeerConnection peer = generatePeerConnection();
checkPermissions(blacklist, peer.getPeer(), true);
peerReputationManager.onDisconnect(peer, DisconnectReason.TOO_MANY_PEERS, false);
checkPermissions(blacklist, peer.getPeer(), true);
}
use of org.hyperledger.besu.ethereum.p2p.rlpx.connections.PeerConnection 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);
}
Aggregations