| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 #include <functional> | 10 #include <functional> |
| 11 #include <list> | 11 #include <list> |
| 12 #include <string> | 12 #include <string> |
| 13 | 13 |
| 14 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
| 15 | 15 |
| 16 #include "webrtc/audio_state.h" | 16 #include "webrtc/audio_state.h" |
| 17 #include "webrtc/base/checks.h" | 17 #include "webrtc/base/checks.h" |
| 18 #include "webrtc/base/logging.h" |
| 18 #include "webrtc/base/scoped_ptr.h" | 19 #include "webrtc/base/scoped_ptr.h" |
| 19 #include "webrtc/base/thread_annotations.h" | 20 #include "webrtc/base/thread_annotations.h" |
| 20 #include "webrtc/call.h" | 21 #include "webrtc/call.h" |
| 21 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" | 22 #include "webrtc/system_wrappers/include/critical_section_wrapper.h" |
| 22 #include "webrtc/system_wrappers/include/event_wrapper.h" | 23 #include "webrtc/system_wrappers/include/event_wrapper.h" |
| 23 #include "webrtc/system_wrappers/include/trace.h" | 24 #include "webrtc/system_wrappers/include/trace.h" |
| 24 #include "webrtc/test/call_test.h" | 25 #include "webrtc/test/call_test.h" |
| 25 #include "webrtc/test/direct_transport.h" | 26 #include "webrtc/test/direct_transport.h" |
| 26 #include "webrtc/test/encoder_settings.h" | 27 #include "webrtc/test/encoder_settings.h" |
| 27 #include "webrtc/test/fake_decoder.h" | 28 #include "webrtc/test/fake_decoder.h" |
| 28 #include "webrtc/test/fake_encoder.h" | 29 #include "webrtc/test/fake_encoder.h" |
| 29 #include "webrtc/test/mock_voice_engine.h" | 30 #include "webrtc/test/mock_voice_engine.h" |
| 30 #include "webrtc/test/frame_generator_capturer.h" | 31 #include "webrtc/test/frame_generator_capturer.h" |
| 31 | 32 |
| 32 namespace webrtc { | 33 namespace webrtc { |
| 33 namespace { | 34 namespace { |
| 34 // Note: If you consider to re-use this class, think twice and instead consider | 35 // Note: If you consider to re-use this class, think twice and instead consider |
| 35 // writing tests that don't depend on the trace system. | 36 // writing tests that don't depend on the logging system. |
| 36 class TraceObserver { | 37 class LogObserver { |
| 37 public: | 38 public: |
| 38 TraceObserver() { | 39 LogObserver() { rtc::LogMessage::AddLogToStream(&callback_, rtc::LS_INFO); } |
| 39 Trace::set_level_filter(kTraceTerseInfo); | |
| 40 | 40 |
| 41 Trace::CreateTrace(); | 41 ~LogObserver() { rtc::LogMessage::RemoveLogToStream(&callback_); } |
| 42 Trace::SetTraceCallback(&callback_); | |
| 43 | |
| 44 // Call webrtc trace to initialize the tracer that would otherwise trigger a | |
| 45 // data-race if left to be initialized by multiple threads (i.e. threads | |
| 46 // spawned by test::DirectTransport members in BitrateEstimatorTest). | |
| 47 WEBRTC_TRACE(kTraceStateInfo, kTraceUtility, -1, | |
| 48 "Instantiate without data races."); | |
| 49 } | |
| 50 | |
| 51 ~TraceObserver() { | |
| 52 Trace::SetTraceCallback(nullptr); | |
| 53 Trace::ReturnTrace(); | |
| 54 } | |
| 55 | 42 |
| 56 void PushExpectedLogLine(const std::string& expected_log_line) { | 43 void PushExpectedLogLine(const std::string& expected_log_line) { |
| 57 callback_.PushExpectedLogLine(expected_log_line); | 44 callback_.PushExpectedLogLine(expected_log_line); |
| 58 } | 45 } |
| 59 | 46 |
| 60 EventTypeWrapper Wait() { return callback_.Wait(); } | 47 EventTypeWrapper Wait() { return callback_.Wait(); } |
| 61 | 48 |
| 62 private: | 49 private: |
| 63 class Callback : public TraceCallback { | 50 class Callback : public rtc::LogSink { |
| 64 public: | 51 public: |
| 65 Callback() : done_(EventWrapper::Create()) {} | 52 Callback() : done_(EventWrapper::Create()) {} |
| 66 | 53 |
| 67 void Print(TraceLevel level, const char* message, int length) override { | 54 void OnLogMessage(const std::string& message) override { |
| 68 rtc::CritScope lock(&crit_sect_); | 55 rtc::CritScope lock(&crit_sect_); |
| 69 std::string msg(message); | 56 // Ignore log lines that are due to missing AST extensions, these are |
| 70 if (msg.find("BitrateEstimator") != std::string::npos) { | 57 // logged when we switch back from AST to TOF until the wrapping bitrate |
| 71 received_log_lines_.push_back(msg); | 58 // estimator gives up on using AST. |
| 59 if (message.find("BitrateEstimator") != std::string::npos && |
| 60 message.find("packet is missing") == std::string::npos) { |
| 61 received_log_lines_.push_back(message); |
| 72 } | 62 } |
| 63 |
| 73 int num_popped = 0; | 64 int num_popped = 0; |
| 74 while (!received_log_lines_.empty() && !expected_log_lines_.empty()) { | 65 while (!received_log_lines_.empty() && !expected_log_lines_.empty()) { |
| 75 std::string a = received_log_lines_.front(); | 66 std::string a = received_log_lines_.front(); |
| 76 std::string b = expected_log_lines_.front(); | 67 std::string b = expected_log_lines_.front(); |
| 77 received_log_lines_.pop_front(); | 68 received_log_lines_.pop_front(); |
| 78 expected_log_lines_.pop_front(); | 69 expected_log_lines_.pop_front(); |
| 79 num_popped++; | 70 num_popped++; |
| 80 EXPECT_TRUE(a.find(b) != std::string::npos); | 71 EXPECT_TRUE(a.find(b) != std::string::npos) << a << " != " << b; |
| 81 } | 72 } |
| 82 if (expected_log_lines_.size() <= 0) { | 73 if (expected_log_lines_.size() <= 0) { |
| 83 if (num_popped > 0) { | 74 if (num_popped > 0) { |
| 84 done_->Set(); | 75 done_->Set(); |
| 85 } | 76 } |
| 86 return; | 77 return; |
| 87 } | 78 } |
| 88 } | 79 } |
| 89 | 80 |
| 90 EventTypeWrapper Wait() { | 81 EventTypeWrapper Wait() { |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 253 bool is_sending_receiving_; | 244 bool is_sending_receiving_; |
| 254 VideoSendStream* send_stream_; | 245 VideoSendStream* send_stream_; |
| 255 AudioReceiveStream* audio_receive_stream_; | 246 AudioReceiveStream* audio_receive_stream_; |
| 256 VideoReceiveStream* video_receive_stream_; | 247 VideoReceiveStream* video_receive_stream_; |
| 257 rtc::scoped_ptr<test::FrameGeneratorCapturer> frame_generator_capturer_; | 248 rtc::scoped_ptr<test::FrameGeneratorCapturer> frame_generator_capturer_; |
| 258 test::FakeEncoder fake_encoder_; | 249 test::FakeEncoder fake_encoder_; |
| 259 test::FakeDecoder fake_decoder_; | 250 test::FakeDecoder fake_decoder_; |
| 260 }; | 251 }; |
| 261 | 252 |
| 262 testing::NiceMock<test::MockVoiceEngine> mock_voice_engine_; | 253 testing::NiceMock<test::MockVoiceEngine> mock_voice_engine_; |
| 263 TraceObserver receiver_trace_; | 254 LogObserver receiver_log_; |
| 264 rtc::scoped_ptr<test::DirectTransport> send_transport_; | 255 rtc::scoped_ptr<test::DirectTransport> send_transport_; |
| 265 rtc::scoped_ptr<test::DirectTransport> receive_transport_; | 256 rtc::scoped_ptr<test::DirectTransport> receive_transport_; |
| 266 rtc::scoped_ptr<Call> sender_call_; | 257 rtc::scoped_ptr<Call> sender_call_; |
| 267 rtc::scoped_ptr<Call> receiver_call_; | 258 rtc::scoped_ptr<Call> receiver_call_; |
| 268 VideoReceiveStream::Config receive_config_; | 259 VideoReceiveStream::Config receive_config_; |
| 269 std::vector<Stream*> streams_; | 260 std::vector<Stream*> streams_; |
| 270 }; | 261 }; |
| 271 | 262 |
| 272 static const char* kAbsSendTimeLog = | 263 static const char* kAbsSendTimeLog = |
| 273 "RemoteBitrateEstimatorAbsSendTime: Instantiating."; | 264 "RemoteBitrateEstimatorAbsSendTime: Instantiating."; |
| 274 static const char* kSingleStreamLog = | 265 static const char* kSingleStreamLog = |
| 275 "RemoteBitrateEstimatorSingleStream: Instantiating."; | 266 "RemoteBitrateEstimatorSingleStream: Instantiating."; |
| 276 | 267 |
| 277 TEST_F(BitrateEstimatorTest, InstantiatesTOFPerDefaultForVideo) { | 268 TEST_F(BitrateEstimatorTest, InstantiatesTOFPerDefaultForVideo) { |
| 278 send_config_.rtp.extensions.push_back( | 269 send_config_.rtp.extensions.push_back( |
| 279 RtpExtension(RtpExtension::kTOffset, kTOFExtensionId)); | 270 RtpExtension(RtpExtension::kTOffset, kTOFExtensionId)); |
| 280 receiver_trace_.PushExpectedLogLine(kSingleStreamLog); | 271 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 281 receiver_trace_.PushExpectedLogLine(kSingleStreamLog); | 272 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 282 streams_.push_back(new Stream(this, false)); | 273 streams_.push_back(new Stream(this, false)); |
| 283 EXPECT_EQ(kEventSignaled, receiver_trace_.Wait()); | 274 EXPECT_EQ(kEventSignaled, receiver_log_.Wait()); |
| 284 } | 275 } |
| 285 | 276 |
| 286 TEST_F(BitrateEstimatorTest, ImmediatelySwitchToASTForAudio) { | 277 TEST_F(BitrateEstimatorTest, ImmediatelySwitchToASTForAudio) { |
| 287 send_config_.rtp.extensions.push_back( | 278 send_config_.rtp.extensions.push_back( |
| 288 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId)); | 279 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId)); |
| 289 receiver_trace_.PushExpectedLogLine(kSingleStreamLog); | 280 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 290 receiver_trace_.PushExpectedLogLine(kSingleStreamLog); | 281 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 291 receiver_trace_.PushExpectedLogLine("Switching to absolute send time RBE."); | 282 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); |
| 292 receiver_trace_.PushExpectedLogLine(kAbsSendTimeLog); | 283 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); |
| 293 streams_.push_back(new Stream(this, true)); | 284 streams_.push_back(new Stream(this, true)); |
| 294 EXPECT_EQ(kEventSignaled, receiver_trace_.Wait()); | 285 EXPECT_EQ(kEventSignaled, receiver_log_.Wait()); |
| 295 } | 286 } |
| 296 | 287 |
| 297 TEST_F(BitrateEstimatorTest, ImmediatelySwitchToASTForVideo) { | 288 TEST_F(BitrateEstimatorTest, ImmediatelySwitchToASTForVideo) { |
| 298 send_config_.rtp.extensions.push_back( | 289 send_config_.rtp.extensions.push_back( |
| 299 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId)); | 290 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId)); |
| 300 receiver_trace_.PushExpectedLogLine(kSingleStreamLog); | 291 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 301 receiver_trace_.PushExpectedLogLine(kSingleStreamLog); | 292 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 302 receiver_trace_.PushExpectedLogLine("Switching to absolute send time RBE."); | 293 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); |
| 303 receiver_trace_.PushExpectedLogLine(kAbsSendTimeLog); | 294 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); |
| 304 streams_.push_back(new Stream(this, false)); | 295 streams_.push_back(new Stream(this, false)); |
| 305 EXPECT_EQ(kEventSignaled, receiver_trace_.Wait()); | 296 EXPECT_EQ(kEventSignaled, receiver_log_.Wait()); |
| 306 } | 297 } |
| 307 | 298 |
| 308 TEST_F(BitrateEstimatorTest, SwitchesToASTForAudio) { | 299 TEST_F(BitrateEstimatorTest, SwitchesToASTForAudio) { |
| 309 receiver_trace_.PushExpectedLogLine(kSingleStreamLog); | 300 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 310 receiver_trace_.PushExpectedLogLine(kSingleStreamLog); | 301 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 311 streams_.push_back(new Stream(this, true)); | 302 streams_.push_back(new Stream(this, true)); |
| 312 EXPECT_EQ(kEventSignaled, receiver_trace_.Wait()); | 303 EXPECT_EQ(kEventSignaled, receiver_log_.Wait()); |
| 313 | 304 |
| 314 send_config_.rtp.extensions.push_back( | 305 send_config_.rtp.extensions.push_back( |
| 315 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId)); | 306 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId)); |
| 316 receiver_trace_.PushExpectedLogLine("Switching to absolute send time RBE."); | 307 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); |
| 317 receiver_trace_.PushExpectedLogLine(kAbsSendTimeLog); | 308 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); |
| 318 streams_.push_back(new Stream(this, true)); | 309 streams_.push_back(new Stream(this, true)); |
| 319 EXPECT_EQ(kEventSignaled, receiver_trace_.Wait()); | 310 EXPECT_EQ(kEventSignaled, receiver_log_.Wait()); |
| 320 } | 311 } |
| 321 | 312 |
| 322 TEST_F(BitrateEstimatorTest, SwitchesToASTForVideo) { | 313 TEST_F(BitrateEstimatorTest, SwitchesToASTForVideo) { |
| 323 send_config_.rtp.extensions.push_back( | 314 send_config_.rtp.extensions.push_back( |
| 324 RtpExtension(RtpExtension::kTOffset, kTOFExtensionId)); | 315 RtpExtension(RtpExtension::kTOffset, kTOFExtensionId)); |
| 325 receiver_trace_.PushExpectedLogLine(kSingleStreamLog); | 316 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 326 receiver_trace_.PushExpectedLogLine(kSingleStreamLog); | 317 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 327 streams_.push_back(new Stream(this, false)); | 318 streams_.push_back(new Stream(this, false)); |
| 328 EXPECT_EQ(kEventSignaled, receiver_trace_.Wait()); | 319 EXPECT_EQ(kEventSignaled, receiver_log_.Wait()); |
| 329 | 320 |
| 330 send_config_.rtp.extensions[0] = | 321 send_config_.rtp.extensions[0] = |
| 331 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId); | 322 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId); |
| 332 receiver_trace_.PushExpectedLogLine("Switching to absolute send time RBE."); | 323 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); |
| 333 receiver_trace_.PushExpectedLogLine(kAbsSendTimeLog); | 324 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); |
| 334 streams_.push_back(new Stream(this, false)); | 325 streams_.push_back(new Stream(this, false)); |
| 335 EXPECT_EQ(kEventSignaled, receiver_trace_.Wait()); | 326 EXPECT_EQ(kEventSignaled, receiver_log_.Wait()); |
| 336 } | 327 } |
| 337 | 328 |
| 338 TEST_F(BitrateEstimatorTest, SwitchesToASTThenBackToTOFForVideo) { | 329 TEST_F(BitrateEstimatorTest, SwitchesToASTThenBackToTOFForVideo) { |
| 339 send_config_.rtp.extensions.push_back( | 330 send_config_.rtp.extensions.push_back( |
| 340 RtpExtension(RtpExtension::kTOffset, kTOFExtensionId)); | 331 RtpExtension(RtpExtension::kTOffset, kTOFExtensionId)); |
| 341 receiver_trace_.PushExpectedLogLine(kSingleStreamLog); | 332 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 342 receiver_trace_.PushExpectedLogLine(kSingleStreamLog); | 333 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 343 streams_.push_back(new Stream(this, false)); | 334 streams_.push_back(new Stream(this, false)); |
| 344 EXPECT_EQ(kEventSignaled, receiver_trace_.Wait()); | 335 EXPECT_EQ(kEventSignaled, receiver_log_.Wait()); |
| 345 | 336 |
| 346 send_config_.rtp.extensions[0] = | 337 send_config_.rtp.extensions[0] = |
| 347 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId); | 338 RtpExtension(RtpExtension::kAbsSendTime, kASTExtensionId); |
| 348 receiver_trace_.PushExpectedLogLine("Switching to absolute send time RBE."); | 339 receiver_log_.PushExpectedLogLine("Switching to absolute send time RBE."); |
| 349 receiver_trace_.PushExpectedLogLine(kAbsSendTimeLog); | 340 receiver_log_.PushExpectedLogLine(kAbsSendTimeLog); |
| 350 streams_.push_back(new Stream(this, false)); | 341 streams_.push_back(new Stream(this, false)); |
| 351 EXPECT_EQ(kEventSignaled, receiver_trace_.Wait()); | 342 EXPECT_EQ(kEventSignaled, receiver_log_.Wait()); |
| 352 | 343 |
| 353 send_config_.rtp.extensions[0] = | 344 send_config_.rtp.extensions[0] = |
| 354 RtpExtension(RtpExtension::kTOffset, kTOFExtensionId); | 345 RtpExtension(RtpExtension::kTOffset, kTOFExtensionId); |
| 355 receiver_trace_.PushExpectedLogLine( | 346 receiver_log_.PushExpectedLogLine( |
| 356 "WrappingBitrateEstimator: Switching to transmission time offset RBE."); | 347 "WrappingBitrateEstimator: Switching to transmission time offset RBE."); |
| 357 receiver_trace_.PushExpectedLogLine(kSingleStreamLog); | 348 receiver_log_.PushExpectedLogLine(kSingleStreamLog); |
| 358 streams_.push_back(new Stream(this, false)); | 349 streams_.push_back(new Stream(this, false)); |
| 359 streams_[0]->StopSending(); | 350 streams_[0]->StopSending(); |
| 360 streams_[1]->StopSending(); | 351 streams_[1]->StopSending(); |
| 361 EXPECT_EQ(kEventSignaled, receiver_trace_.Wait()); | 352 EXPECT_EQ(kEventSignaled, receiver_log_.Wait()); |
| 362 } | 353 } |
| 363 } // namespace webrtc | 354 } // namespace webrtc |
| OLD | NEW |