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