Index: content/renderer/media/media_stream_audio_unittest.cc |
diff --git a/content/renderer/media/media_stream_audio_unittest.cc b/content/renderer/media/media_stream_audio_unittest.cc |
index 7026025e403cfd68ad788b2de485a4f1b1f3bb5e..225e87b2cb09531d653169236dc3350ea9740240 100644 |
--- a/content/renderer/media/media_stream_audio_unittest.cc |
+++ b/content/renderer/media/media_stream_audio_unittest.cc |
@@ -6,6 +6,7 @@ |
#include "base/atomicops.h" |
#include "base/message_loop/message_loop.h" |
+#include "base/run_loop.h" |
#include "base/synchronization/lock.h" |
#include "base/synchronization/waitable_event.h" |
#include "base/test/test_timeouts.h" |
@@ -16,6 +17,7 @@ |
#include "content/renderer/media/media_stream_audio_track.h" |
#include "media/base/audio_bus.h" |
#include "media/base/audio_parameters.h" |
+#include "media/base/bind_to_current_loop.h" |
#include "testing/gtest/include/gtest/gtest.h" |
#include "third_party/WebKit/public/platform/WebString.h" |
#include "third_party/WebKit/public/web/WebHeap.h" |
@@ -239,6 +241,9 @@ class FakeMediaStreamAudioSink : public MediaStreamAudioSink { |
} // namespace |
class MediaStreamAudioTest : public ::testing::Test { |
+ public: |
+ void CallbackFunction() { callback_is_called_ = true; } |
+ |
protected: |
void SetUp() override { |
blink_audio_source_.initialize(blink::WebString::fromUTF8("audio_id"), |
@@ -268,6 +273,8 @@ class MediaStreamAudioTest : public ::testing::Test { |
blink::WebMediaStreamTrack blink_audio_track_; |
base::MessageLoop message_loop_; |
+ |
+ bool callback_is_called_ = false; |
}; |
// Tests that a simple source-->track-->sink connection and audio data flow |
@@ -453,4 +460,31 @@ TEST_F(MediaStreamAudioTest, EnableAndDisableTracks) { |
track()->RemoveSink(&sink); |
} |
+// Tests that a callback is fired when initialization completes on a track. |
+TEST_F(MediaStreamAudioTest, CallbackOnTrackInitialization) { |
+ // Create a source, connect it to track, and connect the track to a |
+ // sink. |
+ blink_audio_source_.setExtraData(new FakeMediaStreamAudioSource()); |
+ ASSERT_TRUE(source()); |
+ EXPECT_TRUE(source()->ConnectToTrack(blink_audio_track_)); |
+ ASSERT_TRUE(track()); |
+ FakeMediaStreamAudioSink sink; |
+ ASSERT_TRUE(!sink.params().IsValid()); |
+ track()->AddSink(&sink); |
+ // The test callback is not thread-safe, so needs to be called on the |
+ // current thread, not the thread from which it is triggered. |
+ track()->SetFormatConfiguredCallback(media::BindToCurrentLoop(base::Bind( |
+ &MediaStreamAudioTest::CallbackFunction, base::Unretained(this)))); |
+ EXPECT_FALSE(callback_is_called_); |
+ // Wait until valid parameters are propagated to the sink, and then confirm |
+ // the parameters are correct at the track and the sink. |
+ while (!sink.params().IsValid()) |
+ base::PlatformThread::Sleep(TestTimeouts::tiny_timeout()); |
+ // Since the callback is waiting to run on this thread, we have to run |
+ // an event loop. |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_TRUE(callback_is_called_); |
+ track()->RemoveSink(&sink); |
+} |
+ |
} // namespace content |