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 virtual 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 virtual void Close() OVERRIDE
{
52 virtual int GetPeerAddress(net::IPEndPoint
* address
) const OVERRIDE
{
54 return net::ERR_SOCKET_NOT_CONNECTED
;
57 virtual int GetLocalAddress(net::IPEndPoint
* address
) const OVERRIDE
{
62 virtual int Listen(const net::IPEndPoint
& address
) OVERRIDE
{
67 virtual int RecvFrom(net::IOBuffer
* buf
, int buf_len
,
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 virtual int SendTo(net::IOBuffer
* buf
, int buf_len
,
89 const net::IPEndPoint
& address
,
90 const net::CompletionCallback
& callback
) OVERRIDE
{
91 scoped_refptr
<net::IOBuffer
> buffer(buf
);
92 std::vector
<char> data_vector(buffer
->data(), buffer
->data() + buf_len
);
93 sent_packets_
->push_back(UDPPacket(address
, data_vector
));
97 virtual int SetReceiveBufferSize(int32 size
) OVERRIDE
{
101 virtual int SetSendBufferSize(int32 size
) OVERRIDE
{
105 void ReceivePacket(const net::IPEndPoint
& address
, std::vector
<char> data
) {
106 if (!recv_callback_
.is_null()) {
107 int size
= std::min(recv_size_
, static_cast<int>(data
.size()));
108 memcpy(recv_buffer_
->data(), &*data
.begin(), size
);
109 *recv_address_
= address
;
110 net::CompletionCallback cb
= recv_callback_
;
111 recv_callback_
.Reset();
115 incoming_packets_
.push_back(UDPPacket(address
, data
));
119 virtual const net::BoundNetLog
& NetLog() const OVERRIDE
{
123 virtual void AllowAddressReuse() OVERRIDE
{
127 virtual void AllowBroadcast() OVERRIDE
{
131 virtual int JoinGroup(
132 const net::IPAddressNumber
& group_address
) const OVERRIDE
{
134 return net::ERR_NOT_IMPLEMENTED
;
137 virtual int LeaveGroup(
138 const net::IPAddressNumber
& group_address
) const OVERRIDE
{
140 return net::ERR_NOT_IMPLEMENTED
;
143 virtual int SetMulticastInterface(uint32 interface_index
) OVERRIDE
{
145 return net::ERR_NOT_IMPLEMENTED
;
148 virtual int SetMulticastTimeToLive(int time_to_live
) OVERRIDE
{
150 return net::ERR_NOT_IMPLEMENTED
;
153 virtual int SetMulticastLoopbackMode(bool loopback
) OVERRIDE
{
155 return net::ERR_NOT_IMPLEMENTED
;
158 virtual int SetDiffServCodePoint(net::DiffServCodePoint dscp
) OVERRIDE
{
160 return net::ERR_NOT_IMPLEMENTED
;
163 virtual void DetachFromThread() OVERRIDE
{
168 net::IPEndPoint address_
;
169 std::deque
<UDPPacket
>* sent_packets_
;
170 std::deque
<UDPPacket
> incoming_packets_
;
171 net::BoundNetLog net_log_
;
173 scoped_refptr
<net::IOBuffer
> recv_buffer_
;
174 net::IPEndPoint
* recv_address_
;
176 net::CompletionCallback recv_callback_
;
183 class P2PSocketHostUdpTest
: public testing::Test
{
185 virtual void SetUp() OVERRIDE
{
186 EXPECT_CALL(sender_
, Send(
187 MatchMessage(static_cast<uint32
>(P2PMsg_OnSocketCreated::ID
))))
188 .WillOnce(DoAll(DeleteArg
<0>(), Return(true)));
190 socket_host_
.reset(new P2PSocketHostUdp(&sender_
, 0, &throttler_
));
191 socket_
= new FakeDatagramServerSocket(&sent_packets_
);
192 socket_host_
->socket_
.reset(socket_
);
194 local_address_
= ParseAddress(kTestLocalIpAddress
, kTestPort1
);
195 socket_host_
->Init(local_address_
, P2PHostAndIPEndPoint());
197 dest1_
= ParseAddress(kTestIpAddress1
, kTestPort1
);
198 dest2_
= ParseAddress(kTestIpAddress2
, kTestPort2
);
200 scoped_ptr
<rtc::Timing
> timing(new FakeTiming());
201 throttler_
.SetTiming(timing
.Pass());
204 P2PMessageThrottler throttler_
;
205 std::deque
<FakeDatagramServerSocket::UDPPacket
> sent_packets_
;
206 FakeDatagramServerSocket
* socket_
; // Owned by |socket_host_|.
207 scoped_ptr
<P2PSocketHostUdp
> socket_host_
;
208 MockIPCSender sender_
;
210 net::IPEndPoint local_address_
;
212 net::IPEndPoint dest1_
;
213 net::IPEndPoint dest2_
;
216 // Verify that we can send STUN messages before we receive anything
217 // from the other side.
218 TEST_F(P2PSocketHostUdpTest
, SendStunNoAuth
) {
219 EXPECT_CALL(sender_
, Send(
220 MatchMessage(static_cast<uint32
>(P2PMsg_OnSendComplete::ID
))))
222 .WillRepeatedly(DoAll(DeleteArg
<0>(), Return(true)));
224 rtc::PacketOptions options
;
225 std::vector
<char> packet1
;
226 CreateStunRequest(&packet1
);
227 socket_host_
->Send(dest1_
, packet1
, options
, 0);
229 std::vector
<char> packet2
;
230 CreateStunResponse(&packet2
);
231 socket_host_
->Send(dest1_
, packet2
, options
, 0);
233 std::vector
<char> packet3
;
234 CreateStunError(&packet3
);
235 socket_host_
->Send(dest1_
, packet3
, options
, 0);
237 ASSERT_EQ(sent_packets_
.size(), 3U);
238 ASSERT_EQ(sent_packets_
[0].second
, packet1
);
239 ASSERT_EQ(sent_packets_
[1].second
, packet2
);
240 ASSERT_EQ(sent_packets_
[2].second
, packet3
);
243 // Verify that no data packets can be sent before STUN binding has
245 TEST_F(P2PSocketHostUdpTest
, SendDataNoAuth
) {
246 EXPECT_CALL(sender_
, Send(
247 MatchMessage(static_cast<uint32
>(P2PMsg_OnError::ID
))))
248 .WillOnce(DoAll(DeleteArg
<0>(), Return(true)));
250 rtc::PacketOptions options
;
251 std::vector
<char> packet
;
252 CreateRandomPacket(&packet
);
253 socket_host_
->Send(dest1_
, packet
, options
, 0);
255 ASSERT_EQ(sent_packets_
.size(), 0U);
258 // Verify that we can send data after we've received STUN request
259 // from the other side.
260 TEST_F(P2PSocketHostUdpTest
, SendAfterStunRequest
) {
261 // Receive packet from |dest1_|.
262 std::vector
<char> request_packet
;
263 CreateStunRequest(&request_packet
);
265 EXPECT_CALL(sender_
, Send(MatchPacketMessage(request_packet
)))
266 .WillOnce(DoAll(DeleteArg
<0>(), Return(true)));
267 socket_
->ReceivePacket(dest1_
, request_packet
);
269 // Now we should be able to send any data to |dest1_|.
270 EXPECT_CALL(sender_
, Send(
271 MatchMessage(static_cast<uint32
>(P2PMsg_OnSendComplete::ID
))))
272 .WillOnce(DoAll(DeleteArg
<0>(), Return(true)));
274 rtc::PacketOptions options
;
275 std::vector
<char> packet
;
276 CreateRandomPacket(&packet
);
277 socket_host_
->Send(dest1_
, packet
, options
, 0);
279 ASSERT_EQ(1U, sent_packets_
.size());
280 ASSERT_EQ(dest1_
, sent_packets_
[0].first
);
283 // Verify that we can send data after we've received STUN response
284 // from the other side.
285 TEST_F(P2PSocketHostUdpTest
, SendAfterStunResponse
) {
286 // Receive packet from |dest1_|.
287 std::vector
<char> request_packet
;
288 CreateStunRequest(&request_packet
);
290 EXPECT_CALL(sender_
, Send(MatchPacketMessage(request_packet
)))
291 .WillOnce(DoAll(DeleteArg
<0>(), Return(true)));
292 socket_
->ReceivePacket(dest1_
, request_packet
);
294 // Now we should be able to send any data to |dest1_|.
295 EXPECT_CALL(sender_
, Send(
296 MatchMessage(static_cast<uint32
>(P2PMsg_OnSendComplete::ID
))))
297 .WillOnce(DoAll(DeleteArg
<0>(), Return(true)));
299 rtc::PacketOptions options
;
300 std::vector
<char> packet
;
301 CreateRandomPacket(&packet
);
302 socket_host_
->Send(dest1_
, packet
, options
, 0);
304 ASSERT_EQ(1U, sent_packets_
.size());
305 ASSERT_EQ(dest1_
, sent_packets_
[0].first
);
308 // Verify messages still cannot be sent to an unathorized host after
309 // successful binding with different host.
310 TEST_F(P2PSocketHostUdpTest
, SendAfterStunResponseDifferentHost
) {
311 // Receive packet from |dest1_|.
312 std::vector
<char> request_packet
;
313 CreateStunRequest(&request_packet
);
315 EXPECT_CALL(sender_
, Send(MatchPacketMessage(request_packet
)))
316 .WillOnce(DoAll(DeleteArg
<0>(), Return(true)));
317 socket_
->ReceivePacket(dest1_
, request_packet
);
319 // Should fail when trying to send the same packet to |dest2_|.
320 rtc::PacketOptions options
;
321 std::vector
<char> packet
;
322 CreateRandomPacket(&packet
);
323 EXPECT_CALL(sender_
, Send(
324 MatchMessage(static_cast<uint32
>(P2PMsg_OnError::ID
))))
325 .WillOnce(DoAll(DeleteArg
<0>(), Return(true)));
326 socket_host_
->Send(dest2_
, packet
, options
, 0);
329 // Verify throttler not allowing unlimited sending of ICE messages to
331 TEST_F(P2PSocketHostUdpTest
, ThrottleAfterLimit
) {
332 EXPECT_CALL(sender_
, Send(
333 MatchMessage(static_cast<uint32
>(P2PMsg_OnSendComplete::ID
))))
335 .WillRepeatedly(DoAll(DeleteArg
<0>(), Return(true)));
337 rtc::PacketOptions options
;
338 std::vector
<char> packet1
;
339 CreateStunRequest(&packet1
);
340 throttler_
.SetSendIceBandwidth(packet1
.size() * 2);
341 socket_host_
->Send(dest1_
, packet1
, options
, 0);
342 socket_host_
->Send(dest2_
, packet1
, options
, 0);
344 net::IPEndPoint dest3
= ParseAddress(kTestIpAddress1
, 2222);
345 // This packet must be dropped by the throttler.
346 socket_host_
->Send(dest3
, packet1
, options
, 0);
347 ASSERT_EQ(sent_packets_
.size(), 2U);
350 // Verify we can send packets to a known destination when ICE throttling is
352 TEST_F(P2PSocketHostUdpTest
, ThrottleAfterLimitAfterReceive
) {
353 // Receive packet from |dest1_|.
354 std::vector
<char> request_packet
;
355 CreateStunRequest(&request_packet
);
357 EXPECT_CALL(sender_
, Send(MatchPacketMessage(request_packet
)))
358 .WillOnce(DoAll(DeleteArg
<0>(), Return(true)));
359 socket_
->ReceivePacket(dest1_
, request_packet
);
361 EXPECT_CALL(sender_
, Send(
362 MatchMessage(static_cast<uint32
>(P2PMsg_OnSendComplete::ID
))))
364 .WillRepeatedly(DoAll(DeleteArg
<0>(), Return(true)));
366 rtc::PacketOptions options
;
367 std::vector
<char> packet1
;
368 CreateStunRequest(&packet1
);
369 throttler_
.SetSendIceBandwidth(packet1
.size());
370 // |dest1_| is known address, throttling will not be applied.
371 socket_host_
->Send(dest1_
, packet1
, options
, 0);
372 // Trying to send the packet to dest1_ in the same window. It should go.
373 socket_host_
->Send(dest1_
, packet1
, options
, 0);
375 // Throttler should allow this packet to go through.
376 socket_host_
->Send(dest2_
, packet1
, options
, 0);
378 net::IPEndPoint dest3
= ParseAddress(kTestIpAddress1
, 2223);
379 // This packet will be dropped, as limit only for a single packet.
380 socket_host_
->Send(dest3
, packet1
, options
, 0);
381 net::IPEndPoint dest4
= ParseAddress(kTestIpAddress1
, 2224);
382 // This packet should also be dropped.
383 socket_host_
->Send(dest4
, packet1
, options
, 0);
384 // |dest1| is known, we can send as many packets to it.
385 socket_host_
->Send(dest1_
, packet1
, options
, 0);
386 ASSERT_EQ(sent_packets_
.size(), 4U);
389 } // namespace content