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