handling IllegalArgumentException caused by Discovery Disabled

* Update ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/Endpoint.java

Co-authored-by: Sally MacFarlane <macfarla.github@gmail.com>
Signed-off-by: Vaidik <vaidikbhardwaj00@gmail.com>

* loopback address
* use constant

Signed-off-by: Sally MacFarlane <macfarla.github@gmail.com>

---------

Signed-off-by: Vaidik <vaidikbhardwaj00@gmail.com>
Signed-off-by: Sally MacFarlane <macfarla.github@gmail.com>
Co-authored-by: Sally MacFarlane <macfarla.github@gmail.com>
This commit is contained in:
Vaidik
2025-01-15 05:40:11 +05:30
committed by GitHub
parent 42b26a466d
commit 9c12ed19df
2 changed files with 32 additions and 8 deletions

View File

@@ -29,12 +29,15 @@ import java.util.Optional;
import com.google.common.net.InetAddresses;
import org.apache.tuweni.bytes.Bytes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Encapsulates the network coordinates of a {@link DiscoveryPeer} as well as serialization logic
* used in various Discovery messages.
*/
public class Endpoint {
private static final Logger LOG = LoggerFactory.getLogger(Endpoint.class);
private final Optional<String> host;
private final int udpPort;
private final Optional<Integer> tcpPort;
@@ -49,15 +52,16 @@ public class Endpoint {
}
public static Endpoint fromEnode(final EnodeURL enode) {
final int discoveryPort =
enode
.getDiscoveryPort()
.orElseThrow(
() ->
new IllegalArgumentException(
"Attempt to create a discovery endpoint for an enode with discovery disabled."));
Optional<Integer> discoveryPort = enode.getDiscoveryPort();
if (discoveryPort.isEmpty()) {
int defaultPort = EnodeURLImpl.DEFAULT_LISTENING_PORT;
LOG.debug("Discovery disabled for enode {}. Using default port {}.", enode, defaultPort);
return new Endpoint(enode.getIp().getHostAddress(), defaultPort, Optional.empty());
}
final Optional<Integer> listeningPort = enode.getListeningPort();
return new Endpoint(enode.getIp().getHostAddress(), discoveryPort, listeningPort);
return new Endpoint(enode.getIp().getHostAddress(), discoveryPort.get(), listeningPort);
}
public EnodeURL toEnode(final Bytes nodeId) {

View File

@@ -18,6 +18,7 @@ import static java.util.stream.Collectors.toList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatCode;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
@@ -45,6 +46,8 @@ import org.hyperledger.besu.ethereum.p2p.permissions.PeerPermissions.Action;
import org.hyperledger.besu.ethereum.p2p.permissions.PeerPermissionsDenylist;
import org.hyperledger.besu.plugin.data.EnodeURL;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
@@ -898,6 +901,23 @@ public class PeerDiscoveryAgentTest {
assertThat(PeerDiscoveryAgent.deriveHost(source, mockWellFormed)).isEqualTo(routableHost);
}
@Test
void testFromEnodeWithDiscoveryDisabled() throws UnknownHostException {
EnodeURL enodeWithNoDiscovery = mock(EnodeURL.class);
when(enodeWithNoDiscovery.getDiscoveryPort()).thenReturn(Optional.empty());
when(enodeWithNoDiscovery.getListeningPort()).thenReturn(Optional.of(8545));
when(enodeWithNoDiscovery.getIp()).thenReturn(InetAddress.getLoopbackAddress());
Endpoint result = Endpoint.fromEnode(enodeWithNoDiscovery);
assertEquals("127.0.0.1", result.getHost());
assertEquals(EnodeURLImpl.DEFAULT_LISTENING_PORT, result.getUdpPort());
assertEquals(Optional.empty(), result.getTcpPort());
}
protected void bondViaIncomingPing(
final MockPeerDiscoveryAgent agent, final MockPeerDiscoveryAgent otherNode) {
final Packet pingPacket = helper.createPingPacket(otherNode, agent);