webrtc/rtc_base/test_client_unittest.cc
Danil Chapovalov 86a538129d Propogate Environment through TestEchoServer to AsyncTCPSocket
This removes the last usage of the AsyncTCPSocket constructor that
doesn't provide Environment

restructure AsyncTCPSocket unittest removing usage of bare 'new' and
fixture

Bug: webrtc:42223992
Change-Id: I6da93cbdd2339be81132e2d877d9128c2032ef96
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/409180
Auto-Submit: Danil Chapovalov <danilchap@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#45645}
2025-09-13 16:28:04 -07:00

120 lines
3.7 KiB
C++

/*
* Copyright 2006 The WebRTC Project Authors. All rights reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include "rtc_base/test_client.h"
#include <memory>
#include <utility>
#include "api/environment/environment.h"
#include "rtc_base/async_tcp_socket.h"
#include "rtc_base/async_udp_socket.h"
#include "rtc_base/logging.h"
#include "rtc_base/net_test_helpers.h"
#include "rtc_base/physical_socket_server.h"
#include "rtc_base/socket.h"
#include "rtc_base/socket_address.h"
#include "rtc_base/test_echo_server.h"
#include "rtc_base/thread.h"
#include "test/create_test_environment.h"
#include "test/gmock.h"
#include "test/gtest.h"
#define MAYBE_SKIP_IPV4 \
if (!::webrtc::HasIPv4Enabled()) { \
RTC_LOG(LS_INFO) << "No IPv4... skipping"; \
return; \
}
#define MAYBE_SKIP_IPV6 \
if (!::webrtc::HasIPv6Enabled()) { \
RTC_LOG(LS_INFO) << "No IPv6... skipping"; \
return; \
}
namespace webrtc {
namespace {
using ::testing::NotNull;
void TestUdpInternal(const SocketAddress& loopback) {
const Environment env = CreateTestEnvironment();
PhysicalSocketServer socket_server;
AutoSocketServerThread main_thread(&socket_server);
std::unique_ptr<Socket> socket =
socket_server.Create(loopback.family(), SOCK_DGRAM);
ASSERT_THAT(socket, NotNull());
socket->Bind(loopback);
TestClient client(std::make_unique<AsyncUDPSocket>(env, std::move(socket)));
SocketAddress addr = client.address(), from;
EXPECT_EQ(3, client.SendTo("foo", 3, addr));
EXPECT_TRUE(client.CheckNextPacket("foo", 3, &from));
EXPECT_EQ(from, addr);
EXPECT_TRUE(client.CheckNoPacket());
}
void TestTcpInternal(const SocketAddress& loopback) {
const Environment env = CreateTestEnvironment();
PhysicalSocketServer socket_server;
AutoSocketServerThread main_thread(&socket_server);
TestEchoServer server(env, &main_thread, loopback);
std::unique_ptr<Socket> socket =
socket_server.Create(loopback.family(), SOCK_STREAM);
ASSERT_THAT(socket, NotNull());
ASSERT_EQ(socket->Bind(loopback), 0);
ASSERT_EQ(socket->Connect(server.address()), 0);
auto tcp_socket = std::make_unique<AsyncTCPSocket>(env, std::move(socket));
TestClient client(std::move(tcp_socket));
SocketAddress addr = client.address(), from;
EXPECT_TRUE(client.CheckConnected());
EXPECT_EQ(3, client.Send("foo", 3));
EXPECT_TRUE(client.CheckNextPacket("foo", 3, &from));
EXPECT_EQ(from, server.address());
EXPECT_TRUE(client.CheckNoPacket());
}
// Tests whether the TestClient can send UDP to itself.
TEST(TestClientTest, TestUdpIPv4) {
MAYBE_SKIP_IPV4;
TestUdpInternal(SocketAddress("127.0.0.1", 0));
}
#if defined(WEBRTC_LINUX)
#define MAYBE_TestUdpIPv6 DISABLED_TestUdpIPv6
#else
#define MAYBE_TestUdpIPv6 TestUdpIPv6
#endif
TEST(TestClientTest, MAYBE_TestUdpIPv6) {
MAYBE_SKIP_IPV6;
TestUdpInternal(SocketAddress("::1", 0));
}
// Tests whether the TestClient can connect to a server and exchange data.
TEST(TestClientTest, TestTcpIPv4) {
MAYBE_SKIP_IPV4;
TestTcpInternal(SocketAddress("127.0.0.1", 0));
}
#if defined(WEBRTC_LINUX)
#define MAYBE_TestTcpIPv6 DISABLED_TestTcpIPv6
#else
#define MAYBE_TestTcpIPv6 TestTcpIPv6
#endif
TEST(TestClientTest, MAYBE_TestTcpIPv6) {
MAYBE_SKIP_IPV6;
TestTcpInternal(SocketAddress("::1", 0));
}
} // namespace
} // namespace webrtc