OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 <math.h> | 5 #include <math.h> |
6 #include <stdlib.h> | 6 #include <stdlib.h> |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "media/cast/test/utility/udp_proxy.h" | 9 #include "media/cast/test/utility/udp_proxy.h" |
10 | 10 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
49 public: | 49 public: |
50 Buffer(size_t buffer_size, double max_megabits_per_second) | 50 Buffer(size_t buffer_size, double max_megabits_per_second) |
51 : buffer_size_(0), | 51 : buffer_size_(0), |
52 max_buffer_size_(buffer_size), | 52 max_buffer_size_(buffer_size), |
53 max_megabits_per_second_(max_megabits_per_second), | 53 max_megabits_per_second_(max_megabits_per_second), |
54 weak_factory_(this) { | 54 weak_factory_(this) { |
55 CHECK_GT(max_buffer_size_, 0UL); | 55 CHECK_GT(max_buffer_size_, 0UL); |
56 CHECK_GT(max_megabits_per_second, 0); | 56 CHECK_GT(max_megabits_per_second, 0); |
57 } | 57 } |
58 | 58 |
59 virtual void Send(scoped_ptr<Packet> packet) override { | 59 void Send(scoped_ptr<Packet> packet) override { |
60 if (packet->size() + buffer_size_ <= max_buffer_size_) { | 60 if (packet->size() + buffer_size_ <= max_buffer_size_) { |
61 buffer_size_ += packet->size(); | 61 buffer_size_ += packet->size(); |
62 buffer_.push_back(linked_ptr<Packet>(packet.release())); | 62 buffer_.push_back(linked_ptr<Packet>(packet.release())); |
63 if (buffer_.size() == 1) { | 63 if (buffer_.size() == 1) { |
64 Schedule(); | 64 Schedule(); |
65 } | 65 } |
66 } | 66 } |
67 } | 67 } |
68 | 68 |
69 private: | 69 private: |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 | 109 |
110 scoped_ptr<PacketPipe> NewBuffer(size_t buffer_size, double bandwidth) { | 110 scoped_ptr<PacketPipe> NewBuffer(size_t buffer_size, double bandwidth) { |
111 return scoped_ptr<PacketPipe>(new Buffer(buffer_size, bandwidth)).Pass(); | 111 return scoped_ptr<PacketPipe>(new Buffer(buffer_size, bandwidth)).Pass(); |
112 } | 112 } |
113 | 113 |
114 class RandomDrop : public PacketPipe { | 114 class RandomDrop : public PacketPipe { |
115 public: | 115 public: |
116 RandomDrop(double drop_fraction) | 116 RandomDrop(double drop_fraction) |
117 : drop_fraction_(static_cast<int>(drop_fraction * RAND_MAX)) {} | 117 : drop_fraction_(static_cast<int>(drop_fraction * RAND_MAX)) {} |
118 | 118 |
119 virtual void Send(scoped_ptr<Packet> packet) override { | 119 void Send(scoped_ptr<Packet> packet) override { |
120 if (rand() > drop_fraction_) { | 120 if (rand() > drop_fraction_) { |
121 pipe_->Send(packet.Pass()); | 121 pipe_->Send(packet.Pass()); |
122 } | 122 } |
123 } | 123 } |
124 | 124 |
125 private: | 125 private: |
126 int drop_fraction_; | 126 int drop_fraction_; |
127 }; | 127 }; |
128 | 128 |
129 scoped_ptr<PacketPipe> NewRandomDrop(double drop_fraction) { | 129 scoped_ptr<PacketPipe> NewRandomDrop(double drop_fraction) { |
130 return scoped_ptr<PacketPipe>(new RandomDrop(drop_fraction)).Pass(); | 130 return scoped_ptr<PacketPipe>(new RandomDrop(drop_fraction)).Pass(); |
131 } | 131 } |
132 | 132 |
133 class SimpleDelayBase : public PacketPipe { | 133 class SimpleDelayBase : public PacketPipe { |
134 public: | 134 public: |
135 SimpleDelayBase() : weak_factory_(this) {} | 135 SimpleDelayBase() : weak_factory_(this) {} |
136 virtual ~SimpleDelayBase() {} | 136 ~SimpleDelayBase() override {} |
137 | 137 |
138 virtual void Send(scoped_ptr<Packet> packet) override { | 138 void Send(scoped_ptr<Packet> packet) override { |
139 double seconds = GetDelay(); | 139 double seconds = GetDelay(); |
140 task_runner_->PostDelayedTask( | 140 task_runner_->PostDelayedTask( |
141 FROM_HERE, | 141 FROM_HERE, |
142 base::Bind(&SimpleDelayBase::SendInternal, | 142 base::Bind(&SimpleDelayBase::SendInternal, |
143 weak_factory_.GetWeakPtr(), | 143 weak_factory_.GetWeakPtr(), |
144 base::Passed(&packet)), | 144 base::Passed(&packet)), |
145 base::TimeDelta::FromMicroseconds(static_cast<int64>(seconds * 1E6))); | 145 base::TimeDelta::FromMicroseconds(static_cast<int64>(seconds * 1E6))); |
146 } | 146 } |
147 protected: | 147 protected: |
148 virtual double GetDelay() = 0; | 148 virtual double GetDelay() = 0; |
149 | 149 |
150 private: | 150 private: |
151 virtual void SendInternal(scoped_ptr<Packet> packet) { | 151 virtual void SendInternal(scoped_ptr<Packet> packet) { |
152 pipe_->Send(packet.Pass()); | 152 pipe_->Send(packet.Pass()); |
153 } | 153 } |
154 | 154 |
155 base::WeakPtrFactory<SimpleDelayBase> weak_factory_; | 155 base::WeakPtrFactory<SimpleDelayBase> weak_factory_; |
156 }; | 156 }; |
157 | 157 |
158 class ConstantDelay : public SimpleDelayBase { | 158 class ConstantDelay : public SimpleDelayBase { |
159 public: | 159 public: |
160 ConstantDelay(double delay_seconds) : delay_seconds_(delay_seconds) {} | 160 ConstantDelay(double delay_seconds) : delay_seconds_(delay_seconds) {} |
161 virtual double GetDelay() override { | 161 double GetDelay() override { return delay_seconds_; } |
162 return delay_seconds_; | |
163 } | |
164 | 162 |
165 private: | 163 private: |
166 double delay_seconds_; | 164 double delay_seconds_; |
167 }; | 165 }; |
168 | 166 |
169 scoped_ptr<PacketPipe> NewConstantDelay(double delay_seconds) { | 167 scoped_ptr<PacketPipe> NewConstantDelay(double delay_seconds) { |
170 return scoped_ptr<PacketPipe>(new ConstantDelay(delay_seconds)).Pass(); | 168 return scoped_ptr<PacketPipe>(new ConstantDelay(delay_seconds)).Pass(); |
171 } | 169 } |
172 | 170 |
173 class RandomUnsortedDelay : public SimpleDelayBase { | 171 class RandomUnsortedDelay : public SimpleDelayBase { |
174 public: | 172 public: |
175 RandomUnsortedDelay(double random_delay) : random_delay_(random_delay) {} | 173 RandomUnsortedDelay(double random_delay) : random_delay_(random_delay) {} |
176 | 174 |
177 virtual double GetDelay() override { | 175 double GetDelay() override { return random_delay_ * base::RandDouble(); } |
178 return random_delay_ * base::RandDouble(); | |
179 } | |
180 | 176 |
181 private: | 177 private: |
182 double random_delay_; | 178 double random_delay_; |
183 }; | 179 }; |
184 | 180 |
185 scoped_ptr<PacketPipe> NewRandomUnsortedDelay(double random_delay) { | 181 scoped_ptr<PacketPipe> NewRandomUnsortedDelay(double random_delay) { |
186 return scoped_ptr<PacketPipe>(new RandomUnsortedDelay(random_delay)).Pass(); | 182 return scoped_ptr<PacketPipe>(new RandomUnsortedDelay(random_delay)).Pass(); |
187 } | 183 } |
188 | 184 |
189 class DuplicateAndDelay : public RandomUnsortedDelay { | 185 class DuplicateAndDelay : public RandomUnsortedDelay { |
190 public: | 186 public: |
191 DuplicateAndDelay(double delay_min, | 187 DuplicateAndDelay(double delay_min, |
192 double random_delay) : | 188 double random_delay) : |
193 RandomUnsortedDelay(random_delay), | 189 RandomUnsortedDelay(random_delay), |
194 delay_min_(delay_min) { | 190 delay_min_(delay_min) { |
195 } | 191 } |
196 virtual void Send(scoped_ptr<Packet> packet) override { | 192 void Send(scoped_ptr<Packet> packet) override { |
197 pipe_->Send(scoped_ptr<Packet>(new Packet(*packet.get()))); | 193 pipe_->Send(scoped_ptr<Packet>(new Packet(*packet.get()))); |
198 RandomUnsortedDelay::Send(packet.Pass()); | 194 RandomUnsortedDelay::Send(packet.Pass()); |
199 } | 195 } |
200 virtual double GetDelay() override { | 196 double GetDelay() override { |
201 return RandomUnsortedDelay::GetDelay() + delay_min_; | 197 return RandomUnsortedDelay::GetDelay() + delay_min_; |
202 } | 198 } |
203 private: | 199 private: |
204 double delay_min_; | 200 double delay_min_; |
205 }; | 201 }; |
206 | 202 |
207 scoped_ptr<PacketPipe> NewDuplicateAndDelay(double delay_min, | 203 scoped_ptr<PacketPipe> NewDuplicateAndDelay(double delay_min, |
208 double random_delay) { | 204 double random_delay) { |
209 return scoped_ptr<PacketPipe>( | 205 return scoped_ptr<PacketPipe>( |
210 new DuplicateAndDelay(delay_min, random_delay)).Pass(); | 206 new DuplicateAndDelay(delay_min, random_delay)).Pass(); |
211 } | 207 } |
212 | 208 |
213 class RandomSortedDelay : public PacketPipe { | 209 class RandomSortedDelay : public PacketPipe { |
214 public: | 210 public: |
215 RandomSortedDelay(double random_delay, | 211 RandomSortedDelay(double random_delay, |
216 double extra_delay, | 212 double extra_delay, |
217 double seconds_between_extra_delay) | 213 double seconds_between_extra_delay) |
218 : random_delay_(random_delay), | 214 : random_delay_(random_delay), |
219 extra_delay_(extra_delay), | 215 extra_delay_(extra_delay), |
220 seconds_between_extra_delay_(seconds_between_extra_delay), | 216 seconds_between_extra_delay_(seconds_between_extra_delay), |
221 weak_factory_(this) {} | 217 weak_factory_(this) {} |
222 | 218 |
223 virtual void Send(scoped_ptr<Packet> packet) override { | 219 void Send(scoped_ptr<Packet> packet) override { |
224 buffer_.push_back(linked_ptr<Packet>(packet.release())); | 220 buffer_.push_back(linked_ptr<Packet>(packet.release())); |
225 if (buffer_.size() == 1) { | 221 if (buffer_.size() == 1) { |
226 next_send_ = std::max( | 222 next_send_ = std::max( |
227 clock_->NowTicks() + | 223 clock_->NowTicks() + |
228 base::TimeDelta::FromSecondsD(base::RandDouble() * random_delay_), | 224 base::TimeDelta::FromSecondsD(base::RandDouble() * random_delay_), |
229 next_send_); | 225 next_send_); |
230 ProcessBuffer(); | 226 ProcessBuffer(); |
231 } | 227 } |
232 } | 228 } |
233 virtual void InitOnIOThread( | 229 void InitOnIOThread( |
234 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | 230 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
235 base::TickClock* clock) override { | 231 base::TickClock* clock) override { |
236 PacketPipe::InitOnIOThread(task_runner, clock); | 232 PacketPipe::InitOnIOThread(task_runner, clock); |
237 // As we start the stream, assume that we are in a random | 233 // As we start the stream, assume that we are in a random |
238 // place between two extra delays, thus multiplier = 1.0; | 234 // place between two extra delays, thus multiplier = 1.0; |
239 ScheduleExtraDelay(1.0); | 235 ScheduleExtraDelay(1.0); |
240 } | 236 } |
241 | 237 |
242 private: | 238 private: |
243 void ScheduleExtraDelay(double mult) { | 239 void ScheduleExtraDelay(double mult) { |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
302 } | 298 } |
303 | 299 |
304 class NetworkGlitchPipe : public PacketPipe { | 300 class NetworkGlitchPipe : public PacketPipe { |
305 public: | 301 public: |
306 NetworkGlitchPipe(double average_work_time, double average_outage_time) | 302 NetworkGlitchPipe(double average_work_time, double average_outage_time) |
307 : works_(false), | 303 : works_(false), |
308 max_work_time_(average_work_time * 2), | 304 max_work_time_(average_work_time * 2), |
309 max_outage_time_(average_outage_time * 2), | 305 max_outage_time_(average_outage_time * 2), |
310 weak_factory_(this) {} | 306 weak_factory_(this) {} |
311 | 307 |
312 virtual void InitOnIOThread( | 308 void InitOnIOThread( |
313 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | 309 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
314 base::TickClock* clock) override { | 310 base::TickClock* clock) override { |
315 PacketPipe::InitOnIOThread(task_runner, clock); | 311 PacketPipe::InitOnIOThread(task_runner, clock); |
316 Flip(); | 312 Flip(); |
317 } | 313 } |
318 | 314 |
319 virtual void Send(scoped_ptr<Packet> packet) override { | 315 void Send(scoped_ptr<Packet> packet) override { |
320 if (works_) { | 316 if (works_) { |
321 pipe_->Send(packet.Pass()); | 317 pipe_->Send(packet.Pass()); |
322 } | 318 } |
323 } | 319 } |
324 | 320 |
325 private: | 321 private: |
326 void Flip() { | 322 void Flip() { |
327 works_ = !works_; | 323 works_ = !works_; |
328 double seconds = base::RandDouble() * | 324 double seconds = base::RandDouble() * |
329 (works_ ? max_work_time_ : max_outage_time_); | 325 (works_ ? max_work_time_ : max_outage_time_); |
(...skipping 23 matching lines...) Expand all Loading... |
353 public: | 349 public: |
354 InternalBuffer(base::WeakPtr<InterruptedPoissonProcess> ipp, | 350 InternalBuffer(base::WeakPtr<InterruptedPoissonProcess> ipp, |
355 size_t size) | 351 size_t size) |
356 : ipp_(ipp), | 352 : ipp_(ipp), |
357 stored_size_(0), | 353 stored_size_(0), |
358 stored_limit_(size), | 354 stored_limit_(size), |
359 clock_(NULL), | 355 clock_(NULL), |
360 weak_factory_(this) { | 356 weak_factory_(this) { |
361 } | 357 } |
362 | 358 |
363 virtual void Send(scoped_ptr<Packet> packet) override { | 359 void Send(scoped_ptr<Packet> packet) override { |
364 // Drop if buffer is full. | 360 // Drop if buffer is full. |
365 if (stored_size_ >= stored_limit_) | 361 if (stored_size_ >= stored_limit_) |
366 return; | 362 return; |
367 stored_size_ += packet->size(); | 363 stored_size_ += packet->size(); |
368 buffer_.push_back(linked_ptr<Packet>(packet.release())); | 364 buffer_.push_back(linked_ptr<Packet>(packet.release())); |
369 buffer_time_.push_back(clock_->NowTicks()); | 365 buffer_time_.push_back(clock_->NowTicks()); |
370 DCHECK(buffer_.size() == buffer_time_.size()); | 366 DCHECK(buffer_.size() == buffer_time_.size()); |
371 } | 367 } |
372 | 368 |
373 virtual void InitOnIOThread( | 369 void InitOnIOThread( |
374 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, | 370 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
375 base::TickClock* clock) override { | 371 base::TickClock* clock) override { |
376 clock_ = clock; | 372 clock_ = clock; |
377 if (ipp_) | 373 if (ipp_) |
378 ipp_->InitOnIOThread(task_runner, clock); | 374 ipp_->InitOnIOThread(task_runner, clock); |
379 PacketPipe::InitOnIOThread(task_runner, clock); | 375 PacketPipe::InitOnIOThread(task_runner, clock); |
380 } | 376 } |
381 | 377 |
382 void SendOnePacket() { | 378 void SendOnePacket() { |
383 scoped_ptr<Packet> packet(buffer_.front().release()); | 379 scoped_ptr<Packet> packet(buffer_.front().release()); |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
545 break; | 541 break; |
546 } | 542 } |
547 } | 543 } |
548 | 544 |
549 class UDPProxyImpl; | 545 class UDPProxyImpl; |
550 | 546 |
551 class PacketSender : public PacketPipe { | 547 class PacketSender : public PacketPipe { |
552 public: | 548 public: |
553 PacketSender(UDPProxyImpl* udp_proxy, const net::IPEndPoint* destination) | 549 PacketSender(UDPProxyImpl* udp_proxy, const net::IPEndPoint* destination) |
554 : udp_proxy_(udp_proxy), destination_(destination) {} | 550 : udp_proxy_(udp_proxy), destination_(destination) {} |
555 virtual void Send(scoped_ptr<Packet> packet) override; | 551 void Send(scoped_ptr<Packet> packet) override; |
556 virtual void AppendToPipe(scoped_ptr<PacketPipe> pipe) override { | 552 void AppendToPipe(scoped_ptr<PacketPipe> pipe) override { NOTREACHED(); } |
557 NOTREACHED(); | |
558 } | |
559 | 553 |
560 private: | 554 private: |
561 UDPProxyImpl* udp_proxy_; | 555 UDPProxyImpl* udp_proxy_; |
562 const net::IPEndPoint* destination_; // not owned | 556 const net::IPEndPoint* destination_; // not owned |
563 }; | 557 }; |
564 | 558 |
565 namespace { | 559 namespace { |
566 void BuildPipe(scoped_ptr<PacketPipe>* pipe, PacketPipe* next) { | 560 void BuildPipe(scoped_ptr<PacketPipe>* pipe, PacketPipe* next) { |
567 if (*pipe) { | 561 if (*pipe) { |
568 (*pipe)->AppendToPipe(scoped_ptr<PacketPipe>(next).Pass()); | 562 (*pipe)->AppendToPipe(scoped_ptr<PacketPipe>(next).Pass()); |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
655 base::WaitableEvent start_event(false, false); | 649 base::WaitableEvent start_event(false, false); |
656 proxy_thread_.message_loop_proxy()->PostTask( | 650 proxy_thread_.message_loop_proxy()->PostTask( |
657 FROM_HERE, | 651 FROM_HERE, |
658 base::Bind(&UDPProxyImpl::Start, | 652 base::Bind(&UDPProxyImpl::Start, |
659 base::Unretained(this), | 653 base::Unretained(this), |
660 base::Unretained(&start_event), | 654 base::Unretained(&start_event), |
661 net_log)); | 655 net_log)); |
662 start_event.Wait(); | 656 start_event.Wait(); |
663 } | 657 } |
664 | 658 |
665 virtual ~UDPProxyImpl() { | 659 ~UDPProxyImpl() override { |
666 base::WaitableEvent stop_event(false, false); | 660 base::WaitableEvent stop_event(false, false); |
667 proxy_thread_.message_loop_proxy()->PostTask( | 661 proxy_thread_.message_loop_proxy()->PostTask( |
668 FROM_HERE, | 662 FROM_HERE, |
669 base::Bind(&UDPProxyImpl::Stop, | 663 base::Bind(&UDPProxyImpl::Stop, |
670 base::Unretained(this), | 664 base::Unretained(this), |
671 base::Unretained(&stop_event))); | 665 base::Unretained(&stop_event))); |
672 stop_event.Wait(); | 666 stop_event.Wait(); |
673 proxy_thread_.Stop(); | 667 proxy_thread_.Stop(); |
674 } | 668 } |
675 | 669 |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
830 destination, | 824 destination, |
831 to_dest_pipe.Pass(), | 825 to_dest_pipe.Pass(), |
832 from_dest_pipe.Pass(), | 826 from_dest_pipe.Pass(), |
833 net_log)); | 827 net_log)); |
834 return ret.Pass(); | 828 return ret.Pass(); |
835 } | 829 } |
836 | 830 |
837 } // namespace test | 831 } // namespace test |
838 } // namespace cast | 832 } // namespace cast |
839 } // namespace media | 833 } // namespace media |
OLD | NEW |