diff --git a/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/v1/node/GetPeerByIdTest.java b/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/v1/node/GetPeerByIdTest.java index b3f68ab33d8..7f7002f7e97 100644 --- a/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/v1/node/GetPeerByIdTest.java +++ b/data/beaconrestapi/src/test/java/tech/pegasys/teku/beaconrestapi/handlers/v1/node/GetPeerByIdTest.java @@ -14,6 +14,7 @@ package tech.pegasys.teku.beaconrestapi.handlers.v1.node; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -26,12 +27,15 @@ import com.fasterxml.jackson.core.JsonProcessingException; import java.util.Optional; +import org.apache.tuweni.units.bigints.UInt256; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import tech.pegasys.teku.api.peer.Eth2PeerWithEnr; import tech.pegasys.teku.beaconrestapi.AbstractMigratedBeaconHandlerTest; import tech.pegasys.teku.infrastructure.http.HttpErrorResponse; import tech.pegasys.teku.networking.eth2.peers.Eth2Peer; +import tech.pegasys.teku.networking.p2p.discovery.DiscoveryNetwork; +import tech.pegasys.teku.networking.p2p.discovery.DiscoveryService; import tech.pegasys.teku.networking.p2p.mock.MockNodeId; import tech.pegasys.teku.networking.p2p.network.PeerAddress; import tech.pegasys.teku.networking.p2p.peer.NodeId; @@ -40,7 +44,8 @@ public class GetPeerByIdTest extends AbstractMigratedBeaconHandlerTest { private final MockNodeId peerId = new MockNodeId(123456); private final NodeId peerNodeId = mock(NodeId.class); private final Eth2Peer peer = mock(Eth2Peer.class); - private final Eth2PeerWithEnr peerWithEnr = new Eth2PeerWithEnr(peer, Optional.empty()); + private static final String ENR_STUB = "enr:test"; + private final Eth2PeerWithEnr peerWithEnr = new Eth2PeerWithEnr(peer, Optional.of(ENR_STUB)); @BeforeEach void setUp() { @@ -67,6 +72,12 @@ public void shouldReturnNotFoundIfPeerNotFound() throws Exception { public void shouldReturnPeerIfFound() throws Exception { when(eth2P2PNetwork.parseNodeId(peerId.toBase58())).thenReturn(peerNodeId); when(eth2P2PNetwork.getPeer(eq(peerNodeId))).thenReturn(Optional.of(peer)); + when(peer.getDiscoveryNodeId()).thenReturn(Optional.of(UInt256.ONE)); + final DiscoveryNetwork discoveryNetwork = mock(DiscoveryNetwork.class); + when(eth2P2PNetwork.getDiscoveryNetwork()).thenReturn(Optional.of(discoveryNetwork)); + final DiscoveryService discoveryService = mock(DiscoveryService.class); + when(discoveryNetwork.getDiscoveryService()).thenReturn(discoveryService); + when(discoveryService.lookupEnr(any())).thenReturn(Optional.of(ENR_STUB)); handler.handleRequest(request); assertThat(request.getResponseCode()).isEqualTo(SC_OK); @@ -89,6 +100,7 @@ void metadata_shouldHandle200() throws JsonProcessingException { assertThat(data) .isEqualTo( "{\"data\":{\"peer_id\":\"1111111111111111111111111111177em\"," + + "\"enr\":\"enr:test\"," + "\"last_seen_p2p_address\":\"1111111111111111111111111111177em\",\"state\":\"connected\",\"direction\":\"inbound\"}}"); } } diff --git a/networking/eth2/src/test/java/tech/pegasys/teku/networking/eth2/peers/LibP2PDiscoveryNodeIdExtractorTest.java b/networking/eth2/src/test/java/tech/pegasys/teku/networking/eth2/peers/LibP2PDiscoveryNodeIdExtractorTest.java new file mode 100644 index 00000000000..f599071da71 --- /dev/null +++ b/networking/eth2/src/test/java/tech/pegasys/teku/networking/eth2/peers/LibP2PDiscoveryNodeIdExtractorTest.java @@ -0,0 +1,54 @@ +/* + * Copyright Consensys Software Inc., 2024 + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ + +package tech.pegasys.teku.networking.eth2.peers; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import io.libp2p.core.crypto.PubKey; +import org.apache.tuweni.bytes.Bytes; +import org.apache.tuweni.units.bigints.UInt256; +import org.junit.jupiter.api.Test; +import tech.pegasys.teku.networking.p2p.libp2p.LibP2PPeer; +import tech.pegasys.teku.networking.p2p.peer.DelegatingPeer; + +public class LibP2PDiscoveryNodeIdExtractorTest { + public final LibP2PDiscoveryNodeIdExtractor nodeIdExtractor = + new LibP2PDiscoveryNodeIdExtractor(); + + @Test + public void shouldReturnEmptyWhenNonLibP2PPeer() { + final DefaultEth2Peer nonLibP2PPeer1 = mock(DefaultEth2Peer.class); + final DelegatingPeer nonLibP2PPeer2 = mock(DelegatingPeer.class); + assertThat(nodeIdExtractor.calculateDiscoveryNodeId(nonLibP2PPeer1)).isEmpty(); + assertThat(nodeIdExtractor.calculateDiscoveryNodeId(nonLibP2PPeer2)).isEmpty(); + } + + @Test + public void shouldCalculateNodeIdForLibP2PPeer() { + final LibP2PPeer libP2PPeer = mock(LibP2PPeer.class); + final PubKey pubKey = mock(PubKey.class); + when(pubKey.raw()) + .thenReturn( + Bytes.fromHexString( + "02197B9014C6C0500CF168BD1F17A3B4A1307251849A5ECEEE0B5EBC76A7EBDB37") + .toArray()); + when(libP2PPeer.getPubKey()).thenReturn(pubKey); + assertThat(nodeIdExtractor.calculateDiscoveryNodeId(libP2PPeer)) + .contains( + UInt256.fromHexString( + "b103ab4e5b2e6d94021547598485baaf1faa0ce5162e1131fb030190cb47269e")); + } +}