Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(180)

Unified Diff: content/browser/renderer_host/p2p/socket_host_udp_unittest.cc

Issue 2140693002: Support port range for IPC P2P UDP sockets. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase and remove unused constructor from test Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/renderer_host/p2p/socket_host_udp.cc ('k') | content/common/p2p_messages.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/renderer_host/p2p/socket_host_udp_unittest.cc
diff --git a/content/browser/renderer_host/p2p/socket_host_udp_unittest.cc b/content/browser/renderer_host/p2p/socket_host_udp_unittest.cc
index c9a7b92dbf12e864e74411b384518641fa02c9cb..f01e1e40c7c4aef6d2192c20c855340c217fecc5 100644
--- a/content/browser/renderer_host/p2p/socket_host_udp_unittest.cc
+++ b/content/browser/renderer_host/p2p/socket_host_udp_unittest.cc
@@ -10,6 +10,7 @@
#include <vector>
#include "base/logging.h"
+#include "base/memory/ptr_util.h"
#include "base/sys_byteorder.h"
#include "content/browser/renderer_host/p2p/socket_host_test_utils.h"
#include "content/browser/renderer_host/p2p/socket_host_throttler.h"
@@ -42,11 +43,14 @@ class FakeDatagramServerSocket : public net::DatagramServerSocket {
public:
typedef std::pair<net::IPEndPoint, std::vector<char> > UDPPacket;
- // P2PSocketHostUdp destroyes a socket on errors so sent packets
+ // P2PSocketHostUdp destroys a socket on errors so sent packets
// need to be stored outside of this object.
- explicit FakeDatagramServerSocket(std::deque<UDPPacket>* sent_packets)
- : sent_packets_(sent_packets) {
- }
+ FakeDatagramServerSocket(std::deque<UDPPacket>* sent_packets,
+ std::vector<uint16_t>* used_ports)
+ : sent_packets_(sent_packets),
+ recv_address_(nullptr),
+ recv_size_(0),
+ used_ports_(used_ports) {}
void Close() override {}
@@ -61,6 +65,14 @@ class FakeDatagramServerSocket : public net::DatagramServerSocket {
}
int Listen(const net::IPEndPoint& address) override {
+ if (used_ports_) {
+ for (auto used_port : *used_ports_) {
+ if (used_port == address.port())
+ return -1;
+ }
+ used_ports_->push_back(address.port());
+ }
+
address_ = address;
return 0;
}
@@ -163,8 +175,16 @@ class FakeDatagramServerSocket : public net::DatagramServerSocket {
net::IPEndPoint* recv_address_;
int recv_size_;
net::CompletionCallback recv_callback_;
+ std::vector<uint16_t>* used_ports_;
};
+std::unique_ptr<net::DatagramServerSocket> CreateFakeDatagramServerSocket(
+ std::deque<FakeDatagramServerSocket::UDPPacket>* sent_packets,
+ std::vector<uint16_t>* used_ports) {
+ return base::WrapUnique(
+ new FakeDatagramServerSocket(sent_packets, used_ports));
+}
+
} // namespace
namespace content {
@@ -177,12 +197,13 @@ class P2PSocketHostUdpTest : public testing::Test {
Send(MatchMessage(static_cast<uint32_t>(P2PMsg_OnSocketCreated::ID))))
.WillOnce(DoAll(DeleteArg<0>(), Return(true)));
- socket_host_.reset(new P2PSocketHostUdp(&sender_, 0, &throttler_));
- socket_ = new FakeDatagramServerSocket(&sent_packets_);
- socket_host_->socket_.reset(socket_);
+ socket_host_.reset(new P2PSocketHostUdp(
+ &sender_, 0, &throttler_,
+ base::Bind(&CreateFakeDatagramServerSocket, &sent_packets_, nullptr)));
local_address_ = ParseAddress(kTestLocalIpAddress, kTestPort1);
- socket_host_->Init(local_address_, P2PHostAndIPEndPoint());
+ socket_host_->Init(local_address_, 0, 0, P2PHostAndIPEndPoint());
+ socket_ = GetSocketFromHost(socket_host_.get());
dest1_ = ParseAddress(kTestIpAddress1, kTestPort1);
dest2_ = ParseAddress(kTestIpAddress2, kTestPort2);
@@ -191,9 +212,14 @@ class P2PSocketHostUdpTest : public testing::Test {
throttler_.SetTiming(std::move(timing));
}
+ static FakeDatagramServerSocket* GetSocketFromHost(
+ P2PSocketHostUdp* socket_host) {
+ return static_cast<FakeDatagramServerSocket*>(socket_host->socket_.get());
+ }
+
P2PMessageThrottler throttler_;
std::deque<FakeDatagramServerSocket::UDPPacket> sent_packets_;
- FakeDatagramServerSocket* socket_; // Owned by |socket_host_|.
+ FakeDatagramServerSocket* socket_; // Owned by |socket_host_|.
std::unique_ptr<P2PSocketHostUdp> socket_host_;
MockIPCSender sender_;
@@ -381,4 +407,101 @@ TEST_F(P2PSocketHostUdpTest, ThrottleAfterLimitAfterReceive) {
ASSERT_EQ(sent_packets_.size(), 4U);
}
+// Verify that we can open UDP sockets listening in a given port range,
+// and fail if all ports in the range are already in use.
+TEST_F(P2PSocketHostUdpTest, PortRangeImplicitPort) {
+ const uint16_t min_port = 10000;
+ const uint16_t max_port = 10001;
+ std::deque<FakeDatagramServerSocket::UDPPacket> sent_packets;
+ std::vector<uint16_t> used_ports;
+ P2PSocketHostUdp::DatagramServerSocketFactory fake_socket_factory =
+ base::Bind(&CreateFakeDatagramServerSocket, &sent_packets, &used_ports);
+ P2PMessageThrottler throttler;
+ MockIPCSender sender;
+ EXPECT_CALL(
+ sender,
+ Send(MatchMessage(static_cast<uint32_t>(P2PMsg_OnSocketCreated::ID))))
+ .Times(max_port - min_port + 1)
+ .WillRepeatedly(DoAll(DeleteArg<0>(), Return(true)));
+
+ for (unsigned port = min_port; port <= max_port; ++port) {
+ std::unique_ptr<P2PSocketHostUdp> socket_host(
+ new P2PSocketHostUdp(&sender, 0, &throttler, fake_socket_factory));
+ net::IPEndPoint local_address = ParseAddress(kTestLocalIpAddress, 0);
+ bool rv = socket_host->Init(local_address, min_port, max_port,
+ P2PHostAndIPEndPoint());
+ EXPECT_TRUE(rv);
+
+ FakeDatagramServerSocket* socket = GetSocketFromHost(socket_host.get());
+ net::IPEndPoint bound_address;
+ socket->GetLocalAddress(&bound_address);
+ EXPECT_EQ(port, bound_address.port());
+ }
+
+ EXPECT_CALL(sender,
+ Send(MatchMessage(static_cast<uint32_t>(P2PMsg_OnError::ID))))
+ .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
+ std::unique_ptr<P2PSocketHostUdp> socket_host(
+ new P2PSocketHostUdp(&sender, 0, &throttler, fake_socket_factory));
+ net::IPEndPoint local_address = ParseAddress(kTestLocalIpAddress, 0);
+ bool rv = socket_host->Init(local_address, min_port, max_port,
+ P2PHostAndIPEndPoint());
+ EXPECT_FALSE(rv);
+}
+
+// Verify that we can open a UDP socket listening in a given port included in
+// a given valid range.
+TEST_F(P2PSocketHostUdpTest, PortRangeExplictValidPort) {
+ const uint16_t min_port = 10000;
+ const uint16_t max_port = 10001;
+ const uint16_t valid_port = min_port;
+ std::deque<FakeDatagramServerSocket::UDPPacket> sent_packets;
+ std::vector<uint16_t> used_ports;
+ P2PSocketHostUdp::DatagramServerSocketFactory fake_socket_factory =
+ base::Bind(&CreateFakeDatagramServerSocket, &sent_packets, &used_ports);
+ P2PMessageThrottler throttler;
+ MockIPCSender sender;
+ EXPECT_CALL(
+ sender,
+ Send(MatchMessage(static_cast<uint32_t>(P2PMsg_OnSocketCreated::ID))))
+ .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
+
+ std::unique_ptr<P2PSocketHostUdp> socket_host(
+ new P2PSocketHostUdp(&sender, 0, &throttler, fake_socket_factory));
+ net::IPEndPoint local_address = ParseAddress(kTestLocalIpAddress, valid_port);
+ bool rv = socket_host->Init(local_address, min_port, max_port,
+ P2PHostAndIPEndPoint());
+ EXPECT_TRUE(rv);
+
+ FakeDatagramServerSocket* socket = GetSocketFromHost(socket_host.get());
+ net::IPEndPoint bound_address;
+ socket->GetLocalAddress(&bound_address);
+ EXPECT_EQ(local_address.port(), bound_address.port());
+}
+
+// Verify that we cannot open a UDP socket listening in a given port not
+// included in a given valid range.
+TEST_F(P2PSocketHostUdpTest, PortRangeExplictInvalidPort) {
+ const uint16_t min_port = 10000;
+ const uint16_t max_port = 10001;
+ const uint16_t invalid_port = max_port + 1;
+ std::deque<FakeDatagramServerSocket::UDPPacket> sent_packets;
+ std::vector<uint16_t> used_ports;
+ P2PSocketHostUdp::DatagramServerSocketFactory fake_socket_factory =
+ base::Bind(&CreateFakeDatagramServerSocket, &sent_packets, &used_ports);
+ P2PMessageThrottler throttler;
+ MockIPCSender sender;
+ EXPECT_CALL(sender,
+ Send(MatchMessage(static_cast<uint32_t>(P2PMsg_OnError::ID))))
+ .WillOnce(DoAll(DeleteArg<0>(), Return(true)));
+
+ std::unique_ptr<P2PSocketHostUdp> socket_host(
+ new P2PSocketHostUdp(&sender, 0, &throttler, fake_socket_factory));
+ net::IPEndPoint local_address =
+ ParseAddress(kTestLocalIpAddress, invalid_port);
+ bool rv = socket_host->Init(local_address, min_port, max_port,
+ P2PHostAndIPEndPoint());
+ EXPECT_FALSE(rv);
+}
+
} // namespace content
« no previous file with comments | « content/browser/renderer_host/p2p/socket_host_udp.cc ('k') | content/common/p2p_messages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698