/* * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #ifndef WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_H_ #define WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_H_ #include #include #include #include "testing/gtest/include/gtest/gtest.h" #include "webrtc/base/constructormagic.h" #include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h" #include "webrtc/modules/remote_bitrate_estimator/test/bwe.h" #include "webrtc/modules/remote_bitrate_estimator/test/bwe_test_framework.h" namespace webrtc { namespace testing { namespace bwe { class BweReceiver; class PacketReceiver; class PacketSender; class PacketProcessorRunner { public: explicit PacketProcessorRunner(PacketProcessor* processor); ~PacketProcessorRunner(); bool RunsProcessor(const PacketProcessor* processor) const; void RunFor(int64_t time_ms, int64_t time_now_ms, Packets* in_out); private: void FindPacketsToProcess(const FlowIds& flow_ids, Packets* in, Packets* out); void QueuePackets(Packets* batch, int64_t end_of_batch_time_us); PacketProcessor* processor_; Packets queue_; }; class Link : public PacketProcessorListener { public: virtual ~Link() {} virtual void AddPacketProcessor(PacketProcessor* processor, ProcessorType type); virtual void RemovePacketProcessor(PacketProcessor* processor); void Run(int64_t run_for_ms, int64_t now_ms, Packets* packets); const std::vector& senders() { return senders_; } const std::vector& processors() { return processors_; } private: std::vector senders_; std::vector receivers_; std::vector processors_; }; class BweTest { public: BweTest(); explicit BweTest(bool plot_capacity); ~BweTest(); void RunChoke(BandwidthEstimatorType bwe_type, std::vector capacities_kbps); void RunVariableCapacity1SingleFlow(BandwidthEstimatorType bwe_type); void RunVariableCapacity2MultipleFlows(BandwidthEstimatorType bwe_type, size_t num_flows); void RunBidirectionalFlow(BandwidthEstimatorType bwe_type); void RunSelfFairness(BandwidthEstimatorType bwe_type); void RunRoundTripTimeFairness(BandwidthEstimatorType bwe_type); void RunLongTcpFairness(BandwidthEstimatorType bwe_type); void RunMultipleShortTcpFairness(BandwidthEstimatorType bwe_type, std::vector tcp_file_sizes_bytes, std::vector tcp_starting_times_ms); void RunPauseResumeFlows(BandwidthEstimatorType bwe_type); void RunFairnessTest(BandwidthEstimatorType bwe_type, size_t num_media_flows, size_t num_tcp_flows, int64_t run_time_seconds, uint32_t capacity_kbps, int64_t max_delay_ms, int64_t rtt_ms, int64_t max_jitter_ms, const int64_t* offsets_ms); void RunFairnessTest(BandwidthEstimatorType bwe_type, size_t num_media_flows, size_t num_tcp_flows, int64_t run_time_seconds, uint32_t capacity_kbps, int64_t max_delay_ms, int64_t rtt_ms, int64_t max_jitter_ms, const int64_t* offsets_ms, const std::string& title, const std::string& flow_name); static std::vector GetFileSizesBytes(int num_files); static std::vector GetStartingTimesMs(int num_files); protected: void SetUp(); void VerboseLogging(bool enable); void RunFor(int64_t time_ms); std::string GetTestName() const; void PrintResults(double max_throughput_kbps, Stats throughput_kbps, int flow_id, Stats flow_delay_ms, Stats flow_throughput_kbps); void PrintResults(double max_throughput_kbps, Stats throughput_kbps, std::map> flow_delay_ms, std::map> flow_throughput_kbps); Link downlink_; Link uplink_; private: void FindPacketsToProcess(const FlowIds& flow_ids, Packets* in, Packets* out); void GiveFeedbackToAffectedSenders(PacketReceiver* receiver); int64_t run_time_ms_; int64_t time_now_ms_; int64_t simulation_interval_ms_; std::vector links_; Packets packets_; bool plot_total_available_capacity_; RTC_DISALLOW_COPY_AND_ASSIGN(BweTest); }; // Default Evaluation parameters: // Link capacity: 4000ms; // Queueing delay capacity: 300ms. // One-Way propagation delay: 50ms. // Jitter model: Truncated gaussian. // Maximum end-to-end jitter: 30ms = 2*standard_deviation. // Bottleneck queue type: Drop tail. // Path loss ratio: 0%. const int kOneWayDelayMs = 50; const int kMaxQueueingDelayMs = 300; const int kMaxCapacityKbps = 4000; const int kMaxJitterMs = 15; struct DefaultEvaluationFilter { DefaultEvaluationFilter(PacketProcessorListener* listener, int flow_id) : choke(listener, flow_id), delay(listener, flow_id), jitter(listener, flow_id) { SetDefaultParameters(); } DefaultEvaluationFilter(PacketProcessorListener* listener, const FlowIds& flow_ids) : choke(listener, flow_ids), delay(listener, flow_ids), jitter(listener, flow_ids) { SetDefaultParameters(); } void SetDefaultParameters() { delay.SetOneWayDelayMs(kOneWayDelayMs); choke.set_max_delay_ms(kMaxQueueingDelayMs); choke.set_capacity_kbps(kMaxCapacityKbps); jitter.SetMaxJitter(kMaxJitterMs); } ChokeFilter choke; DelayFilter delay; JitterFilter jitter; }; } // namespace bwe } // namespace testing } // namespace webrtc #endif // WEBRTC_MODULES_REMOTE_BITRATE_ESTIMATOR_TEST_BWE_TEST_H_