diff --git a/test/network/network_emulation.cc b/test/network/network_emulation.cc index b969dfce38..bf6c0683d4 100644 --- a/test/network/network_emulation.cc +++ b/test/network/network_emulation.cc @@ -469,7 +469,11 @@ void EmulatedEndpointImpl::SendPacket(const rtc::SocketAddress& from, packet.arrival_time, clock_->CurrentTime(), packet.to.ipaddr(), DataSize::Bytes(packet.ip_packet_size()), stats_gathering_mode_); - router_.OnPacketReceived(std::move(packet)); + if (packet.to.ipaddr() == peer_local_addr_) { + OnPacketReceived(std::move(packet)); + } else { + router_.OnPacketReceived(std::move(packet)); + } }); } diff --git a/test/network/network_emulation_unittest.cc b/test/network/network_emulation_unittest.cc index 6b5ca7656b..476906fc87 100644 --- a/test/network/network_emulation_unittest.cc +++ b/test/network/network_emulation_unittest.cc @@ -554,5 +554,19 @@ TEST_F(NetworkEmulationManagerThreeNodesRoutingTest, SendPacketsAndValidateDelivery(); } +TEST(NetworkEmulationManagerTest, EndpointLoopback) { + NetworkEmulationManagerImpl network_manager(TimeMode::kSimulated); + auto endpoint = network_manager.CreateEndpoint(EmulatedEndpointConfig()); + + MockReceiver receiver; + EXPECT_CALL(receiver, OnPacketReceived(::testing::_)).Times(1); + ASSERT_EQ(endpoint->BindReceiver(80, &receiver), 80); + + endpoint->SendPacket(rtc::SocketAddress(endpoint->GetPeerLocalAddress(), 80), + rtc::SocketAddress(endpoint->GetPeerLocalAddress(), 80), + "Hello"); + network_manager.time_controller()->AdvanceTime(TimeDelta::Seconds(1)); +} + } // namespace test } // namespace webrtc