1/* 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 3 * 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 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 12// This file includes unit tests for EncoderStateFeedback. 13#include "webrtc/video_engine/encoder_state_feedback.h" 14 15#include "testing/gmock/include/gmock/gmock.h" 16#include "testing/gtest/include/gtest/gtest.h" 17 18#include "webrtc/common.h" 19#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h" 20#include "webrtc/modules/utility/interface/mock/mock_process_thread.h" 21#include "webrtc/system_wrappers/interface/scoped_ptr.h" 22#include "webrtc/video_engine/vie_encoder.h" 23 24using ::testing::NiceMock; 25 26namespace webrtc { 27 28class MockVieEncoder : public ViEEncoder { 29 public: 30 explicit MockVieEncoder(ProcessThread* process_thread) 31 : ViEEncoder(1, 1, 1, config_, *process_thread, NULL) {} 32 ~MockVieEncoder() {} 33 34 MOCK_METHOD1(OnReceivedIntraFrameRequest, 35 void(uint32_t)); 36 MOCK_METHOD2(OnReceivedSLI, 37 void(uint32_t ssrc, uint8_t picture_id)); 38 MOCK_METHOD2(OnReceivedRPSI, 39 void(uint32_t ssrc, uint64_t picture_id)); 40 MOCK_METHOD2(OnLocalSsrcChanged, 41 void(uint32_t old_ssrc, uint32_t new_ssrc)); 42 43 const Config config_; 44}; 45 46class VieKeyRequestTest : public ::testing::Test { 47 protected: 48 virtual void SetUp() { 49 process_thread_.reset(new NiceMock<MockProcessThread>); 50 encoder_state_feedback_.reset(new EncoderStateFeedback()); 51 } 52 scoped_ptr<MockProcessThread> process_thread_; 53 scoped_ptr<EncoderStateFeedback> encoder_state_feedback_; 54}; 55 56TEST_F(VieKeyRequestTest, CreateAndTriggerRequests) { 57 const int ssrc = 1234; 58 MockVieEncoder encoder(process_thread_.get()); 59 EXPECT_TRUE(encoder_state_feedback_->AddEncoder(ssrc, &encoder)); 60 61 EXPECT_CALL(encoder, OnReceivedIntraFrameRequest(ssrc)) 62 .Times(1); 63 encoder_state_feedback_->GetRtcpIntraFrameObserver()-> 64 OnReceivedIntraFrameRequest(ssrc); 65 66 const uint8_t sli_picture_id = 3; 67 EXPECT_CALL(encoder, OnReceivedSLI(ssrc, sli_picture_id)) 68 .Times(1); 69 encoder_state_feedback_->GetRtcpIntraFrameObserver()->OnReceivedSLI( 70 ssrc, sli_picture_id); 71 72 const uint64_t rpsi_picture_id = 9; 73 EXPECT_CALL(encoder, OnReceivedRPSI(ssrc, rpsi_picture_id)) 74 .Times(1); 75 encoder_state_feedback_->GetRtcpIntraFrameObserver()->OnReceivedRPSI( 76 ssrc, rpsi_picture_id); 77 78 encoder_state_feedback_->RemoveEncoder(&encoder); 79} 80 81// Register multiple encoders and make sure the request is relayed to correct 82// ViEEncoder. 83TEST_F(VieKeyRequestTest, MultipleEncoders) { 84 const int ssrc_1 = 1234; 85 const int ssrc_2 = 5678; 86 MockVieEncoder encoder_1(process_thread_.get()); 87 MockVieEncoder encoder_2(process_thread_.get()); 88 EXPECT_TRUE(encoder_state_feedback_->AddEncoder(ssrc_1, &encoder_1)); 89 EXPECT_TRUE(encoder_state_feedback_->AddEncoder(ssrc_2, &encoder_2)); 90 91 EXPECT_CALL(encoder_1, OnReceivedIntraFrameRequest(ssrc_1)) 92 .Times(1); 93 EXPECT_CALL(encoder_2, OnReceivedIntraFrameRequest(ssrc_2)) 94 .Times(1); 95 encoder_state_feedback_->GetRtcpIntraFrameObserver()-> 96 OnReceivedIntraFrameRequest(ssrc_1); 97 encoder_state_feedback_->GetRtcpIntraFrameObserver()-> 98 OnReceivedIntraFrameRequest(ssrc_2); 99 100 const uint8_t sli_pid_1 = 3; 101 const uint8_t sli_pid_2 = 4; 102 EXPECT_CALL(encoder_1, OnReceivedSLI(ssrc_1, sli_pid_1)) 103 .Times(1); 104 EXPECT_CALL(encoder_2, OnReceivedSLI(ssrc_2, sli_pid_2)) 105 .Times(1); 106 encoder_state_feedback_->GetRtcpIntraFrameObserver()->OnReceivedSLI( 107 ssrc_1, sli_pid_1); 108 encoder_state_feedback_->GetRtcpIntraFrameObserver()->OnReceivedSLI( 109 ssrc_2, sli_pid_2); 110 111 const uint64_t rpsi_pid_1 = 9; 112 const uint64_t rpsi_pid_2 = 10; 113 EXPECT_CALL(encoder_1, OnReceivedRPSI(ssrc_1, rpsi_pid_1)) 114 .Times(1); 115 EXPECT_CALL(encoder_2, OnReceivedRPSI(ssrc_2, rpsi_pid_2)) 116 .Times(1); 117 encoder_state_feedback_->GetRtcpIntraFrameObserver()->OnReceivedRPSI( 118 ssrc_1, rpsi_pid_1); 119 encoder_state_feedback_->GetRtcpIntraFrameObserver()->OnReceivedRPSI( 120 ssrc_2, rpsi_pid_2); 121 122 encoder_state_feedback_->RemoveEncoder(&encoder_1); 123 EXPECT_CALL(encoder_2, OnReceivedIntraFrameRequest(ssrc_2)) 124 .Times(1); 125 encoder_state_feedback_->GetRtcpIntraFrameObserver()-> 126 OnReceivedIntraFrameRequest(ssrc_2); 127 encoder_state_feedback_->RemoveEncoder(&encoder_2); 128} 129 130TEST_F(VieKeyRequestTest, AddTwiceError) { 131 const int ssrc = 1234; 132 MockVieEncoder encoder(process_thread_.get()); 133 EXPECT_TRUE(encoder_state_feedback_->AddEncoder(ssrc, &encoder)); 134 EXPECT_FALSE(encoder_state_feedback_->AddEncoder(ssrc, &encoder)); 135 encoder_state_feedback_->RemoveEncoder(&encoder); 136} 137 138} // namespace webrtc 139