| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/renderer_host/p2p/socket_host_udp.h" | 5 #include "content/browser/renderer_host/p2p/socket_host_udp.h" |
| 6 | 6 |
| 7 #include <deque> | 7 #include <deque> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 using ::testing::_; | 22 using ::testing::_; |
| 23 using ::testing::DeleteArg; | 23 using ::testing::DeleteArg; |
| 24 using ::testing::DoAll; | 24 using ::testing::DoAll; |
| 25 using ::testing::Return; | 25 using ::testing::Return; |
| 26 | 26 |
| 27 namespace { | 27 namespace { |
| 28 | 28 |
| 29 class FakeTiming : public rtc::Timing { | 29 class FakeTiming : public rtc::Timing { |
| 30 public: | 30 public: |
| 31 FakeTiming() : now_(0.0) {} | 31 FakeTiming() : now_(0.0) {} |
| 32 virtual double TimerNow() override { return now_; } | 32 double TimerNow() override { return now_; } |
| 33 void set_now(double now) { now_ = now; } | 33 void set_now(double now) { now_ = now; } |
| 34 | 34 |
| 35 private: | 35 private: |
| 36 double now_; | 36 double now_; |
| 37 }; | 37 }; |
| 38 | 38 |
| 39 class FakeDatagramServerSocket : public net::DatagramServerSocket { | 39 class FakeDatagramServerSocket : public net::DatagramServerSocket { |
| 40 public: | 40 public: |
| 41 typedef std::pair<net::IPEndPoint, std::vector<char> > UDPPacket; | 41 typedef std::pair<net::IPEndPoint, std::vector<char> > UDPPacket; |
| 42 | 42 |
| 43 // P2PSocketHostUdp destroyes a socket on errors so sent packets | 43 // P2PSocketHostUdp destroyes a socket on errors so sent packets |
| 44 // need to be stored outside of this object. | 44 // need to be stored outside of this object. |
| 45 explicit FakeDatagramServerSocket(std::deque<UDPPacket>* sent_packets) | 45 explicit FakeDatagramServerSocket(std::deque<UDPPacket>* sent_packets) |
| 46 : sent_packets_(sent_packets) { | 46 : sent_packets_(sent_packets) { |
| 47 } | 47 } |
| 48 | 48 |
| 49 virtual void Close() override { | 49 void Close() override {} |
| 50 } | |
| 51 | 50 |
| 52 virtual int GetPeerAddress(net::IPEndPoint* address) const override { | 51 int GetPeerAddress(net::IPEndPoint* address) const override { |
| 53 NOTREACHED(); | 52 NOTREACHED(); |
| 54 return net::ERR_SOCKET_NOT_CONNECTED; | 53 return net::ERR_SOCKET_NOT_CONNECTED; |
| 55 } | 54 } |
| 56 | 55 |
| 57 virtual int GetLocalAddress(net::IPEndPoint* address) const override { | 56 int GetLocalAddress(net::IPEndPoint* address) const override { |
| 58 *address = address_; | 57 *address = address_; |
| 59 return 0; | 58 return 0; |
| 60 } | 59 } |
| 61 | 60 |
| 62 virtual int Listen(const net::IPEndPoint& address) override { | 61 int Listen(const net::IPEndPoint& address) override { |
| 63 address_ = address; | 62 address_ = address; |
| 64 return 0; | 63 return 0; |
| 65 } | 64 } |
| 66 | 65 |
| 67 virtual int RecvFrom(net::IOBuffer* buf, int buf_len, | 66 int RecvFrom(net::IOBuffer* buf, |
| 68 net::IPEndPoint* address, | 67 int buf_len, |
| 69 const net::CompletionCallback& callback) override { | 68 net::IPEndPoint* address, |
| 69 const net::CompletionCallback& callback) override { |
| 70 CHECK(recv_callback_.is_null()); | 70 CHECK(recv_callback_.is_null()); |
| 71 if (incoming_packets_.size() > 0) { | 71 if (incoming_packets_.size() > 0) { |
| 72 scoped_refptr<net::IOBuffer> buffer(buf); | 72 scoped_refptr<net::IOBuffer> buffer(buf); |
| 73 int size = std::min( | 73 int size = std::min( |
| 74 static_cast<int>(incoming_packets_.front().second.size()), buf_len); | 74 static_cast<int>(incoming_packets_.front().second.size()), buf_len); |
| 75 memcpy(buffer->data(), &*incoming_packets_.front().second.begin(), size); | 75 memcpy(buffer->data(), &*incoming_packets_.front().second.begin(), size); |
| 76 *address = incoming_packets_.front().first; | 76 *address = incoming_packets_.front().first; |
| 77 incoming_packets_.pop_front(); | 77 incoming_packets_.pop_front(); |
| 78 return size; | 78 return size; |
| 79 } else { | 79 } else { |
| 80 recv_callback_ = callback; | 80 recv_callback_ = callback; |
| 81 recv_buffer_ = buf; | 81 recv_buffer_ = buf; |
| 82 recv_size_ = buf_len; | 82 recv_size_ = buf_len; |
| 83 recv_address_ = address; | 83 recv_address_ = address; |
| 84 return net::ERR_IO_PENDING; | 84 return net::ERR_IO_PENDING; |
| 85 } | 85 } |
| 86 } | 86 } |
| 87 | 87 |
| 88 virtual int SendTo(net::IOBuffer* buf, int buf_len, | 88 int SendTo(net::IOBuffer* buf, |
| 89 const net::IPEndPoint& address, | 89 int buf_len, |
| 90 const net::CompletionCallback& callback) override { | 90 const net::IPEndPoint& address, |
| 91 const net::CompletionCallback& callback) override { |
| 91 scoped_refptr<net::IOBuffer> buffer(buf); | 92 scoped_refptr<net::IOBuffer> buffer(buf); |
| 92 std::vector<char> data_vector(buffer->data(), buffer->data() + buf_len); | 93 std::vector<char> data_vector(buffer->data(), buffer->data() + buf_len); |
| 93 sent_packets_->push_back(UDPPacket(address, data_vector)); | 94 sent_packets_->push_back(UDPPacket(address, data_vector)); |
| 94 return buf_len; | 95 return buf_len; |
| 95 } | 96 } |
| 96 | 97 |
| 97 virtual int SetReceiveBufferSize(int32 size) override { | 98 int SetReceiveBufferSize(int32 size) override { return net::OK; } |
| 98 return net::OK; | |
| 99 } | |
| 100 | 99 |
| 101 virtual int SetSendBufferSize(int32 size) override { | 100 int SetSendBufferSize(int32 size) override { return net::OK; } |
| 102 return net::OK; | |
| 103 } | |
| 104 | 101 |
| 105 void ReceivePacket(const net::IPEndPoint& address, std::vector<char> data) { | 102 void ReceivePacket(const net::IPEndPoint& address, std::vector<char> data) { |
| 106 if (!recv_callback_.is_null()) { | 103 if (!recv_callback_.is_null()) { |
| 107 int size = std::min(recv_size_, static_cast<int>(data.size())); | 104 int size = std::min(recv_size_, static_cast<int>(data.size())); |
| 108 memcpy(recv_buffer_->data(), &*data.begin(), size); | 105 memcpy(recv_buffer_->data(), &*data.begin(), size); |
| 109 *recv_address_ = address; | 106 *recv_address_ = address; |
| 110 net::CompletionCallback cb = recv_callback_; | 107 net::CompletionCallback cb = recv_callback_; |
| 111 recv_callback_.Reset(); | 108 recv_callback_.Reset(); |
| 112 recv_buffer_ = NULL; | 109 recv_buffer_ = NULL; |
| 113 cb.Run(size); | 110 cb.Run(size); |
| 114 } else { | 111 } else { |
| 115 incoming_packets_.push_back(UDPPacket(address, data)); | 112 incoming_packets_.push_back(UDPPacket(address, data)); |
| 116 } | 113 } |
| 117 } | 114 } |
| 118 | 115 |
| 119 virtual const net::BoundNetLog& NetLog() const override { | 116 const net::BoundNetLog& NetLog() const override { return net_log_; } |
| 120 return net_log_; | |
| 121 } | |
| 122 | 117 |
| 123 virtual void AllowAddressReuse() override { | 118 void AllowAddressReuse() override { NOTIMPLEMENTED(); } |
| 124 NOTIMPLEMENTED(); | |
| 125 } | |
| 126 | 119 |
| 127 virtual void AllowBroadcast() override { | 120 void AllowBroadcast() override { NOTIMPLEMENTED(); } |
| 128 NOTIMPLEMENTED(); | |
| 129 } | |
| 130 | 121 |
| 131 virtual int JoinGroup( | 122 int JoinGroup(const net::IPAddressNumber& group_address) const override { |
| 132 const net::IPAddressNumber& group_address) const override { | |
| 133 NOTIMPLEMENTED(); | 123 NOTIMPLEMENTED(); |
| 134 return net::ERR_NOT_IMPLEMENTED; | 124 return net::ERR_NOT_IMPLEMENTED; |
| 135 } | 125 } |
| 136 | 126 |
| 137 virtual int LeaveGroup( | 127 int LeaveGroup(const net::IPAddressNumber& group_address) const override { |
| 138 const net::IPAddressNumber& group_address) const override { | |
| 139 NOTIMPLEMENTED(); | 128 NOTIMPLEMENTED(); |
| 140 return net::ERR_NOT_IMPLEMENTED; | 129 return net::ERR_NOT_IMPLEMENTED; |
| 141 } | 130 } |
| 142 | 131 |
| 143 virtual int SetMulticastInterface(uint32 interface_index) override { | 132 int SetMulticastInterface(uint32 interface_index) override { |
| 144 NOTIMPLEMENTED(); | 133 NOTIMPLEMENTED(); |
| 145 return net::ERR_NOT_IMPLEMENTED; | 134 return net::ERR_NOT_IMPLEMENTED; |
| 146 } | 135 } |
| 147 | 136 |
| 148 virtual int SetMulticastTimeToLive(int time_to_live) override { | 137 int SetMulticastTimeToLive(int time_to_live) override { |
| 149 NOTIMPLEMENTED(); | 138 NOTIMPLEMENTED(); |
| 150 return net::ERR_NOT_IMPLEMENTED; | 139 return net::ERR_NOT_IMPLEMENTED; |
| 151 } | 140 } |
| 152 | 141 |
| 153 virtual int SetMulticastLoopbackMode(bool loopback) override { | 142 int SetMulticastLoopbackMode(bool loopback) override { |
| 154 NOTIMPLEMENTED(); | 143 NOTIMPLEMENTED(); |
| 155 return net::ERR_NOT_IMPLEMENTED; | 144 return net::ERR_NOT_IMPLEMENTED; |
| 156 } | 145 } |
| 157 | 146 |
| 158 virtual int SetDiffServCodePoint(net::DiffServCodePoint dscp) override { | 147 int SetDiffServCodePoint(net::DiffServCodePoint dscp) override { |
| 159 NOTIMPLEMENTED(); | 148 NOTIMPLEMENTED(); |
| 160 return net::ERR_NOT_IMPLEMENTED; | 149 return net::ERR_NOT_IMPLEMENTED; |
| 161 } | 150 } |
| 162 | 151 |
| 163 virtual void DetachFromThread() override { | 152 void DetachFromThread() override { NOTIMPLEMENTED(); } |
| 164 NOTIMPLEMENTED(); | |
| 165 } | |
| 166 | 153 |
| 167 private: | 154 private: |
| 168 net::IPEndPoint address_; | 155 net::IPEndPoint address_; |
| 169 std::deque<UDPPacket>* sent_packets_; | 156 std::deque<UDPPacket>* sent_packets_; |
| 170 std::deque<UDPPacket> incoming_packets_; | 157 std::deque<UDPPacket> incoming_packets_; |
| 171 net::BoundNetLog net_log_; | 158 net::BoundNetLog net_log_; |
| 172 | 159 |
| 173 scoped_refptr<net::IOBuffer> recv_buffer_; | 160 scoped_refptr<net::IOBuffer> recv_buffer_; |
| 174 net::IPEndPoint* recv_address_; | 161 net::IPEndPoint* recv_address_; |
| 175 int recv_size_; | 162 int recv_size_; |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 380 socket_host_->Send(dest3, packet1, options, 0); | 367 socket_host_->Send(dest3, packet1, options, 0); |
| 381 net::IPEndPoint dest4 = ParseAddress(kTestIpAddress1, 2224); | 368 net::IPEndPoint dest4 = ParseAddress(kTestIpAddress1, 2224); |
| 382 // This packet should also be dropped. | 369 // This packet should also be dropped. |
| 383 socket_host_->Send(dest4, packet1, options, 0); | 370 socket_host_->Send(dest4, packet1, options, 0); |
| 384 // |dest1| is known, we can send as many packets to it. | 371 // |dest1| is known, we can send as many packets to it. |
| 385 socket_host_->Send(dest1_, packet1, options, 0); | 372 socket_host_->Send(dest1_, packet1, options, 0); |
| 386 ASSERT_EQ(sent_packets_.size(), 4U); | 373 ASSERT_EQ(sent_packets_.size(), 4U); |
| 387 } | 374 } |
| 388 | 375 |
| 389 } // namespace content | 376 } // namespace content |
| OLD | NEW |