| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/bind_helpers.h" | 6 #include "base/bind_helpers.h" |
| 7 #include "base/callback.h" | 7 #include "base/callback.h" |
| 8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
| 9 #include "base/run_loop.h" | 9 #include "base/run_loop.h" |
| 10 #include "base/strings/utf_string_conversions.h" | 10 #include "base/strings/utf_string_conversions.h" |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 ~MediaStreamVideoTrackTest() override {} | 42 ~MediaStreamVideoTrackTest() override {} |
| 43 | 43 |
| 44 void TearDown() override { | 44 void TearDown() override { |
| 45 blink_source_.reset(); | 45 blink_source_.reset(); |
| 46 blink::WebHeap::collectAllGarbageForTesting(); | 46 blink::WebHeap::collectAllGarbageForTesting(); |
| 47 } | 47 } |
| 48 | 48 |
| 49 void DeliverVideoFrameAndWaitForRenderer(MockMediaStreamVideoSink* sink) { | 49 void DeliverVideoFrameAndWaitForRenderer(MockMediaStreamVideoSink* sink) { |
| 50 base::RunLoop run_loop; | 50 base::RunLoop run_loop; |
| 51 base::Closure quit_closure = run_loop.QuitClosure(); | 51 base::Closure quit_closure = run_loop.QuitClosure(); |
| 52 EXPECT_CALL(*sink, OnVideoFrame()).WillOnce( | 52 EXPECT_CALL(*sink, OnVideoFrame()).WillOnce(RunClosure(quit_closure)); |
| 53 RunClosure(quit_closure)); | 53 const scoped_refptr<media::VideoFrame> frame = |
| 54 scoped_refptr<media::VideoFrame> frame = | |
| 55 media::VideoFrame::CreateColorFrame( | 54 media::VideoFrame::CreateColorFrame( |
| 56 gfx::Size(MediaStreamVideoSource::kDefaultWidth, | 55 gfx::Size(MediaStreamVideoSource::kDefaultWidth, |
| 57 MediaStreamVideoSource::kDefaultHeight), | 56 MediaStreamVideoSource::kDefaultHeight), |
| 58 kColorValue, kColorValue, kColorValue, base::TimeDelta()); | 57 kColorValue, kColorValue, kColorValue, base::TimeDelta()); |
| 59 mock_source()->DeliverVideoFrame(frame); | 58 mock_source()->DeliverVideoFrame(frame); |
| 60 run_loop.Run(); | 59 run_loop.Run(); |
| 61 } | 60 } |
| 62 | 61 |
| 63 protected: | 62 protected: |
| 64 base::MessageLoop* io_message_loop() const { | 63 base::MessageLoop* io_message_loop() const { |
| 65 return child_process_->io_message_loop(); | 64 return child_process_->io_message_loop(); |
| 66 } | 65 } |
| 67 | 66 |
| 68 // Create a track that's associated with |mock_source_|. | 67 // Create a track that's associated with |mock_source_|. |
| 69 blink::WebMediaStreamTrack CreateTrack() { | 68 blink::WebMediaStreamTrack CreateTrack() { |
| 70 blink::WebMediaConstraints constraints; | 69 blink::WebMediaConstraints constraints; |
| 71 constraints.initialize(); | 70 constraints.initialize(); |
| 72 bool enabled = true; | 71 const bool enabled = true; |
| 73 blink::WebMediaStreamTrack track = | 72 blink::WebMediaStreamTrack track = |
| 74 MediaStreamVideoTrack::CreateVideoTrack( | 73 MediaStreamVideoTrack::CreateVideoTrack( |
| 75 mock_source_, constraints, | 74 mock_source_, constraints, |
| 76 MediaStreamSource::ConstraintsCallback(), enabled); | 75 MediaStreamSource::ConstraintsCallback(), enabled); |
| 77 if (!source_started_) { | 76 if (!source_started_) { |
| 78 mock_source_->StartMockedSource(); | 77 mock_source_->StartMockedSource(); |
| 79 source_started_ = true; | 78 source_started_ = true; |
| 80 } | 79 } |
| 81 return track; | 80 return track; |
| 82 } | 81 } |
| 83 | 82 |
| 84 MockMediaStreamVideoSource* mock_source() { return mock_source_; } | 83 MockMediaStreamVideoSource* mock_source() { return mock_source_; } |
| 85 const blink::WebMediaStreamSource& blink_source() const { | 84 const blink::WebMediaStreamSource& blink_source() const { |
| 86 return blink_source_; | 85 return blink_source_; |
| 87 } | 86 } |
| 88 | 87 |
| 89 private: | 88 private: |
| 90 base::MessageLoopForUI message_loop_; | 89 const base::MessageLoopForUI message_loop_; |
| 91 scoped_ptr<ChildProcess> child_process_; | 90 const scoped_ptr<ChildProcess> child_process_; |
| 92 blink::WebMediaStreamSource blink_source_; | 91 blink::WebMediaStreamSource blink_source_; |
| 93 // |mock_source_| is owned by |webkit_source_|. | 92 // |mock_source_| is owned by |webkit_source_|. |
| 94 MockMediaStreamVideoSource* mock_source_; | 93 MockMediaStreamVideoSource* mock_source_; |
| 95 bool source_started_; | 94 bool source_started_; |
| 96 }; | 95 }; |
| 97 | 96 |
| 98 TEST_F(MediaStreamVideoTrackTest, AddAndRemoveSink) { | 97 TEST_F(MediaStreamVideoTrackTest, AddAndRemoveSink) { |
| 99 MockMediaStreamVideoSink sink; | 98 MockMediaStreamVideoSink sink; |
| 100 blink::WebMediaStreamTrack track = CreateTrack(); | 99 blink::WebMediaStreamTrack track = CreateTrack(); |
| 101 MediaStreamVideoSink::AddToVideoTrack( | 100 MediaStreamVideoSink::AddToVideoTrack(&sink, sink.GetDeliverFrameCB(), track); |
| 102 &sink, sink.GetDeliverFrameCB(), track); | |
| 103 | 101 |
| 104 DeliverVideoFrameAndWaitForRenderer(&sink); | 102 DeliverVideoFrameAndWaitForRenderer(&sink); |
| 105 EXPECT_EQ(1, sink.number_of_frames()); | 103 EXPECT_EQ(1, sink.number_of_frames()); |
| 106 | 104 |
| 107 DeliverVideoFrameAndWaitForRenderer(&sink); | 105 DeliverVideoFrameAndWaitForRenderer(&sink); |
| 108 | 106 |
| 109 MediaStreamVideoSink::RemoveFromVideoTrack(&sink, track); | 107 MediaStreamVideoSink::RemoveFromVideoTrack(&sink, track); |
| 110 | 108 |
| 111 scoped_refptr<media::VideoFrame> frame = | 109 scoped_refptr<media::VideoFrame> frame = |
| 112 media::VideoFrame::CreateBlackFrame( | 110 media::VideoFrame::CreateBlackFrame( |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 base::Owned(new CheckThreadHelper(run_loop.QuitClosure(), &correct))), | 155 base::Owned(new CheckThreadHelper(run_loop.QuitClosure(), &correct))), |
| 158 track); | 156 track); |
| 159 MediaStreamVideoSink::RemoveFromVideoTrack(&sink, track); | 157 MediaStreamVideoSink::RemoveFromVideoTrack(&sink, track); |
| 160 run_loop.Run(); | 158 run_loop.Run(); |
| 161 EXPECT_TRUE(correct) << "Not called on correct thread."; | 159 EXPECT_TRUE(correct) << "Not called on correct thread."; |
| 162 } | 160 } |
| 163 | 161 |
| 164 TEST_F(MediaStreamVideoTrackTest, SetEnabled) { | 162 TEST_F(MediaStreamVideoTrackTest, SetEnabled) { |
| 165 MockMediaStreamVideoSink sink; | 163 MockMediaStreamVideoSink sink; |
| 166 blink::WebMediaStreamTrack track = CreateTrack(); | 164 blink::WebMediaStreamTrack track = CreateTrack(); |
| 167 MediaStreamVideoSink::AddToVideoTrack( | 165 MediaStreamVideoSink::AddToVideoTrack(&sink, sink.GetDeliverFrameCB(), track); |
| 168 &sink, sink.GetDeliverFrameCB(), track); | |
| 169 | 166 |
| 170 MediaStreamVideoTrack* video_track = | 167 MediaStreamVideoTrack* video_track = |
| 171 MediaStreamVideoTrack::GetVideoTrack(track); | 168 MediaStreamVideoTrack::GetVideoTrack(track); |
| 172 | 169 |
| 173 DeliverVideoFrameAndWaitForRenderer(&sink); | 170 DeliverVideoFrameAndWaitForRenderer(&sink); |
| 174 EXPECT_EQ(1, sink.number_of_frames()); | 171 EXPECT_EQ(1, sink.number_of_frames()); |
| 175 EXPECT_EQ(kColorValue, *sink.last_frame()->data(media::VideoFrame::kYPlane)); | 172 EXPECT_EQ(kColorValue, *sink.last_frame()->data(media::VideoFrame::kYPlane)); |
| 176 | 173 |
| 177 video_track->SetEnabled(false); | 174 video_track->SetEnabled(false); |
| 178 EXPECT_FALSE(sink.enabled()); | 175 EXPECT_FALSE(sink.enabled()); |
| 179 | 176 |
| 180 DeliverVideoFrameAndWaitForRenderer(&sink); | 177 DeliverVideoFrameAndWaitForRenderer(&sink); |
| 181 EXPECT_EQ(2, sink.number_of_frames()); | 178 EXPECT_EQ(2, sink.number_of_frames()); |
| 182 EXPECT_EQ(kBlackValue, *sink.last_frame()->data(media::VideoFrame::kYPlane)); | 179 EXPECT_EQ(kBlackValue, *sink.last_frame()->data(media::VideoFrame::kYPlane)); |
| 183 | 180 |
| 184 video_track->SetEnabled(true); | 181 video_track->SetEnabled(true); |
| 185 EXPECT_TRUE(sink.enabled()); | 182 EXPECT_TRUE(sink.enabled()); |
| 186 DeliverVideoFrameAndWaitForRenderer(&sink); | 183 DeliverVideoFrameAndWaitForRenderer(&sink); |
| 187 EXPECT_EQ(3, sink.number_of_frames()); | 184 EXPECT_EQ(3, sink.number_of_frames()); |
| 188 EXPECT_EQ(kColorValue, *sink.last_frame()->data(media::VideoFrame::kYPlane)); | 185 EXPECT_EQ(kColorValue, *sink.last_frame()->data(media::VideoFrame::kYPlane)); |
| 189 MediaStreamVideoSink::RemoveFromVideoTrack(&sink, track); | 186 MediaStreamVideoSink::RemoveFromVideoTrack(&sink, track); |
| 190 } | 187 } |
| 191 | 188 |
| 192 TEST_F(MediaStreamVideoTrackTest, SourceStopped) { | 189 TEST_F(MediaStreamVideoTrackTest, SourceStopped) { |
| 193 MockMediaStreamVideoSink sink; | 190 MockMediaStreamVideoSink sink; |
| 194 blink::WebMediaStreamTrack track = CreateTrack(); | 191 blink::WebMediaStreamTrack track = CreateTrack(); |
| 195 MediaStreamVideoSink::AddToVideoTrack( | 192 MediaStreamVideoSink::AddToVideoTrack(&sink, sink.GetDeliverFrameCB(), track); |
| 196 &sink, sink.GetDeliverFrameCB(), track); | |
| 197 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, sink.state()); | 193 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, sink.state()); |
| 198 | 194 |
| 199 mock_source()->StopSource(); | 195 mock_source()->StopSource(); |
| 200 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, sink.state()); | 196 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, sink.state()); |
| 201 MediaStreamVideoSink::RemoveFromVideoTrack(&sink, track); | 197 MediaStreamVideoSink::RemoveFromVideoTrack(&sink, track); |
| 202 } | 198 } |
| 203 | 199 |
| 204 TEST_F(MediaStreamVideoTrackTest, StopLastTrack) { | 200 TEST_F(MediaStreamVideoTrackTest, StopLastTrack) { |
| 205 MockMediaStreamVideoSink sink1; | 201 MockMediaStreamVideoSink sink1; |
| 206 blink::WebMediaStreamTrack track1 = CreateTrack(); | 202 blink::WebMediaStreamTrack track1 = CreateTrack(); |
| 207 MediaStreamVideoSink::AddToVideoTrack( | 203 MediaStreamVideoSink::AddToVideoTrack( |
| 208 &sink1, sink1.GetDeliverFrameCB(), track1); | 204 &sink1, sink1.GetDeliverFrameCB(), track1); |
| 209 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, sink1.state()); | 205 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, sink1.state()); |
| 210 | 206 |
| 211 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, | 207 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, |
| 212 blink_source().readyState()); | 208 blink_source().readyState()); |
| 213 | 209 |
| 214 MockMediaStreamVideoSink sink2; | 210 MockMediaStreamVideoSink sink2; |
| 215 blink::WebMediaStreamTrack track2 = CreateTrack(); | 211 blink::WebMediaStreamTrack track2 = CreateTrack(); |
| 216 MediaStreamVideoSink::AddToVideoTrack( | 212 MediaStreamVideoSink::AddToVideoTrack( |
| 217 &sink2, sink2.GetDeliverFrameCB(), track2); | 213 &sink2, sink2.GetDeliverFrameCB(), track2); |
| 218 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, sink2.state()); | 214 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, sink2.state()); |
| 219 | 215 |
| 220 MediaStreamVideoTrack* native_track1 = | 216 MediaStreamVideoTrack* const native_track1 = |
| 221 MediaStreamVideoTrack::GetVideoTrack(track1); | 217 MediaStreamVideoTrack::GetVideoTrack(track1); |
| 222 native_track1->Stop(); | 218 native_track1->Stop(); |
| 223 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, sink1.state()); | 219 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, sink1.state()); |
| 224 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, | 220 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, |
| 225 blink_source().readyState()); | 221 blink_source().readyState()); |
| 226 MediaStreamVideoSink::RemoveFromVideoTrack(&sink1, track1); | 222 MediaStreamVideoSink::RemoveFromVideoTrack(&sink1, track1); |
| 227 | 223 |
| 228 MediaStreamVideoTrack* native_track2 = | 224 MediaStreamVideoTrack* const native_track2 = |
| 229 MediaStreamVideoTrack::GetVideoTrack(track2); | 225 MediaStreamVideoTrack::GetVideoTrack(track2); |
| 230 native_track2->Stop(); | 226 native_track2->Stop(); |
| 231 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, sink2.state()); | 227 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, sink2.state()); |
| 232 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, | 228 EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, |
| 233 blink_source().readyState()); | 229 blink_source().readyState()); |
| 234 MediaStreamVideoSink::RemoveFromVideoTrack(&sink2, track2); | 230 MediaStreamVideoSink::RemoveFromVideoTrack(&sink2, track2); |
| 235 } | 231 } |
| 236 | 232 |
| 237 } // namespace content | 233 } // namespace content |
| OLD | NEW |