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 |