blob: 61a4c40fc1faf04e135691ed262593ff6374d55f [file] [log] [blame]
solenbergc7a8b082015-10-16 14:35:07 -07001/*
2 * Copyright (c) 2015 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
Jonas Olssona4d87372019-07-05 19:08:33 +020011#include "call/call.h"
12
solenbergc7a8b082015-10-16 14:35:07 -070013#include <list>
kwiberg1c07c702017-03-27 07:15:49 -070014#include <map>
kwibergb25345e2016-03-12 06:10:44 -080015#include <memory>
zstein7cb69d52017-05-08 11:52:38 -070016#include <utility>
solenbergc7a8b082015-10-16 14:35:07 -070017
Karl Wiberg918f50c2018-07-05 11:40:33 +020018#include "absl/memory/memory.h"
Karl Wibergf3850f62017-11-02 13:04:41 +010019#include "api/audio_codecs/builtin_audio_decoder_factory.h"
Danil Chapovalov83bbe912019-08-07 12:24:53 +020020#include "api/rtc_event_log/rtc_event_log.h"
Danil Chapovalov53d45ba2019-07-03 14:56:33 +020021#include "api/task_queue/default_task_queue_factory.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020022#include "api/test/mock_audio_mixer.h"
Henrik Boströmf4a99912020-06-11 12:07:14 +020023#include "api/test/video/function_video_encoder_factory.h"
Erik Språng014dd3c2019-11-28 13:44:25 +010024#include "api/transport/field_trial_based_config.h"
Henrik Boströmf4a99912020-06-11 12:07:14 +020025#include "api/video/builtin_video_bitrate_allocator_factory.h"
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +010026#include "audio/audio_receive_stream.h"
Yves Gerey665174f2018-06-19 15:03:05 +020027#include "audio/audio_send_stream.h"
Henrik Boströmf4a99912020-06-11 12:07:14 +020028#include "call/adaptation/test/fake_resource.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020029#include "call/audio_state.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020030#include "modules/audio_device/include/mock_audio_device.h"
Fredrik Solenberg2a877972017-12-15 16:42:15 +010031#include "modules/audio_processing/include/mock_audio_processing.h"
Tomas Gunnarssonf25761d2020-06-03 22:55:33 +020032#include "modules/rtp_rtcp/source/rtp_rtcp_interface.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020033#include "test/fake_encoder.h"
34#include "test/gtest.h"
35#include "test/mock_audio_decoder_factory.h"
36#include "test/mock_transport.h"
Tommi553c8692020-05-05 15:35:45 +020037#include "test/run_loop.h"
solenbergc7a8b082015-10-16 14:35:07 -070038
39namespace {
40
Henrik Boströmf4a99912020-06-11 12:07:14 +020041using ::testing::Contains;
42
solenbergc7a8b082015-10-16 14:35:07 -070043struct CallHelper {
Per Åhgrencc73ed32020-04-26 23:56:17 +020044 explicit CallHelper(bool use_null_audio_processing) {
Danil Chapovalov53d45ba2019-07-03 14:56:33 +020045 task_queue_factory_ = webrtc::CreateDefaultTaskQueueFactory();
solenberg566ef242015-11-06 15:34:49 -080046 webrtc::AudioState::Config audio_state_config;
Fredrik Solenberg2a877972017-12-15 16:42:15 +010047 audio_state_config.audio_mixer =
48 new rtc::RefCountedObject<webrtc::test::MockAudioMixer>();
49 audio_state_config.audio_processing =
Per Åhgrencc73ed32020-04-26 23:56:17 +020050 use_null_audio_processing
51 ? nullptr
52 : new rtc::RefCountedObject<webrtc::test::MockAudioProcessing>();
Fredrik Solenberg2a877972017-12-15 16:42:15 +010053 audio_state_config.audio_device_module =
54 new rtc::RefCountedObject<webrtc::test::MockAudioDeviceModule>();
skvlad11a9cbf2016-10-07 11:53:05 -070055 webrtc::Call::Config config(&event_log_);
solenberg566ef242015-11-06 15:34:49 -080056 config.audio_state = webrtc::AudioState::Create(audio_state_config);
Danil Chapovalov53d45ba2019-07-03 14:56:33 +020057 config.task_queue_factory = task_queue_factory_.get();
Erik Språng014dd3c2019-11-28 13:44:25 +010058 config.trials = &field_trials_;
solenbergc7a8b082015-10-16 14:35:07 -070059 call_.reset(webrtc::Call::Create(config));
60 }
61
62 webrtc::Call* operator->() { return call_.get(); }
63
64 private:
Tommi553c8692020-05-05 15:35:45 +020065 webrtc::test::RunLoop loop_;
Danil Chapovalov83bbe912019-08-07 12:24:53 +020066 webrtc::RtcEventLogNull event_log_;
Erik Språng014dd3c2019-11-28 13:44:25 +010067 webrtc::FieldTrialBasedConfig field_trials_;
Danil Chapovalov53d45ba2019-07-03 14:56:33 +020068 std::unique_ptr<webrtc::TaskQueueFactory> task_queue_factory_;
kwibergb25345e2016-03-12 06:10:44 -080069 std::unique_ptr<webrtc::Call> call_;
solenbergc7a8b082015-10-16 14:35:07 -070070};
71} // namespace
72
73namespace webrtc {
74
75TEST(CallTest, ConstructDestruct) {
Per Åhgrencc73ed32020-04-26 23:56:17 +020076 for (bool use_null_audio_processing : {false, true}) {
77 CallHelper call(use_null_audio_processing);
78 }
solenbergc7a8b082015-10-16 14:35:07 -070079}
80
81TEST(CallTest, CreateDestroy_AudioSendStream) {
Per Åhgrencc73ed32020-04-26 23:56:17 +020082 for (bool use_null_audio_processing : {false, true}) {
83 CallHelper call(use_null_audio_processing);
84 MockTransport send_transport;
85 AudioSendStream::Config config(&send_transport);
86 config.rtp.ssrc = 42;
87 AudioSendStream* stream = call->CreateAudioSendStream(config);
88 EXPECT_NE(stream, nullptr);
89 call->DestroyAudioSendStream(stream);
90 }
solenbergc7a8b082015-10-16 14:35:07 -070091}
92
93TEST(CallTest, CreateDestroy_AudioReceiveStream) {
Per Åhgrencc73ed32020-04-26 23:56:17 +020094 for (bool use_null_audio_processing : {false, true}) {
95 CallHelper call(use_null_audio_processing);
96 AudioReceiveStream::Config config;
97 MockTransport rtcp_send_transport;
98 config.rtp.remote_ssrc = 42;
99 config.rtcp_send_transport = &rtcp_send_transport;
100 config.decoder_factory =
101 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
102 AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
103 EXPECT_NE(stream, nullptr);
104 call->DestroyAudioReceiveStream(stream);
105 }
solenbergc7a8b082015-10-16 14:35:07 -0700106}
107
108TEST(CallTest, CreateDestroy_AudioSendStreams) {
Per Åhgrencc73ed32020-04-26 23:56:17 +0200109 for (bool use_null_audio_processing : {false, true}) {
110 CallHelper call(use_null_audio_processing);
111 MockTransport send_transport;
112 AudioSendStream::Config config(&send_transport);
113 std::list<AudioSendStream*> streams;
114 for (int i = 0; i < 2; ++i) {
115 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
116 config.rtp.ssrc = ssrc;
117 AudioSendStream* stream = call->CreateAudioSendStream(config);
118 EXPECT_NE(stream, nullptr);
119 if (ssrc & 1) {
120 streams.push_back(stream);
121 } else {
122 streams.push_front(stream);
123 }
solenbergc7a8b082015-10-16 14:35:07 -0700124 }
Per Åhgrencc73ed32020-04-26 23:56:17 +0200125 for (auto s : streams) {
126 call->DestroyAudioSendStream(s);
127 }
128 streams.clear();
solenbergc7a8b082015-10-16 14:35:07 -0700129 }
solenbergc7a8b082015-10-16 14:35:07 -0700130 }
131}
132
133TEST(CallTest, CreateDestroy_AudioReceiveStreams) {
Per Åhgrencc73ed32020-04-26 23:56:17 +0200134 for (bool use_null_audio_processing : {false, true}) {
135 CallHelper call(use_null_audio_processing);
136 AudioReceiveStream::Config config;
137 MockTransport rtcp_send_transport;
138 config.rtcp_send_transport = &rtcp_send_transport;
139 config.decoder_factory =
140 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
141 std::list<AudioReceiveStream*> streams;
142 for (int i = 0; i < 2; ++i) {
143 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
144 config.rtp.remote_ssrc = ssrc;
145 AudioReceiveStream* stream = call->CreateAudioReceiveStream(config);
146 EXPECT_NE(stream, nullptr);
147 if (ssrc & 1) {
148 streams.push_back(stream);
149 } else {
150 streams.push_front(stream);
151 }
solenbergc7a8b082015-10-16 14:35:07 -0700152 }
Per Åhgrencc73ed32020-04-26 23:56:17 +0200153 for (auto s : streams) {
154 call->DestroyAudioReceiveStream(s);
155 }
156 streams.clear();
solenbergc7a8b082015-10-16 14:35:07 -0700157 }
solenbergc7a8b082015-10-16 14:35:07 -0700158 }
159}
brandtr25445d32016-10-23 23:37:14 -0700160
solenberg7602aab2016-11-14 11:30:07 -0800161TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_RecvFirst) {
Per Åhgrencc73ed32020-04-26 23:56:17 +0200162 for (bool use_null_audio_processing : {false, true}) {
163 CallHelper call(use_null_audio_processing);
164 AudioReceiveStream::Config recv_config;
165 MockTransport rtcp_send_transport;
166 recv_config.rtp.remote_ssrc = 42;
167 recv_config.rtp.local_ssrc = 777;
168 recv_config.rtcp_send_transport = &rtcp_send_transport;
169 recv_config.decoder_factory =
170 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
171 AudioReceiveStream* recv_stream =
172 call->CreateAudioReceiveStream(recv_config);
173 EXPECT_NE(recv_stream, nullptr);
solenberg7602aab2016-11-14 11:30:07 -0800174
Per Åhgrencc73ed32020-04-26 23:56:17 +0200175 MockTransport send_transport;
176 AudioSendStream::Config send_config(&send_transport);
177 send_config.rtp.ssrc = 777;
178 AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
179 EXPECT_NE(send_stream, nullptr);
solenberg7602aab2016-11-14 11:30:07 -0800180
Per Åhgrencc73ed32020-04-26 23:56:17 +0200181 internal::AudioReceiveStream* internal_recv_stream =
182 static_cast<internal::AudioReceiveStream*>(recv_stream);
183 EXPECT_EQ(send_stream,
184 internal_recv_stream->GetAssociatedSendStreamForTesting());
solenberg7602aab2016-11-14 11:30:07 -0800185
Per Åhgrencc73ed32020-04-26 23:56:17 +0200186 call->DestroyAudioSendStream(send_stream);
187 EXPECT_EQ(nullptr,
188 internal_recv_stream->GetAssociatedSendStreamForTesting());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100189
Per Åhgrencc73ed32020-04-26 23:56:17 +0200190 call->DestroyAudioReceiveStream(recv_stream);
191 }
solenberg7602aab2016-11-14 11:30:07 -0800192}
193
194TEST(CallTest, CreateDestroy_AssociateAudioSendReceiveStreams_SendFirst) {
Per Åhgrencc73ed32020-04-26 23:56:17 +0200195 for (bool use_null_audio_processing : {false, true}) {
196 CallHelper call(use_null_audio_processing);
197 MockTransport send_transport;
198 AudioSendStream::Config send_config(&send_transport);
199 send_config.rtp.ssrc = 777;
200 AudioSendStream* send_stream = call->CreateAudioSendStream(send_config);
201 EXPECT_NE(send_stream, nullptr);
solenberg7602aab2016-11-14 11:30:07 -0800202
Per Åhgrencc73ed32020-04-26 23:56:17 +0200203 AudioReceiveStream::Config recv_config;
204 MockTransport rtcp_send_transport;
205 recv_config.rtp.remote_ssrc = 42;
206 recv_config.rtp.local_ssrc = 777;
207 recv_config.rtcp_send_transport = &rtcp_send_transport;
208 recv_config.decoder_factory =
209 new rtc::RefCountedObject<webrtc::MockAudioDecoderFactory>();
210 AudioReceiveStream* recv_stream =
211 call->CreateAudioReceiveStream(recv_config);
212 EXPECT_NE(recv_stream, nullptr);
solenberg7602aab2016-11-14 11:30:07 -0800213
Per Åhgrencc73ed32020-04-26 23:56:17 +0200214 internal::AudioReceiveStream* internal_recv_stream =
215 static_cast<internal::AudioReceiveStream*>(recv_stream);
216 EXPECT_EQ(send_stream,
217 internal_recv_stream->GetAssociatedSendStreamForTesting());
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100218
Per Åhgrencc73ed32020-04-26 23:56:17 +0200219 call->DestroyAudioReceiveStream(recv_stream);
solenberg7602aab2016-11-14 11:30:07 -0800220
Per Åhgrencc73ed32020-04-26 23:56:17 +0200221 call->DestroyAudioSendStream(send_stream);
222 }
solenberg7602aab2016-11-14 11:30:07 -0800223}
224
brandtr25445d32016-10-23 23:37:14 -0700225TEST(CallTest, CreateDestroy_FlexfecReceiveStream) {
Per Åhgrencc73ed32020-04-26 23:56:17 +0200226 for (bool use_null_audio_processing : {false, true}) {
227 CallHelper call(use_null_audio_processing);
228 MockTransport rtcp_send_transport;
229 FlexfecReceiveStream::Config config(&rtcp_send_transport);
230 config.payload_type = 118;
231 config.remote_ssrc = 38837212;
232 config.protected_media_ssrcs = {27273};
brandtr25445d32016-10-23 23:37:14 -0700233
Per Åhgrencc73ed32020-04-26 23:56:17 +0200234 FlexfecReceiveStream* stream = call->CreateFlexfecReceiveStream(config);
235 EXPECT_NE(stream, nullptr);
236 call->DestroyFlexfecReceiveStream(stream);
237 }
brandtr25445d32016-10-23 23:37:14 -0700238}
239
240TEST(CallTest, CreateDestroy_FlexfecReceiveStreams) {
Per Åhgrencc73ed32020-04-26 23:56:17 +0200241 for (bool use_null_audio_processing : {false, true}) {
242 CallHelper call(use_null_audio_processing);
243 MockTransport rtcp_send_transport;
244 FlexfecReceiveStream::Config config(&rtcp_send_transport);
245 config.payload_type = 118;
246 std::list<FlexfecReceiveStream*> streams;
brandtr25445d32016-10-23 23:37:14 -0700247
Per Åhgrencc73ed32020-04-26 23:56:17 +0200248 for (int i = 0; i < 2; ++i) {
249 for (uint32_t ssrc = 0; ssrc < 1234567; ssrc += 34567) {
250 config.remote_ssrc = ssrc;
251 config.protected_media_ssrcs = {ssrc + 1};
252 FlexfecReceiveStream* stream = call->CreateFlexfecReceiveStream(config);
253 EXPECT_NE(stream, nullptr);
254 if (ssrc & 1) {
255 streams.push_back(stream);
256 } else {
257 streams.push_front(stream);
258 }
brandtr25445d32016-10-23 23:37:14 -0700259 }
Per Åhgrencc73ed32020-04-26 23:56:17 +0200260 for (auto s : streams) {
261 call->DestroyFlexfecReceiveStream(s);
262 }
263 streams.clear();
brandtr25445d32016-10-23 23:37:14 -0700264 }
brandtr25445d32016-10-23 23:37:14 -0700265 }
266}
267
268TEST(CallTest, MultipleFlexfecReceiveStreamsProtectingSingleVideoStream) {
Per Åhgrencc73ed32020-04-26 23:56:17 +0200269 for (bool use_null_audio_processing : {false, true}) {
270 CallHelper call(use_null_audio_processing);
271 MockTransport rtcp_send_transport;
272 FlexfecReceiveStream::Config config(&rtcp_send_transport);
273 config.payload_type = 118;
274 config.protected_media_ssrcs = {1324234};
275 FlexfecReceiveStream* stream;
276 std::list<FlexfecReceiveStream*> streams;
brandtr25445d32016-10-23 23:37:14 -0700277
Per Åhgrencc73ed32020-04-26 23:56:17 +0200278 config.remote_ssrc = 838383;
279 stream = call->CreateFlexfecReceiveStream(config);
280 EXPECT_NE(stream, nullptr);
281 streams.push_back(stream);
brandtr25445d32016-10-23 23:37:14 -0700282
Per Åhgrencc73ed32020-04-26 23:56:17 +0200283 config.remote_ssrc = 424993;
284 stream = call->CreateFlexfecReceiveStream(config);
285 EXPECT_NE(stream, nullptr);
286 streams.push_back(stream);
brandtr25445d32016-10-23 23:37:14 -0700287
Per Åhgrencc73ed32020-04-26 23:56:17 +0200288 config.remote_ssrc = 99383;
289 stream = call->CreateFlexfecReceiveStream(config);
290 EXPECT_NE(stream, nullptr);
291 streams.push_back(stream);
brandtr25445d32016-10-23 23:37:14 -0700292
Per Åhgrencc73ed32020-04-26 23:56:17 +0200293 config.remote_ssrc = 5548;
294 stream = call->CreateFlexfecReceiveStream(config);
295 EXPECT_NE(stream, nullptr);
296 streams.push_back(stream);
brandtr25445d32016-10-23 23:37:14 -0700297
Per Åhgrencc73ed32020-04-26 23:56:17 +0200298 for (auto s : streams) {
299 call->DestroyFlexfecReceiveStream(s);
300 }
brandtr25445d32016-10-23 23:37:14 -0700301 }
302}
303
ossuc3d4b482017-05-23 06:07:11 -0700304TEST(CallTest, RecreatingAudioStreamWithSameSsrcReusesRtpState) {
305 constexpr uint32_t kSSRC = 12345;
Per Åhgrencc73ed32020-04-26 23:56:17 +0200306 for (bool use_null_audio_processing : {false, true}) {
307 CallHelper call(use_null_audio_processing);
ossuc3d4b482017-05-23 06:07:11 -0700308
Per Åhgrencc73ed32020-04-26 23:56:17 +0200309 auto create_stream_and_get_rtp_state = [&](uint32_t ssrc) {
310 MockTransport send_transport;
311 AudioSendStream::Config config(&send_transport);
312 config.rtp.ssrc = ssrc;
313 AudioSendStream* stream = call->CreateAudioSendStream(config);
314 const RtpState rtp_state =
315 static_cast<internal::AudioSendStream*>(stream)->GetRtpState();
316 call->DestroyAudioSendStream(stream);
317 return rtp_state;
318 };
ossuc3d4b482017-05-23 06:07:11 -0700319
Per Åhgrencc73ed32020-04-26 23:56:17 +0200320 const RtpState rtp_state1 = create_stream_and_get_rtp_state(kSSRC);
321 const RtpState rtp_state2 = create_stream_and_get_rtp_state(kSSRC);
ossuc3d4b482017-05-23 06:07:11 -0700322
Per Åhgrencc73ed32020-04-26 23:56:17 +0200323 EXPECT_EQ(rtp_state1.sequence_number, rtp_state2.sequence_number);
324 EXPECT_EQ(rtp_state1.start_timestamp, rtp_state2.start_timestamp);
325 EXPECT_EQ(rtp_state1.timestamp, rtp_state2.timestamp);
326 EXPECT_EQ(rtp_state1.capture_time_ms, rtp_state2.capture_time_ms);
327 EXPECT_EQ(rtp_state1.last_timestamp_time_ms,
328 rtp_state2.last_timestamp_time_ms);
329 EXPECT_EQ(rtp_state1.media_has_been_sent, rtp_state2.media_has_been_sent);
330 }
ossuc3d4b482017-05-23 06:07:11 -0700331}
Fredrik Solenberg8f5787a2018-01-11 13:52:30 +0100332
Henrik Boströmf4a99912020-06-11 12:07:14 +0200333TEST(CallTest, AddAdaptationResourceAfterCreatingVideoSendStream) {
334 CallHelper call(true);
335 // Create a VideoSendStream.
336 test::FunctionVideoEncoderFactory fake_encoder_factory([]() {
337 return std::make_unique<test::FakeEncoder>(Clock::GetRealTimeClock());
338 });
339 auto bitrate_allocator_factory = CreateBuiltinVideoBitrateAllocatorFactory();
340 MockTransport send_transport;
341 VideoSendStream::Config config(&send_transport);
342 config.rtp.payload_type = 110;
343 config.rtp.ssrcs = {42};
344 config.encoder_settings.encoder_factory = &fake_encoder_factory;
345 config.encoder_settings.bitrate_allocator_factory =
346 bitrate_allocator_factory.get();
347 VideoEncoderConfig encoder_config;
348 encoder_config.max_bitrate_bps = 1337;
349 VideoSendStream* stream =
350 call->CreateVideoSendStream(std::move(config), std::move(encoder_config));
351 EXPECT_NE(stream, nullptr);
352 // Add a fake resource. It should get added to the stream.
353 auto fake_resource = FakeResource::Create("FakeResource");
354 call->AddAdaptationResource(fake_resource);
355 EXPECT_THAT(stream->GetAdaptationResources(), Contains(fake_resource));
356 call->DestroyVideoSendStream(stream);
357}
358
359TEST(CallTest, AddAdaptationResourceBeforeCreatingVideoSendStream) {
360 CallHelper call(true);
361 // Add a fake resource.
362 auto fake_resource = FakeResource::Create("FakeResource");
363 call->AddAdaptationResource(fake_resource);
364 // Create a VideoSendStream.
365 test::FunctionVideoEncoderFactory fake_encoder_factory([]() {
366 return std::make_unique<test::FakeEncoder>(Clock::GetRealTimeClock());
367 });
368 auto bitrate_allocator_factory = CreateBuiltinVideoBitrateAllocatorFactory();
369 MockTransport send_transport;
370 VideoSendStream::Config config(&send_transport);
371 config.rtp.payload_type = 110;
372 config.rtp.ssrcs = {42};
373 config.encoder_settings.encoder_factory = &fake_encoder_factory;
374 config.encoder_settings.bitrate_allocator_factory =
375 bitrate_allocator_factory.get();
376 VideoEncoderConfig encoder_config;
377 encoder_config.max_bitrate_bps = 1337;
378 VideoSendStream* stream =
379 call->CreateVideoSendStream(std::move(config), std::move(encoder_config));
380 EXPECT_NE(stream, nullptr);
381 // The fake resource should automatically get added to the stream.
382 EXPECT_THAT(stream->GetAdaptationResources(), Contains(fake_resource));
383 call->DestroyVideoSendStream(stream);
384}
385
Tommi25c77c12020-05-25 17:44:55 +0200386TEST(CallTest, SharedModuleThread) {
387 class SharedModuleThreadUser : public Module {
388 public:
389 SharedModuleThreadUser(ProcessThread* expected_thread,
390 rtc::scoped_refptr<SharedModuleThread> thread)
391 : expected_thread_(expected_thread), thread_(std::move(thread)) {
392 thread_->EnsureStarted();
393 thread_->process_thread()->RegisterModule(this, RTC_FROM_HERE);
394 }
395
396 ~SharedModuleThreadUser() override {
397 thread_->process_thread()->DeRegisterModule(this);
398 EXPECT_TRUE(thread_was_checked_);
399 }
400
401 private:
402 int64_t TimeUntilNextProcess() override { return 1000; }
403 void Process() override {}
404 void ProcessThreadAttached(ProcessThread* process_thread) override {
405 if (!process_thread) {
406 // Being detached.
407 return;
408 }
409 EXPECT_EQ(process_thread, expected_thread_);
410 thread_was_checked_ = true;
411 }
412
413 bool thread_was_checked_ = false;
414 ProcessThread* const expected_thread_;
415 rtc::scoped_refptr<SharedModuleThread> thread_;
416 };
417
418 // Create our test instance and pass a lambda to it that gets executed when
419 // the reference count goes back to 1 - meaning |shared| again is the only
420 // reference, which means we can free the variable and deallocate the thread.
421 rtc::scoped_refptr<SharedModuleThread> shared;
422 shared = SharedModuleThread::Create("MySharedProcessThread",
423 [&shared]() { shared = nullptr; });
424 ProcessThread* process_thread = shared->process_thread();
425
426 ASSERT_TRUE(shared.get());
427
428 {
429 // Create a couple of users of the thread.
430 // These instances are in a separate scope to trigger the callback to our
431 // lambda, which will run when these go out of scope.
432 SharedModuleThreadUser user1(process_thread, shared);
433 SharedModuleThreadUser user2(process_thread, shared);
434 }
435
436 // The thread should now have been stopped and freed.
437 EXPECT_FALSE(shared);
438}
439
solenbergc7a8b082015-10-16 14:35:07 -0700440} // namespace webrtc