1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/browser/renderer_host/p2p/socket_host_udp.h"
10 #include "base/logging.h"
11 #include "base/sys_byteorder.h"
12 #include "content/browser/renderer_host/p2p/socket_host_test_utils.h"
13 #include "content/browser/renderer_host/p2p/socket_host_throttler.h"
14 #include "net/base/io_buffer.h"
15 #include "net/base/ip_endpoint.h"
16 #include "net/base/net_errors.h"
17 #include "net/udp/datagram_server_socket.h"
18 #include "testing/gmock/include/gmock/gmock.h"
19 #include "testing/gtest/include/gtest/gtest.h"
20 #include "third_party/webrtc/base/timing.h"
23 using ::testing::DeleteArg
;
24 using ::testing::DoAll
;
25 using ::testing::Return
;
29 class FakeTiming
: public rtc::Timing
{
31 FakeTiming() : now_(0.0) {}
32 double TimerNow() override
{ return now_
; }
33 void set_now(double now
) { now_
= now
; }
39 class FakeDatagramServerSocket
: public net::DatagramServerSocket
{
41 typedef std::pair
<net::IPEndPoint
, std::vector
<char> > UDPPacket
;
43 // P2PSocketHostUdp destroyes a socket on errors so sent packets
44 // need to be stored outside of this object.
45 explicit FakeDatagramServerSocket(std::deque
<UDPPacket
>* sent_packets
)
46 : sent_packets_(sent_packets
) {
49 void Close() override
{}
51 int GetPeerAddress(net::IPEndPoint
* address
) const override
{
53 return net::ERR_SOCKET_NOT_CONNECTED
;
56 int GetLocalAddress(net::IPEndPoint
* address
) const override
{
61 int Listen(const net::IPEndPoint
& address
) override
{
66 int RecvFrom(net::IOBuffer
* buf
,
68 net::IPEndPoint
* address
,
69 const net::CompletionCallback
& callback
) override
{
70 CHECK(recv_callback_
.is_null());
71 if (incoming_packets_
.size() > 0) {
72 scoped_refptr
<net::IOBuffer
> buffer(buf
);
74 static_cast<int>(incoming_packets_
.front().second
.size()), buf_len
);
75 memcpy(buffer
->data(), &*incoming_packets_
.front().second
.begin(), size
);
76 *address
= incoming_packets_
.front().first
;
77 incoming_packets_
.pop_front();
80 recv_callback_
= callback
;
83 recv_address_
= address
;
84 return net::ERR_IO_PENDING
;
88 int SendTo(net::IOBuffer
* buf
,
90 const net::IPEndPoint
& address
,
91 const net::CompletionCallback
& callback
) override
{
92 scoped_refptr
<net::IOBuffer
> buffer(buf
);
93 std::vector
<char> data_vector(buffer
->data(), buffer
->data() + buf_len
);
94 sent_packets_
->push_back(UDPPacket(address
, data_vector
));
98 int SetReceiveBufferSize(int32 size
) override
{ return net::OK
; }
100 int SetSendBufferSize(int32 size
) override
{ return net::OK
; }
102 void ReceivePacket(const net::IPEndPoint
& address
, std::vector
<char> data
) {
103 if (!recv_callback_
.is_null()) {
104 int size
= std::min(recv_size_
, static_cast<int>(data
.size()));
105 memcpy(recv_buffer_
->data(), &*data
.begin(), size
);
106 *recv_address_
= address
;
107 net::CompletionCallback cb
= recv_callback_
;
108 recv_callback_
.Reset();
112 incoming_packets_
.push_back(UDPPacket(address
, data
));
116 const net::BoundNetLog
& NetLog() const override
{ return net_log_
; }
118 void AllowAddressReuse() override
{ NOTIMPLEMENTED(); }
120 void AllowBroadcast() override
{ NOTIMPLEMENTED(); }
122 int JoinGroup(const net::IPAddressNumber
& group_address
) const override
{
124 return net::ERR_NOT_IMPLEMENTED
;
127 int LeaveGroup(const net::IPAddressNumber
& group_address
) const override
{
129 return net::ERR_NOT_IMPLEMENTED
;
132 int SetMulticastInterface(uint32 interface_index
) override
{
134 return net::ERR_NOT_IMPLEMENTED
;
137 int SetMulticastTimeToLive(int time_to_live
) override
{
139 return net::ERR_NOT_IMPLEMENTED
;
142 int SetMulticastLoopbackMode(bool loopback
) override
{
144 return net::ERR_NOT_IMPLEMENTED
;
147 int SetDiffServCodePoint(net::DiffServCodePoint dscp
) override
{
149 return net::ERR_NOT_IMPLEMENTED
;
152 void DetachFromThread() override
{ NOTIMPLEMENTED(); }
155 net::IPEndPoint address_
;
156 std::deque
<UDPPacket
>* sent_packets_
;
157 std::deque
<UDPPacket
> incoming_packets_
;
158 net::BoundNetLog net_log_
;
160 scoped_refptr
<net::IOBuffer
> recv_buffer_
;
161 net::IPEndPoint
* recv_address_
;
163 net::CompletionCallback recv_callback_
;
170 class P2PSocketHostUdpTest
: public testing::Test
{
172 void SetUp() override
{
173 EXPECT_CALL(sender_
, Send(
174 MatchMessage(static_cast<uint32
>(P2PMsg_OnSocketCreated::ID
))))
175 .WillOnce(DoAll(DeleteArg
<0>(), Return(true)));
177 socket_host_
.reset(new P2PSocketHostUdp(&sender_
, 0, &throttler_
));
178 socket_
= new FakeDatagramServerSocket(&sent_packets_
);
179 socket_host_
->socket_
.reset(socket_
);
181 local_address_
= ParseAddress(kTestLocalIpAddress
, kTestPort1
);
182 socket_host_
->Init(local_address_
, P2PHostAndIPEndPoint());
184 dest1_
= ParseAddress(kTestIpAddress1
, kTestPort1
);
185 dest2_
= ParseAddress(kTestIpAddress2
, kTestPort2
);
187 scoped_ptr
<rtc::Timing
> timing(new FakeTiming());
188 throttler_
.SetTiming(timing
.Pass());
191 P2PMessageThrottler throttler_
;
192 std::deque
<FakeDatagramServerSocket::UDPPacket
> sent_packets_
;
193 FakeDatagramServerSocket
* socket_
; // Owned by |socket_host_|.
194 scoped_ptr
<P2PSocketHostUdp
> socket_host_
;
195 MockIPCSender sender_
;
197 net::IPEndPoint local_address_
;
199 net::IPEndPoint dest1_
;
200 net::IPEndPoint dest2_
;
203 // Verify that we can send STUN messages before we receive anything
204 // from the other side.
205 TEST_F(P2PSocketHostUdpTest
, SendStunNoAuth
) {
206 EXPECT_CALL(sender_
, Send(
207 MatchMessage(static_cast<uint32
>(P2PMsg_OnSendComplete::ID
))))
209 .WillRepeatedly(DoAll(DeleteArg
<0>(), Return(true)));
211 rtc::PacketOptions options
;
212 std::vector
<char> packet1
;
213 CreateStunRequest(&packet1
);
214 socket_host_
->Send(dest1_
, packet1
, options
, 0);
216 std::vector
<char> packet2
;
217 CreateStunResponse(&packet2
);
218 socket_host_
->Send(dest1_
, packet2
, options
, 0);
220 std::vector
<char> packet3
;
221 CreateStunError(&packet3
);
222 socket_host_
->Send(dest1_
, packet3
, options
, 0);
224 ASSERT_EQ(sent_packets_
.size(), 3U);
225 ASSERT_EQ(sent_packets_
[0].second
, packet1
);
226 ASSERT_EQ(sent_packets_
[1].second
, packet2
);
227 ASSERT_EQ(sent_packets_
[2].second
, packet3
);
230 // Verify that no data packets can be sent before STUN binding has
232 TEST_F(P2PSocketHostUdpTest
, SendDataNoAuth
) {
233 EXPECT_CALL(sender_
, Send(
234 MatchMessage(static_cast<uint32
>(P2PMsg_OnError::ID
))))
235 .WillOnce(DoAll(DeleteArg
<0>(), Return(true)));
237 rtc::PacketOptions options
;
238 std::vector
<char> packet
;
239 CreateRandomPacket(&packet
);
240 socket_host_
->Send(dest1_
, packet
, options
, 0);
242 ASSERT_EQ(sent_packets_
.size(), 0U);
245 // Verify that we can send data after we've received STUN request
246 // from the other side.
247 TEST_F(P2PSocketHostUdpTest
, SendAfterStunRequest
) {
248 // Receive packet from |dest1_|.
249 std::vector
<char> request_packet
;
250 CreateStunRequest(&request_packet
);
252 EXPECT_CALL(sender_
, Send(MatchPacketMessage(request_packet
)))
253 .WillOnce(DoAll(DeleteArg
<0>(), Return(true)));
254 socket_
->ReceivePacket(dest1_
, request_packet
);
256 // Now we should be able to send any data to |dest1_|.
257 EXPECT_CALL(sender_
, Send(
258 MatchMessage(static_cast<uint32
>(P2PMsg_OnSendComplete::ID
))))
259 .WillOnce(DoAll(DeleteArg
<0>(), Return(true)));
261 rtc::PacketOptions options
;
262 std::vector
<char> packet
;
263 CreateRandomPacket(&packet
);
264 socket_host_
->Send(dest1_
, packet
, options
, 0);
266 ASSERT_EQ(1U, sent_packets_
.size());
267 ASSERT_EQ(dest1_
, sent_packets_
[0].first
);
270 // Verify that we can send data after we've received STUN response
271 // from the other side.
272 TEST_F(P2PSocketHostUdpTest
, SendAfterStunResponse
) {
273 // Receive packet from |dest1_|.
274 std::vector
<char> request_packet
;
275 CreateStunRequest(&request_packet
);
277 EXPECT_CALL(sender_
, Send(MatchPacketMessage(request_packet
)))
278 .WillOnce(DoAll(DeleteArg
<0>(), Return(true)));
279 socket_
->ReceivePacket(dest1_
, request_packet
);
281 // Now we should be able to send any data to |dest1_|.
282 EXPECT_CALL(sender_
, Send(
283 MatchMessage(static_cast<uint32
>(P2PMsg_OnSendComplete::ID
))))
284 .WillOnce(DoAll(DeleteArg
<0>(), Return(true)));
286 rtc::PacketOptions options
;
287 std::vector
<char> packet
;
288 CreateRandomPacket(&packet
);
289 socket_host_
->Send(dest1_
, packet
, options
, 0);
291 ASSERT_EQ(1U, sent_packets_
.size());
292 ASSERT_EQ(dest1_
, sent_packets_
[0].first
);
295 // Verify messages still cannot be sent to an unathorized host after
296 // successful binding with different host.
297 TEST_F(P2PSocketHostUdpTest
, SendAfterStunResponseDifferentHost
) {
298 // Receive packet from |dest1_|.
299 std::vector
<char> request_packet
;
300 CreateStunRequest(&request_packet
);
302 EXPECT_CALL(sender_
, Send(MatchPacketMessage(request_packet
)))
303 .WillOnce(DoAll(DeleteArg
<0>(), Return(true)));
304 socket_
->ReceivePacket(dest1_
, request_packet
);
306 // Should fail when trying to send the same packet to |dest2_|.
307 rtc::PacketOptions options
;
308 std::vector
<char> packet
;
309 CreateRandomPacket(&packet
);
310 EXPECT_CALL(sender_
, Send(
311 MatchMessage(static_cast<uint32
>(P2PMsg_OnError::ID
))))
312 .WillOnce(DoAll(DeleteArg
<0>(), Return(true)));
313 socket_host_
->Send(dest2_
, packet
, options
, 0);
316 // Verify throttler not allowing unlimited sending of ICE messages to
318 TEST_F(P2PSocketHostUdpTest
, ThrottleAfterLimit
) {
319 EXPECT_CALL(sender_
, Send(
320 MatchMessage(static_cast<uint32
>(P2PMsg_OnSendComplete::ID
))))
322 .WillRepeatedly(DoAll(DeleteArg
<0>(), Return(true)));
324 rtc::PacketOptions options
;
325 std::vector
<char> packet1
;
326 CreateStunRequest(&packet1
);
327 throttler_
.SetSendIceBandwidth(packet1
.size() * 2);
328 socket_host_
->Send(dest1_
, packet1
, options
, 0);
329 socket_host_
->Send(dest2_
, packet1
, options
, 0);
331 net::IPEndPoint dest3
= ParseAddress(kTestIpAddress1
, 2222);
332 // This packet must be dropped by the throttler.
333 socket_host_
->Send(dest3
, packet1
, options
, 0);
334 ASSERT_EQ(sent_packets_
.size(), 2U);
337 // Verify we can send packets to a known destination when ICE throttling is
339 TEST_F(P2PSocketHostUdpTest
, ThrottleAfterLimitAfterReceive
) {
340 // Receive packet from |dest1_|.
341 std::vector
<char> request_packet
;
342 CreateStunRequest(&request_packet
);
344 EXPECT_CALL(sender_
, Send(MatchPacketMessage(request_packet
)))
345 .WillOnce(DoAll(DeleteArg
<0>(), Return(true)));
346 socket_
->ReceivePacket(dest1_
, request_packet
);
348 EXPECT_CALL(sender_
, Send(
349 MatchMessage(static_cast<uint32
>(P2PMsg_OnSendComplete::ID
))))
351 .WillRepeatedly(DoAll(DeleteArg
<0>(), Return(true)));
353 rtc::PacketOptions options
;
354 std::vector
<char> packet1
;
355 CreateStunRequest(&packet1
);
356 throttler_
.SetSendIceBandwidth(packet1
.size());
357 // |dest1_| is known address, throttling will not be applied.
358 socket_host_
->Send(dest1_
, packet1
, options
, 0);
359 // Trying to send the packet to dest1_ in the same window. It should go.
360 socket_host_
->Send(dest1_
, packet1
, options
, 0);
362 // Throttler should allow this packet to go through.
363 socket_host_
->Send(dest2_
, packet1
, options
, 0);
365 net::IPEndPoint dest3
= ParseAddress(kTestIpAddress1
, 2223);
366 // This packet will be dropped, as limit only for a single packet.
367 socket_host_
->Send(dest3
, packet1
, options
, 0);
368 net::IPEndPoint dest4
= ParseAddress(kTestIpAddress1
, 2224);
369 // This packet should also be dropped.
370 socket_host_
->Send(dest4
, packet1
, options
, 0);
371 // |dest1| is known, we can send as many packets to it.
372 socket_host_
->Send(dest1_
, packet1
, options
, 0);
373 ASSERT_EQ(sent_packets_
.size(), 4U);
376 } // namespace content