Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

handling IllegalArgumentException caused by Discovery Disabled Nodes in Endpoint.fromEnode #7937

Draft
wants to merge 14 commits into
base: main
Choose a base branch
from
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,15 @@

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);
vaidikcode marked this conversation as resolved.
Show resolved Hide resolved
private final Optional<String> host;
private final int udpPort;
private final Optional<Integer> tcpPort;
Expand All @@ -49,15 +52,16 @@ public Endpoint(final String host, final int udpPort, final Optional<Integer> tc
}

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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@
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.junit.jupiter.api.Assertions.fail;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
Expand Down Expand Up @@ -45,6 +47,8 @@
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;
Expand All @@ -57,12 +61,15 @@
import org.apache.tuweni.units.bigints.UInt64;
import org.ethereum.beacon.discovery.schema.NodeRecord;
import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class PeerDiscoveryAgentTest {

private static final int BROADCAST_TCP_PORT = 30303;
private static final Supplier<SignatureAlgorithm> SIGNATURE_ALGORITHM =
Suppliers.memoize(SignatureAlgorithmFactory::getInstance);
private static final Logger log = LoggerFactory.getLogger(PeerDiscoveryAgentTest.class);
macfarla marked this conversation as resolved.
Show resolved Hide resolved
private final PeerDiscoveryTestHelper helper = new PeerDiscoveryTestHelper();

@Test
Expand Down Expand Up @@ -898,6 +905,27 @@ public void assertHostCorrectlyRevertsOnIgnoredPacketFrom() {
assertThat(PeerDiscoveryAgent.deriveHost(source, mockWellFormed)).isEqualTo(routableHost);
}

@Test
void testFromEnodeWithDiscoveryDisabled() {
EnodeURL enodeWithNoDiscovery = mock(EnodeURL.class);
when(enodeWithNoDiscovery.getDiscoveryPort()).thenReturn(Optional.empty());
when(enodeWithNoDiscovery.getListeningPort()).thenReturn(Optional.of(8545));
try {
when(enodeWithNoDiscovery.getIp()).thenReturn(InetAddress.getByName("127.0.0.1"));
}
catch (UnknownHostException e) {
log.debug("Failed to resolve the Host Address ");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

prob wouldn't catch this exception in the test, you can mark the test method throws that ex. (what would happen if this exception occurred? would the test pass or fail? should it pass or fail?)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't believe this will significantly impact the test's primary function. Should I proceed with Throws it?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes I would keep this logic out of the test altogether

}
Endpoint result = Endpoint.fromEnode(enodeWithNoDiscovery);

assertEquals("127.0.0.1", result.getHost());

assertEquals(30303, result.getUdpPort());

assertEquals(Optional.empty(), result.getTcpPort());
}


protected void bondViaIncomingPing(
final MockPeerDiscoveryAgent agent, final MockPeerDiscoveryAgent otherNode) {
final Packet pingPacket = helper.createPingPacket(otherNode, agent);
Expand Down