Index: content/renderer/media/media_stream_video_source_unittest.cc |
diff --git a/content/renderer/media/media_stream_video_source_unittest.cc b/content/renderer/media/media_stream_video_source_unittest.cc |
index 71ee6fca7ecd6eb1cdea122d6a5dd8ce3528db4e..efbfbbdd1cae0eae53f3579da2649b3e5b326d6f 100644 |
--- a/content/renderer/media/media_stream_video_source_unittest.cc |
+++ b/content/renderer/media/media_stream_video_source_unittest.cc |
@@ -19,6 +19,10 @@ |
#include "media/base/video_frame.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+using ::testing::_; |
+using ::testing::DoAll; |
+using ::testing::SaveArg; |
+ |
namespace content { |
ACTION_P(RunClosure, closure) { |
@@ -720,4 +724,87 @@ TEST_F(MediaStreamVideoSourceTest, Use0FpsSupportedFormat) { |
MediaStreamVideoSink::RemoveFromVideoTrack(&sink, track); |
} |
+// Test that a source producing no frames calls back the MSVCS to tell so, and |
+// this in turn tells the Track attached. Then start passing frames, and check |
+// that in a reasonable time frame the muted state turns to false. |
+TEST_F(MediaStreamVideoSourceTest, MutedSource) { |
+ MockMediaConstraintFactory factory; |
+ blink::WebMediaStreamTrack track = |
+ CreateTrackAndStartSource(factory.CreateWebMediaConstraints(), |
+ 640, 480, 30); |
+ |
+ MockMediaStreamVideoSink sink; |
+ MediaStreamVideoSink::AddToVideoTrack(&sink, sink.GetDeliverFrameCB(), track); |
+ EXPECT_EQ(MediaStreamTrack::GetTrack(track)->GetMutedState(), false); |
+ |
+ base::RunLoop run_loop; |
+ base::Closure quit_closure = run_loop.QuitClosure(); |
+ bool muted_state = false; |
+ EXPECT_CALL(*mock_source(), DoSetMutedState(_)) |
+ .WillOnce(DoAll(SaveArg<0>(&muted_state), RunClosure(quit_closure))); |
+ run_loop.Run(); |
+ EXPECT_EQ(muted_state, true); |
+ // TODO(mcasas): When added, check |track|'s (WebMediaStreamTrack) Muted |
+ // attribute, should be true. In the meantime, check the MediaStreamTrack's. |
+ EXPECT_EQ(MediaStreamTrack::GetTrack(track)->GetMutedState(), true); |
+ |
+ EXPECT_CALL(*mock_source(), DoSetMutedState(_)) |
+ .WillOnce(DoAll(SaveArg<0>(&muted_state), RunClosure(quit_closure))); |
+ // Mock frame delivery happens asynchronously, not according to the configured |
+ // frame rate, potentially many frames can pass before the muted state is |
+ // flipped. |kMaxFrameCount| is used as a reasonable high bound of this value. |
+ const int kMaxFrameCount = 10000; |
+ int i = 0; |
+ while (muted_state != false || ++i > kMaxFrameCount) |
+ DeliverVideoFrameAndWaitForRenderer(640, 480, &sink); |
+ EXPECT_EQ(muted_state, false); |
+ EXPECT_LT(i, kMaxFrameCount); |
+ EXPECT_EQ(MediaStreamTrack::GetTrack(track)->GetMutedState(), false); |
+ |
+ MediaStreamVideoSink::RemoveFromVideoTrack(&sink, track); |
+} |
+ |
+// Test that a source producing no frames calls back the MSVCS to tell so, and |
+// this in turn tells all the Tracks attached. |
+TEST_F(MediaStreamVideoSourceTest, MutedSourceWithTwoTracks) { |
+ MockMediaConstraintFactory factory1; |
+ blink::WebMediaStreamTrack track1 = |
+ CreateTrackAndStartSource(factory1.CreateWebMediaConstraints(), |
+ MediaStreamVideoSource::kDefaultWidth, |
+ MediaStreamVideoSource::kDefaultHeight, |
+ 30); |
+ |
+ MockMediaConstraintFactory factory2; |
+ factory2.AddMandatory(MediaStreamVideoSource::kMaxFrameRate, 15); |
+ blink::WebMediaStreamTrack track2 = CreateTrack( |
+ "123", factory2.CreateWebMediaConstraints()); |
+ EXPECT_EQ(0, NumberOfFailedConstraintsCallbacks()); |
+ |
+ MockMediaStreamVideoSink sink1; |
+ MediaStreamVideoSink::AddToVideoTrack(&sink1, sink1.GetDeliverFrameCB(), |
+ track1); |
+ EXPECT_EQ(MediaStreamTrack::GetTrack(track1)->GetMutedState(), false); |
+ |
+ MockMediaStreamVideoSink sink2; |
+ MediaStreamVideoSink::AddToVideoTrack(&sink2, sink2.GetDeliverFrameCB(), |
+ track2); |
+ EXPECT_EQ(MediaStreamTrack::GetTrack(track2)->GetMutedState(), false); |
+ |
+ base::RunLoop run_loop; |
+ base::Closure quit_closure = run_loop.QuitClosure(); |
+ bool muted_state = false; |
+ EXPECT_CALL(*mock_source(), DoSetMutedState(_)) |
+ .WillOnce(DoAll(SaveArg<0>(&muted_state), RunClosure(quit_closure))); |
+ run_loop.Run(); |
+ EXPECT_EQ(muted_state, true); |
+ |
+ // TODO(mcasas): When added, check |track|'s (WebMediaStreamTrack) Muted |
+ // attribute, should be true. In the meantime, check the MediaStreamTrack's. |
+ EXPECT_EQ(MediaStreamTrack::GetTrack(track1)->GetMutedState(), true); |
+ EXPECT_EQ(MediaStreamTrack::GetTrack(track2)->GetMutedState(), true); |
+ |
+ MediaStreamVideoSink::RemoveFromVideoTrack(&sink1, track1); |
+ MediaStreamVideoSink::RemoveFromVideoTrack(&sink2, track2); |
+} |
+ |
} // namespace content |