15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/p2p/socket_host_udp.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <deque> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/sys_byteorder.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/renderer_host/p2p/socket_host_test_utils.h" 1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "content/browser/renderer_host/p2p/socket_host_throttler.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/io_buffer.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/ip_endpoint.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/udp/datagram_server_socket.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "third_party/webrtc/base/timing.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::DeleteArg; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::DoAll; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class FakeTiming : public rtc::Timing { 3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public: 3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) FakeTiming() : now_(0.0) {} 3268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual double TimerNow() OVERRIDE { return now_; } 3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void set_now(double now) { now_ = now; } 3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private: 3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) double now_; 3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeDatagramServerSocket : public net::DatagramServerSocket { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef std::pair<net::IPEndPoint, std::vector<char> > UDPPacket; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // P2PSocketHostUdp destroyes a socket on errors so sent packets 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // need to be stored outside of this object. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) explicit FakeDatagramServerSocket(std::deque<UDPPacket>* sent_packets) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : sent_packets_(sent_packets) { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Close() OVERRIDE { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetPeerAddress(net::IPEndPoint* address) const OVERRIDE { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return net::ERR_SOCKET_NOT_CONNECTED; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetLocalAddress(net::IPEndPoint* address) const OVERRIDE { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *address = address_; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int Listen(const net::IPEndPoint& address) OVERRIDE { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) address_ = address; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int RecvFrom(net::IOBuffer* buf, int buf_len, 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::IPEndPoint* address, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback) OVERRIDE { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CHECK(recv_callback_.is_null()); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (incoming_packets_.size() > 0) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer(buf); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size = std::min( 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(incoming_packets_.front().second.size()), buf_len); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(buffer->data(), &*incoming_packets_.front().second.begin(), size); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *address = incoming_packets_.front().first; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) incoming_packets_.pop_front(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return size; 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) recv_callback_ = callback; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) recv_buffer_ = buf; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) recv_size_ = buf_len; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) recv_address_ = address; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return net::ERR_IO_PENDING; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int SendTo(net::IOBuffer* buf, int buf_len, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::IPEndPoint& address, 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const net::CompletionCallback& callback) OVERRIDE { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> buffer(buf); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<char> data_vector(buffer->data(), buffer->data() + buf_len); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sent_packets_->push_back(UDPPacket(address, data_vector)); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return buf_len; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual int SetReceiveBufferSize(int32 size) OVERRIDE { 98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return net::OK; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual int SetSendBufferSize(int32 size) OVERRIDE { 102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return net::OK; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ReceivePacket(const net::IPEndPoint& address, std::vector<char> data) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!recv_callback_.is_null()) { 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int size = std::min(recv_size_, static_cast<int>(data.size())); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) memcpy(recv_buffer_->data(), &*data.begin(), size); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *recv_address_ = address; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CompletionCallback cb = recv_callback_; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) recv_callback_.Reset(); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) recv_buffer_ = NULL; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cb.Run(size); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) incoming_packets_.push_back(UDPPacket(address, data)); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual const net::BoundNetLog& NetLog() const OVERRIDE { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return net_log_; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AllowAddressReuse() OVERRIDE { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AllowBroadcast() OVERRIDE { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 131868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual int JoinGroup( 132868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const net::IPAddressNumber& group_address) const OVERRIDE { 133868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NOTIMPLEMENTED(); 134868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return net::ERR_NOT_IMPLEMENTED; 135868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 136868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 137868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual int LeaveGroup( 138868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) const net::IPAddressNumber& group_address) const OVERRIDE { 139868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NOTIMPLEMENTED(); 140868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return net::ERR_NOT_IMPLEMENTED; 141868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 142868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual int SetMulticastInterface(uint32 interface_index) OVERRIDE { 144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) NOTIMPLEMENTED(); 145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return net::ERR_NOT_IMPLEMENTED; 146a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 147a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 148868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual int SetMulticastTimeToLive(int time_to_live) OVERRIDE { 149868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NOTIMPLEMENTED(); 150868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return net::ERR_NOT_IMPLEMENTED; 151868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 152868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual int SetMulticastLoopbackMode(bool loopback) OVERRIDE { 154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NOTIMPLEMENTED(); 155868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return net::ERR_NOT_IMPLEMENTED; 156868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 157868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 1588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) virtual int SetDiffServCodePoint(net::DiffServCodePoint dscp) OVERRIDE { 1598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) NOTIMPLEMENTED(); 1608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return net::ERR_NOT_IMPLEMENTED; 1618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 1628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void DetachFromThread() OVERRIDE { 164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NOTIMPLEMENTED(); 165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) } 166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::IPEndPoint address_; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::deque<UDPPacket>* sent_packets_; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::deque<UDPPacket> incoming_packets_; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::BoundNetLog net_log_; 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<net::IOBuffer> recv_buffer_; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::IPEndPoint* recv_address_; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int recv_size_; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::CompletionCallback recv_callback_; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class P2PSocketHostUdpTest : public testing::Test { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(sender_, Send( 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatchMessage(static_cast<uint32>(P2PMsg_OnSocketCreated::ID)))) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DoAll(DeleteArg<0>(), Return(true))); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) socket_host_.reset(new P2PSocketHostUdp(&sender_, 0, &throttler_)); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socket_ = new FakeDatagramServerSocket(&sent_packets_); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socket_host_->socket_.reset(socket_); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) local_address_ = ParseAddress(kTestLocalIpAddress, kTestPort1); 195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) socket_host_->Init(local_address_, P2PHostAndIPEndPoint()); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest1_ = ParseAddress(kTestIpAddress1, kTestPort1); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dest2_ = ParseAddress(kTestIpAddress2, kTestPort2); 19968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<rtc::Timing> timing(new FakeTiming()); 20168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) throttler_.SetTiming(timing.Pass()); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) P2PMessageThrottler throttler_; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::deque<FakeDatagramServerSocket::UDPPacket> sent_packets_; 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FakeDatagramServerSocket* socket_; // Owned by |socket_host_|. 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<P2PSocketHostUdp> socket_host_; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockIPCSender sender_; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::IPEndPoint local_address_; 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::IPEndPoint dest1_; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::IPEndPoint dest2_; 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can send STUN messages before we receive anything 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from the other side. 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(P2PSocketHostUdpTest, SendStunNoAuth) { 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(sender_, Send( 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MatchMessage(static_cast<uint32>(P2PMsg_OnSendComplete::ID)))) 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .Times(3) 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillRepeatedly(DoAll(DeleteArg<0>(), Return(true))); 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::PacketOptions options; 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<char> packet1; 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateStunRequest(&packet1); 227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) socket_host_->Send(dest1_, packet1, options, 0); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<char> packet2; 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateStunResponse(&packet2); 231a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) socket_host_->Send(dest1_, packet2, options, 0); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<char> packet3; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateStunError(&packet3); 235a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) socket_host_->Send(dest1_, packet3, options, 0); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(sent_packets_.size(), 3U); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(sent_packets_[0].second, packet1); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(sent_packets_[1].second, packet2); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(sent_packets_[2].second, packet3); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that no data packets can be sent before STUN binding has 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// finished. 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(P2PSocketHostUdpTest, SendDataNoAuth) { 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(sender_, Send( 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatchMessage(static_cast<uint32>(P2PMsg_OnError::ID)))) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DoAll(DeleteArg<0>(), Return(true))); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::PacketOptions options; 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<char> packet; 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateRandomPacket(&packet); 253a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) socket_host_->Send(dest1_, packet, options, 0); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(sent_packets_.size(), 0U); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can send data after we've received STUN request 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from the other side. 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(P2PSocketHostUdpTest, SendAfterStunRequest) { 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Receive packet from |dest1_|. 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<char> request_packet; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateStunRequest(&request_packet); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(sender_, Send(MatchPacketMessage(request_packet))) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DoAll(DeleteArg<0>(), Return(true))); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socket_->ReceivePacket(dest1_, request_packet); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now we should be able to send any data to |dest1_|. 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(sender_, Send( 271c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MatchMessage(static_cast<uint32>(P2PMsg_OnSendComplete::ID)))) 272c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(DoAll(DeleteArg<0>(), Return(true))); 273a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::PacketOptions options; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<char> packet; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateRandomPacket(&packet); 277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) socket_host_->Send(dest1_, packet, options, 0); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, sent_packets_.size()); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(dest1_, sent_packets_[0].first); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify that we can send data after we've received STUN response 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// from the other side. 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(P2PSocketHostUdpTest, SendAfterStunResponse) { 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Receive packet from |dest1_|. 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<char> request_packet; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateStunRequest(&request_packet); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(sender_, Send(MatchPacketMessage(request_packet))) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DoAll(DeleteArg<0>(), Return(true))); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socket_->ReceivePacket(dest1_, request_packet); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Now we should be able to send any data to |dest1_|. 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(sender_, Send( 296c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) MatchMessage(static_cast<uint32>(P2PMsg_OnSendComplete::ID)))) 297c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillOnce(DoAll(DeleteArg<0>(), Return(true))); 298a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::PacketOptions options; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<char> packet; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateRandomPacket(&packet); 302a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) socket_host_->Send(dest1_, packet, options, 0); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1U, sent_packets_.size()); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(dest1_, sent_packets_[0].first); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verify messages still cannot be sent to an unathorized host after 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// successful binding with different host. 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(P2PSocketHostUdpTest, SendAfterStunResponseDifferentHost) { 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Receive packet from |dest1_|. 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<char> request_packet; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateStunRequest(&request_packet); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(sender_, Send(MatchPacketMessage(request_packet))) 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DoAll(DeleteArg<0>(), Return(true))); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) socket_->ReceivePacket(dest1_, request_packet); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Should fail when trying to send the same packet to |dest2_|. 3205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::PacketOptions options; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<char> packet; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateRandomPacket(&packet); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(sender_, Send( 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MatchMessage(static_cast<uint32>(P2PMsg_OnError::ID)))) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillOnce(DoAll(DeleteArg<0>(), Return(true))); 326a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) socket_host_->Send(dest2_, packet, options, 0); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 32968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Verify throttler not allowing unlimited sending of ICE messages to 33068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// any destination. 33168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(P2PSocketHostUdpTest, ThrottleAfterLimit) { 33268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_CALL(sender_, Send( 33368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) MatchMessage(static_cast<uint32>(P2PMsg_OnSendComplete::ID)))) 33468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) .Times(2) 33568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) .WillRepeatedly(DoAll(DeleteArg<0>(), Return(true))); 33668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::PacketOptions options; 33868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<char> packet1; 33968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CreateStunRequest(&packet1); 34068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) throttler_.SetSendIceBandwidth(packet1.size() * 2); 341a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) socket_host_->Send(dest1_, packet1, options, 0); 342a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) socket_host_->Send(dest2_, packet1, options, 0); 34368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 34468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) net::IPEndPoint dest3 = ParseAddress(kTestIpAddress1, 2222); 34568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // This packet must be dropped by the throttler. 346a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) socket_host_->Send(dest3, packet1, options, 0); 34768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_EQ(sent_packets_.size(), 2U); 34868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 34968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 35068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Verify we can send packets to a known destination when ICE throttling is 35168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// active. 35268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(P2PSocketHostUdpTest, ThrottleAfterLimitAfterReceive) { 35368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Receive packet from |dest1_|. 35468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<char> request_packet; 35568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CreateStunRequest(&request_packet); 35668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 35768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_CALL(sender_, Send(MatchPacketMessage(request_packet))) 35868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) .WillOnce(DoAll(DeleteArg<0>(), Return(true))); 35968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) socket_->ReceivePacket(dest1_, request_packet); 36068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 36168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) EXPECT_CALL(sender_, Send( 36268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) MatchMessage(static_cast<uint32>(P2PMsg_OnSendComplete::ID)))) 36368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) .Times(4) 36468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) .WillRepeatedly(DoAll(DeleteArg<0>(), Return(true))); 36568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) rtc::PacketOptions options; 36768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) std::vector<char> packet1; 36868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) CreateStunRequest(&packet1); 36968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) throttler_.SetSendIceBandwidth(packet1.size()); 37068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // |dest1_| is known address, throttling will not be applied. 371a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) socket_host_->Send(dest1_, packet1, options, 0); 37268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Trying to send the packet to dest1_ in the same window. It should go. 373a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) socket_host_->Send(dest1_, packet1, options, 0); 37468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 37568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Throttler should allow this packet to go through. 376a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) socket_host_->Send(dest2_, packet1, options, 0); 37768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 37868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) net::IPEndPoint dest3 = ParseAddress(kTestIpAddress1, 2223); 37968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // This packet will be dropped, as limit only for a single packet. 380a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) socket_host_->Send(dest3, packet1, options, 0); 38168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) net::IPEndPoint dest4 = ParseAddress(kTestIpAddress1, 2224); 38268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // This packet should also be dropped. 383a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) socket_host_->Send(dest4, packet1, options, 0); 38468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // |dest1| is known, we can send as many packets to it. 385a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) socket_host_->Send(dest1_, packet1, options, 0); 38668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ASSERT_EQ(sent_packets_.size(), 4U); 38768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 38868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 390