Index: content/renderer/media/webrtc_local_audio_track_unittest.cc |
diff --git a/content/renderer/media/webrtc_local_audio_track_unittest.cc b/content/renderer/media/webrtc_local_audio_track_unittest.cc |
index 7f7c16dc1bc2686e22bcceae0fd6859cd6cda4a5..b5a30c827a77ccd953b10a0b2c72c592f0abd7fc 100644 |
--- a/content/renderer/media/webrtc_local_audio_track_unittest.cc |
+++ b/content/renderer/media/webrtc_local_audio_track_unittest.cc |
@@ -13,6 +13,7 @@ |
#include "testing/gtest/include/gtest/gtest.h" |
using ::testing::_; |
+using ::testing::AnyNumber; |
using ::testing::AtLeast; |
using ::testing::Return; |
@@ -115,10 +116,8 @@ class WebRtcLocalAudioTrackTest : public ::testing::Test { |
media::CHANNEL_LAYOUT_STEREO, |
48000); |
- EXPECT_CALL(*capturer_source_.get(), Start()).WillOnce(Return()); |
EXPECT_CALL(*capturer_source_.get(), SetAutomaticGainControl(false)) |
.WillOnce(Return()); |
- capturer_->Start(); |
audio_thread_.reset(new FakeAudioThread(capturer_)); |
audio_thread_->Start(); |
} |
@@ -126,8 +125,6 @@ class WebRtcLocalAudioTrackTest : public ::testing::Test { |
virtual void TearDown() { |
audio_thread_->Stop(); |
audio_thread_.reset(); |
- EXPECT_CALL(*capturer_source_.get(), Stop()).WillOnce(Return()); |
- capturer_->Stop(); |
} |
scoped_refptr<MockCapturerSource> capturer_source_; |
@@ -140,8 +137,10 @@ class WebRtcLocalAudioTrackTest : public ::testing::Test { |
// get data callback when the track is connected to the capturer but not when |
// the track is disconnected from the capturer. |
TEST_F(WebRtcLocalAudioTrackTest, ConnectAndDisconnectOneSink) { |
+ EXPECT_CALL(*capturer_source_.get(), Start()).WillOnce(Return()); |
scoped_refptr<WebRtcLocalAudioTrack> track = |
WebRtcLocalAudioTrack::Create(std::string(), capturer_, NULL); |
+ track->Start(); |
EXPECT_TRUE(track->enabled()); |
scoped_ptr<MockWebRtcAudioCapturerSink> sink( |
new MockWebRtcAudioCapturerSink()); |
@@ -155,6 +154,9 @@ TEST_F(WebRtcLocalAudioTrackTest, ConnectAndDisconnectOneSink) { |
EXPECT_TRUE(event.TimedWait(TestTimeouts::tiny_timeout())); |
track->RemoveSink(sink.get()); |
+ |
+ EXPECT_CALL(*capturer_source_.get(), Stop()).WillOnce(Return()); |
+ track->Stop(); |
track = NULL; |
} |
@@ -165,8 +167,10 @@ TEST_F(WebRtcLocalAudioTrackTest, ConnectAndDisconnectOneSink) { |
// TODO(xians): Enable this test after resolving the racing issue that TSAN |
// reports on MediaStreamTrack::enabled(); |
TEST_F(WebRtcLocalAudioTrackTest, DISABLED_DisableEnableAudioTrack) { |
+ EXPECT_CALL(*capturer_source_.get(), Start()).WillOnce(Return()); |
scoped_refptr<WebRtcLocalAudioTrack> track = |
WebRtcLocalAudioTrack::Create(std::string(), capturer_, NULL); |
+ track->Start(); |
EXPECT_TRUE(track->enabled()); |
EXPECT_TRUE(track->set_enabled(false)); |
scoped_ptr<MockWebRtcAudioCapturerSink> sink( |
@@ -187,6 +191,9 @@ TEST_F(WebRtcLocalAudioTrackTest, DISABLED_DisableEnableAudioTrack) { |
EXPECT_TRUE(track->set_enabled(true)); |
EXPECT_TRUE(event.TimedWait(TestTimeouts::tiny_timeout())); |
track->RemoveSink(sink.get()); |
+ |
+ EXPECT_CALL(*capturer_source_.get(), Stop()).WillOnce(Return()); |
+ track->Stop(); |
track = NULL; |
} |
@@ -194,8 +201,10 @@ TEST_F(WebRtcLocalAudioTrackTest, DISABLED_DisableEnableAudioTrack) { |
// callbacks appear/disappear. |
// TODO(xians): Enable the test after the racing problem is resolved. |
TEST_F(WebRtcLocalAudioTrackTest, DISABLED_MultipleAudioTracks) { |
+ EXPECT_CALL(*capturer_source_.get(), Start()).WillOnce(Return()); |
scoped_refptr<WebRtcLocalAudioTrack> track_1 = |
WebRtcLocalAudioTrack::Create(std::string(), capturer_, NULL); |
+ track_1->Start(); |
EXPECT_TRUE(track_1->enabled()); |
scoped_ptr<MockWebRtcAudioCapturerSink> sink_1( |
new MockWebRtcAudioCapturerSink()); |
@@ -209,6 +218,7 @@ TEST_F(WebRtcLocalAudioTrackTest, DISABLED_MultipleAudioTracks) { |
scoped_refptr<WebRtcLocalAudioTrack> track_2 = |
WebRtcLocalAudioTrack::Create(std::string(), capturer_, NULL); |
+ track_2->Start(); |
EXPECT_TRUE(track_2->set_enabled(false)); |
scoped_ptr<MockWebRtcAudioCapturerSink> sink_2( |
new MockWebRtcAudioCapturerSink()); |
@@ -234,9 +244,69 @@ TEST_F(WebRtcLocalAudioTrackTest, DISABLED_MultipleAudioTracks) { |
EXPECT_TRUE(event_2.TimedWait(TestTimeouts::tiny_timeout())); |
track_1->RemoveSink(sink_1.get()); |
+ track_1->Stop(); |
+ track_1 = NULL; |
+ |
+ EXPECT_CALL(*capturer_source_.get(), Stop()).WillOnce(Return()); |
track_2->RemoveSink(sink_2.get()); |
+ track_2->Stop(); |
+ track_2 = NULL; |
+} |
+ |
+ |
+// Start one track and verify the capturer is correctly starting its source. |
+// And it should be fine to not to call Stop() explicitly. |
+TEST_F(WebRtcLocalAudioTrackTest, StartOneAudioTrack) { |
+ EXPECT_CALL(*capturer_source_.get(), Start()).Times(1); |
+ scoped_refptr<WebRtcLocalAudioTrack> track = |
+ WebRtcLocalAudioTrack::Create(std::string(), capturer_, NULL); |
+ track->Start(); |
+} |
+ |
+// Start/Stop tracks and verify the capturer is correctly starting/stopping |
+// its source. |
+TEST_F(WebRtcLocalAudioTrackTest, StartAndStopAudioTracks) { |
+ // SetDefaultSink() should not trigger the Start() on |capturer_source_|. |
+ base::WaitableEvent event(false, false); |
+ scoped_ptr<MockWebRtcAudioCapturerSink> default_sink( |
+ new MockWebRtcAudioCapturerSink()); |
+ EXPECT_CALL(*default_sink, SetCaptureFormat(_)).WillOnce(Return()); |
+ EXPECT_CALL(*default_sink, CaptureData( |
+ _, _, _, 0, 0)) |
+ .Times(AnyNumber()).WillRepeatedly(Return()); |
+ capturer_->SetDefaultSink(default_sink.get()); |
+ EXPECT_CALL(*capturer_source_.get(), Start()).Times(0); |
+ EXPECT_FALSE(event.TimedWait(TestTimeouts::tiny_timeout())); |
+ |
+ // Starting the first audio track will start the |capturer_source_|. |
+ event.Reset(); |
+ EXPECT_CALL(*capturer_source_.get(), Start()).WillOnce(SignalEvent(&event)); |
+ scoped_refptr<WebRtcLocalAudioTrack> track_1 = |
+ WebRtcLocalAudioTrack::Create(std::string(), capturer_, NULL); |
+ track_1->Start(); |
+ EXPECT_TRUE(event.TimedWait(TestTimeouts::tiny_timeout())); |
+ |
+ // Start the second audio track will not start the |capturer_source_| |
+ // since it has been started. |
+ EXPECT_CALL(*capturer_source_.get(), Start()).Times(0); |
+ scoped_refptr<WebRtcLocalAudioTrack> track_2 = |
+ WebRtcLocalAudioTrack::Create(std::string(), capturer_, NULL); |
+ track_2->Start(); |
+ |
+ // Stop the first audio track will not stop the |capturer_source_|. |
+ EXPECT_CALL(*capturer_source_.get(), Stop()).Times(0); |
+ track_1->Stop(); |
track_1 = NULL; |
+ |
+ // Stop the last audio track will stop the |capturer_source_|. |
+ event.Reset(); |
+ EXPECT_CALL(*capturer_source_.get(), Stop()) |
+ .Times(1).WillOnce(SignalEvent(&event)); |
+ track_2->Stop(); |
track_2 = NULL; |
+ EXPECT_TRUE(event.TimedWait(TestTimeouts::tiny_timeout())); |
+ |
+ capturer_->SetDefaultSink(NULL); |
} |
} // namespace content |