| 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 |