Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(19)

Side by Side Diff: webrtc/modules/audio_coding/neteq/neteq_impl_unittest.cc

Issue 1921243002: NetEq: Dependency injection through one struct instead of many params (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Rebase, with conflicts Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/modules/audio_coding/neteq/neteq_impl.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2012 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 10
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 // This function is called when inserting a packet list into the mock packet 47 // This function is called when inserting a packet list into the mock packet
48 // buffer. The purpose is to delete all inserted packets properly, to avoid 48 // buffer. The purpose is to delete all inserted packets properly, to avoid
49 // memory leaks in the test. 49 // memory leaks in the test.
50 int DeletePacketsAndReturnOk(PacketList* packet_list) { 50 int DeletePacketsAndReturnOk(PacketList* packet_list) {
51 PacketBuffer::DeleteAllPackets(packet_list); 51 PacketBuffer::DeleteAllPackets(packet_list);
52 return PacketBuffer::kOK; 52 return PacketBuffer::kOK;
53 } 53 }
54 54
55 class NetEqImplTest : public ::testing::Test { 55 class NetEqImplTest : public ::testing::Test {
56 protected: 56 protected:
57 NetEqImplTest() 57 NetEqImplTest() { config_.sample_rate_hz = 8000; }
58 : neteq_(NULL),
59 config_(),
60 tick_timer_(new TickTimer),
61 mock_buffer_level_filter_(NULL),
62 buffer_level_filter_(NULL),
63 use_mock_buffer_level_filter_(true),
64 mock_decoder_database_(NULL),
65 decoder_database_(NULL),
66 use_mock_decoder_database_(true),
67 mock_delay_peak_detector_(NULL),
68 delay_peak_detector_(NULL),
69 use_mock_delay_peak_detector_(true),
70 mock_delay_manager_(NULL),
71 delay_manager_(NULL),
72 use_mock_delay_manager_(true),
73 mock_dtmf_buffer_(NULL),
74 dtmf_buffer_(NULL),
75 use_mock_dtmf_buffer_(true),
76 mock_dtmf_tone_generator_(NULL),
77 dtmf_tone_generator_(NULL),
78 use_mock_dtmf_tone_generator_(true),
79 mock_packet_buffer_(NULL),
80 packet_buffer_(NULL),
81 use_mock_packet_buffer_(true),
82 mock_payload_splitter_(NULL),
83 payload_splitter_(NULL),
84 use_mock_payload_splitter_(true),
85 timestamp_scaler_(NULL) {
86 config_.sample_rate_hz = 8000;
87 }
88 58
89 void CreateInstance() { 59 void CreateInstance() {
60 NetEqImpl::Dependencies deps(config_);
61
62 // Get a local pointer to NetEq's TickTimer object.
63 tick_timer_ = deps.tick_timer.get();
64
90 if (use_mock_buffer_level_filter_) { 65 if (use_mock_buffer_level_filter_) {
91 mock_buffer_level_filter_ = new MockBufferLevelFilter; 66 std::unique_ptr<MockBufferLevelFilter> mock(new MockBufferLevelFilter);
92 buffer_level_filter_ = mock_buffer_level_filter_; 67 mock_buffer_level_filter_ = mock.get();
93 } else { 68 deps.buffer_level_filter = std::move(mock);
94 buffer_level_filter_ = new BufferLevelFilter;
95 } 69 }
70 buffer_level_filter_ = deps.buffer_level_filter.get();
71
96 if (use_mock_decoder_database_) { 72 if (use_mock_decoder_database_) {
97 mock_decoder_database_ = new MockDecoderDatabase; 73 std::unique_ptr<MockDecoderDatabase> mock(new MockDecoderDatabase);
74 mock_decoder_database_ = mock.get();
98 EXPECT_CALL(*mock_decoder_database_, GetActiveCngDecoder()) 75 EXPECT_CALL(*mock_decoder_database_, GetActiveCngDecoder())
99 .WillOnce(ReturnNull()); 76 .WillOnce(ReturnNull());
100 decoder_database_ = mock_decoder_database_; 77 deps.decoder_database = std::move(mock);
78 }
79 decoder_database_ = deps.decoder_database.get();
80
81 if (use_mock_delay_peak_detector_) {
82 std::unique_ptr<MockDelayPeakDetector> mock(new MockDelayPeakDetector);
83 mock_delay_peak_detector_ = mock.get();
84 EXPECT_CALL(*mock_delay_peak_detector_, Reset()).Times(1);
85 deps.delay_peak_detector = std::move(mock);
86 }
87 delay_peak_detector_ = deps.delay_peak_detector.get();
88
89 if (use_mock_delay_manager_) {
90 std::unique_ptr<MockDelayManager> mock(new MockDelayManager(
91 config_.max_packets_in_buffer, delay_peak_detector_));
92 mock_delay_manager_ = mock.get();
93 EXPECT_CALL(*mock_delay_manager_, set_streaming_mode(false)).Times(1);
94 deps.delay_manager = std::move(mock);
95 }
96 delay_manager_ = deps.delay_manager.get();
97
98 if (use_mock_dtmf_buffer_) {
99 std::unique_ptr<MockDtmfBuffer> mock(
100 new MockDtmfBuffer(config_.sample_rate_hz));
101 mock_dtmf_buffer_ = mock.get();
102 deps.dtmf_buffer = std::move(mock);
103 }
104 dtmf_buffer_ = deps.dtmf_buffer.get();
105
106 if (use_mock_dtmf_tone_generator_) {
107 std::unique_ptr<MockDtmfToneGenerator> mock(new MockDtmfToneGenerator);
108 mock_dtmf_tone_generator_ = mock.get();
109 deps.dtmf_tone_generator = std::move(mock);
110 }
111 dtmf_tone_generator_ = deps.dtmf_tone_generator.get();
112
113 if (use_mock_packet_buffer_) {
114 std::unique_ptr<MockPacketBuffer> mock(
115 new MockPacketBuffer(config_.max_packets_in_buffer, tick_timer_));
116 mock_packet_buffer_ = mock.get();
117 deps.packet_buffer = std::move(mock);
101 } else { 118 } else {
102 decoder_database_ = new DecoderDatabase; 119 deps.packet_buffer.reset(
120 new PacketBuffer(config_.max_packets_in_buffer, tick_timer_));
103 } 121 }
104 if (use_mock_delay_peak_detector_) { 122 packet_buffer_ = deps.packet_buffer.get();
105 mock_delay_peak_detector_ = new MockDelayPeakDetector; 123
106 EXPECT_CALL(*mock_delay_peak_detector_, Reset()).Times(1); 124 if (use_mock_payload_splitter_) {
107 delay_peak_detector_ = mock_delay_peak_detector_; 125 std::unique_ptr<MockPayloadSplitter> mock(new MockPayloadSplitter);
108 } else { 126 mock_payload_splitter_ = mock.get();
109 delay_peak_detector_ = new DelayPeakDetector; 127 deps.payload_splitter = std::move(mock);
110 } 128 }
111 if (use_mock_delay_manager_) { 129 payload_splitter_ = deps.payload_splitter.get();
112 mock_delay_manager_ = new MockDelayManager(config_.max_packets_in_buffer,
113 delay_peak_detector_);
114 EXPECT_CALL(*mock_delay_manager_, set_streaming_mode(false)).Times(1);
115 delay_manager_ = mock_delay_manager_;
116 } else {
117 delay_manager_ =
118 new DelayManager(config_.max_packets_in_buffer, delay_peak_detector_);
119 }
120 if (use_mock_dtmf_buffer_) {
121 mock_dtmf_buffer_ = new MockDtmfBuffer(config_.sample_rate_hz);
122 dtmf_buffer_ = mock_dtmf_buffer_;
123 } else {
124 dtmf_buffer_ = new DtmfBuffer(config_.sample_rate_hz);
125 }
126 if (use_mock_dtmf_tone_generator_) {
127 mock_dtmf_tone_generator_ = new MockDtmfToneGenerator;
128 dtmf_tone_generator_ = mock_dtmf_tone_generator_;
129 } else {
130 dtmf_tone_generator_ = new DtmfToneGenerator;
131 }
132 if (use_mock_packet_buffer_) {
133 mock_packet_buffer_ =
134 new MockPacketBuffer(config_.max_packets_in_buffer, tick_timer_);
135 packet_buffer_ = mock_packet_buffer_;
136 } else {
137 packet_buffer_ =
138 new PacketBuffer(config_.max_packets_in_buffer, tick_timer_);
139 }
140 if (use_mock_payload_splitter_) {
141 mock_payload_splitter_ = new MockPayloadSplitter;
142 payload_splitter_ = mock_payload_splitter_;
143 } else {
144 payload_splitter_ = new PayloadSplitter;
145 }
146 timestamp_scaler_ = new TimestampScaler(*decoder_database_);
147 AccelerateFactory* accelerate_factory = new AccelerateFactory;
148 ExpandFactory* expand_factory = new ExpandFactory;
149 PreemptiveExpandFactory* preemptive_expand_factory =
150 new PreemptiveExpandFactory;
151 130
152 neteq_ = new NetEqImpl( 131 deps.timestamp_scaler = std::unique_ptr<TimestampScaler>(
153 config_, std::unique_ptr<TickTimer>(tick_timer_), buffer_level_filter_, 132 new TimestampScaler(*deps.decoder_database.get()));
154 decoder_database_, delay_manager_, delay_peak_detector_, dtmf_buffer_, 133
155 dtmf_tone_generator_, packet_buffer_, payload_splitter_, 134 neteq_.reset(new NetEqImpl(config_, std::move(deps)));
156 timestamp_scaler_, accelerate_factory, expand_factory,
157 preemptive_expand_factory);
158 ASSERT_TRUE(neteq_ != NULL); 135 ASSERT_TRUE(neteq_ != NULL);
159 } 136 }
160 137
161 void UseNoMocks() { 138 void UseNoMocks() {
162 ASSERT_TRUE(neteq_ == NULL) << "Must call UseNoMocks before CreateInstance"; 139 ASSERT_TRUE(neteq_ == NULL) << "Must call UseNoMocks before CreateInstance";
163 use_mock_buffer_level_filter_ = false; 140 use_mock_buffer_level_filter_ = false;
164 use_mock_decoder_database_ = false; 141 use_mock_decoder_database_ = false;
165 use_mock_delay_peak_detector_ = false; 142 use_mock_delay_peak_detector_ = false;
166 use_mock_delay_manager_ = false; 143 use_mock_delay_manager_ = false;
167 use_mock_dtmf_buffer_ = false; 144 use_mock_dtmf_buffer_ = false;
(...skipping 17 matching lines...) Expand all
185 } 162 }
186 if (use_mock_dtmf_buffer_) { 163 if (use_mock_dtmf_buffer_) {
187 EXPECT_CALL(*mock_dtmf_buffer_, Die()).Times(1); 164 EXPECT_CALL(*mock_dtmf_buffer_, Die()).Times(1);
188 } 165 }
189 if (use_mock_dtmf_tone_generator_) { 166 if (use_mock_dtmf_tone_generator_) {
190 EXPECT_CALL(*mock_dtmf_tone_generator_, Die()).Times(1); 167 EXPECT_CALL(*mock_dtmf_tone_generator_, Die()).Times(1);
191 } 168 }
192 if (use_mock_packet_buffer_) { 169 if (use_mock_packet_buffer_) {
193 EXPECT_CALL(*mock_packet_buffer_, Die()).Times(1); 170 EXPECT_CALL(*mock_packet_buffer_, Die()).Times(1);
194 } 171 }
195 delete neteq_;
196 } 172 }
197 173
198 NetEqImpl* neteq_; 174 std::unique_ptr<NetEqImpl> neteq_;
199 NetEq::Config config_; 175 NetEq::Config config_;
200 TickTimer* tick_timer_; 176 TickTimer* tick_timer_ = nullptr;
201 MockBufferLevelFilter* mock_buffer_level_filter_; 177 MockBufferLevelFilter* mock_buffer_level_filter_ = nullptr;
202 BufferLevelFilter* buffer_level_filter_; 178 BufferLevelFilter* buffer_level_filter_ = nullptr;
203 bool use_mock_buffer_level_filter_; 179 bool use_mock_buffer_level_filter_ = true;
204 MockDecoderDatabase* mock_decoder_database_; 180 MockDecoderDatabase* mock_decoder_database_ = nullptr;
205 DecoderDatabase* decoder_database_; 181 DecoderDatabase* decoder_database_ = nullptr;
206 bool use_mock_decoder_database_; 182 bool use_mock_decoder_database_ = true;
207 MockDelayPeakDetector* mock_delay_peak_detector_; 183 MockDelayPeakDetector* mock_delay_peak_detector_ = nullptr;
208 DelayPeakDetector* delay_peak_detector_; 184 DelayPeakDetector* delay_peak_detector_ = nullptr;
209 bool use_mock_delay_peak_detector_; 185 bool use_mock_delay_peak_detector_ = true;
210 MockDelayManager* mock_delay_manager_; 186 MockDelayManager* mock_delay_manager_ = nullptr;
211 DelayManager* delay_manager_; 187 DelayManager* delay_manager_ = nullptr;
212 bool use_mock_delay_manager_; 188 bool use_mock_delay_manager_ = true;
213 MockDtmfBuffer* mock_dtmf_buffer_; 189 MockDtmfBuffer* mock_dtmf_buffer_ = nullptr;
214 DtmfBuffer* dtmf_buffer_; 190 DtmfBuffer* dtmf_buffer_ = nullptr;
215 bool use_mock_dtmf_buffer_; 191 bool use_mock_dtmf_buffer_ = true;
216 MockDtmfToneGenerator* mock_dtmf_tone_generator_; 192 MockDtmfToneGenerator* mock_dtmf_tone_generator_ = nullptr;
217 DtmfToneGenerator* dtmf_tone_generator_; 193 DtmfToneGenerator* dtmf_tone_generator_ = nullptr;
218 bool use_mock_dtmf_tone_generator_; 194 bool use_mock_dtmf_tone_generator_ = true;
219 MockPacketBuffer* mock_packet_buffer_; 195 MockPacketBuffer* mock_packet_buffer_ = nullptr;
220 PacketBuffer* packet_buffer_; 196 PacketBuffer* packet_buffer_ = nullptr;
221 bool use_mock_packet_buffer_; 197 bool use_mock_packet_buffer_ = true;
222 MockPayloadSplitter* mock_payload_splitter_; 198 MockPayloadSplitter* mock_payload_splitter_ = nullptr;
223 PayloadSplitter* payload_splitter_; 199 PayloadSplitter* payload_splitter_ = nullptr;
224 bool use_mock_payload_splitter_; 200 bool use_mock_payload_splitter_ = true;
225 TimestampScaler* timestamp_scaler_;
226 }; 201 };
227 202
228 203
229 // This tests the interface class NetEq. 204 // This tests the interface class NetEq.
230 // TODO(hlundin): Move to separate file? 205 // TODO(hlundin): Move to separate file?
231 TEST(NetEq, CreateAndDestroy) { 206 TEST(NetEq, CreateAndDestroy) {
232 NetEq::Config config; 207 NetEq::Config config;
233 NetEq* neteq = NetEq::Create(config); 208 NetEq* neteq = NetEq::Create(config);
234 delete neteq; 209 delete neteq;
235 } 210 }
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 EXPECT_CALL(*mock_delay_manager_, 321 EXPECT_CALL(*mock_delay_manager_,
347 LastDecoderType(NetEqDecoder::kDecoderPCMu)) 322 LastDecoderType(NetEqDecoder::kDecoderPCMu))
348 .Times(1); 323 .Times(1);
349 EXPECT_CALL(*mock_delay_manager_, last_pack_cng_or_dtmf()) 324 EXPECT_CALL(*mock_delay_manager_, last_pack_cng_or_dtmf())
350 .WillOnce(Return(0)); 325 .WillOnce(Return(0));
351 EXPECT_CALL(*mock_delay_manager_, SetPacketAudioLength(30)) 326 EXPECT_CALL(*mock_delay_manager_, SetPacketAudioLength(30))
352 .WillOnce(Return(0)); 327 .WillOnce(Return(0));
353 } 328 }
354 329
355 // Expectations for payload splitter. 330 // Expectations for payload splitter.
356 EXPECT_CALL(*mock_payload_splitter_, SplitFec(_, _))
357 .Times(2)
358 .WillRepeatedly(Return(PayloadSplitter::kOK));
359 EXPECT_CALL(*mock_payload_splitter_, SplitAudio(_, _)) 331 EXPECT_CALL(*mock_payload_splitter_, SplitAudio(_, _))
360 .Times(2) 332 .Times(2)
361 .WillRepeatedly(Return(PayloadSplitter::kOK)); 333 .WillRepeatedly(Return(PayloadSplitter::kOK));
362 334
363 // Insert first packet. 335 // Insert first packet.
364 neteq_->InsertPacket(rtp_header, payload, kFirstReceiveTime); 336 neteq_->InsertPacket(rtp_header, payload, kFirstReceiveTime);
365 337
366 // Insert second packet. 338 // Insert second packet.
367 rtp_header.header.timestamp += 160; 339 rtp_header.header.timestamp += 160;
368 rtp_header.header.sequenceNumber += 1; 340 rtp_header.header.sequenceNumber += 1;
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
514 rtp_header.header.sequenceNumber = 0x1234; 486 rtp_header.header.sequenceNumber = 0x1234;
515 rtp_header.header.timestamp = 0x12345678; 487 rtp_header.header.timestamp = 0x12345678;
516 rtp_header.header.ssrc = 0x87654321; 488 rtp_header.header.ssrc = 0x87654321;
517 489
518 // Create a mock decoder object. 490 // Create a mock decoder object.
519 MockAudioDecoder mock_decoder; 491 MockAudioDecoder mock_decoder;
520 EXPECT_CALL(mock_decoder, Reset()).WillRepeatedly(Return()); 492 EXPECT_CALL(mock_decoder, Reset()).WillRepeatedly(Return());
521 EXPECT_CALL(mock_decoder, Channels()).WillRepeatedly(Return(1)); 493 EXPECT_CALL(mock_decoder, Channels()).WillRepeatedly(Return(1));
522 EXPECT_CALL(mock_decoder, IncomingPacket(_, kPayloadLengthBytes, _, _, _)) 494 EXPECT_CALL(mock_decoder, IncomingPacket(_, kPayloadLengthBytes, _, _, _))
523 .WillRepeatedly(Return(0)); 495 .WillRepeatedly(Return(0));
524 EXPECT_CALL(mock_decoder, PacketDuration(_, kPayloadLengthBytes))
525 .WillRepeatedly(Return(kPayloadLengthSamples));
526 int16_t dummy_output[kPayloadLengthSamples] = {0}; 496 int16_t dummy_output[kPayloadLengthSamples] = {0};
527 // The below expectation will make the mock decoder write 497 // The below expectation will make the mock decoder write
528 // |kPayloadLengthSamples| zeros to the output array, and mark it as speech. 498 // |kPayloadLengthSamples| zeros to the output array, and mark it as speech.
529 EXPECT_CALL(mock_decoder, DecodeInternal(Pointee(0), kPayloadLengthBytes, 499 EXPECT_CALL(mock_decoder, DecodeInternal(Pointee(0), kPayloadLengthBytes,
530 kSampleRateHz, _, _)) 500 kSampleRateHz, _, _))
531 .WillOnce(DoAll(SetArrayArgument<3>(dummy_output, 501 .WillOnce(DoAll(SetArrayArgument<3>(dummy_output,
532 dummy_output + kPayloadLengthSamples), 502 dummy_output + kPayloadLengthSamples),
533 SetArgPointee<4>(AudioDecoder::kSpeech), 503 SetArgPointee<4>(AudioDecoder::kSpeech),
534 Return(kPayloadLengthSamples))); 504 Return(kPayloadLengthSamples)));
535 EXPECT_EQ(NetEq::kOK, neteq_->RegisterExternalDecoder( 505 EXPECT_EQ(NetEq::kOK, neteq_->RegisterExternalDecoder(
(...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after
1204 UseNoMocks(); 1174 UseNoMocks();
1205 CreateInstance(); 1175 CreateInstance();
1206 ASSERT_TRUE(tick_timer_); 1176 ASSERT_TRUE(tick_timer_);
1207 EXPECT_EQ(0u, tick_timer_->ticks()); 1177 EXPECT_EQ(0u, tick_timer_->ticks());
1208 AudioFrame output; 1178 AudioFrame output;
1209 EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output)); 1179 EXPECT_EQ(NetEq::kOK, neteq_->GetAudio(&output));
1210 EXPECT_EQ(1u, tick_timer_->ticks()); 1180 EXPECT_EQ(1u, tick_timer_->ticks());
1211 } 1181 }
1212 1182
1213 }// namespace webrtc 1183 }// namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/modules/audio_coding/neteq/neteq_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698