| 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 946707bcdd159be6255f8cee047a5b9697b870ba..38950f75a1bc2ca13b47547990caef2634302833 100644 | 
| --- a/content/renderer/media/media_stream_video_source_unittest.cc | 
| +++ b/content/renderer/media/media_stream_video_source_unittest.cc | 
| @@ -16,13 +16,9 @@ class DummyMediaStreamVideoSource : public MediaStreamVideoSource { | 
| public: | 
| DummyMediaStreamVideoSource(MediaStreamDependencyFactory* factory) | 
| : MediaStreamVideoSource(factory) { | 
| -    Init(); | 
| -    SetVideoSource(GetAdapter()); | 
| -    SetReadyState(blink::WebMediaStreamSource::ReadyStateLive); | 
| } | 
|  | 
| virtual ~DummyMediaStreamVideoSource() { | 
| -    SetReadyState(blink::WebMediaStreamSource::ReadyStateEnded); | 
| } | 
|  | 
| void OnNewFrame(const scoped_refptr<media::VideoFrame>& frame) { | 
| @@ -33,8 +29,9 @@ class DummyMediaStreamVideoSource : public MediaStreamVideoSource { | 
| class MediaStreamVideoSourceTest | 
| : public ::testing::Test { | 
| public: | 
| -  MediaStreamVideoSourceTest() { | 
| -    factory_.EnsurePeerConnectionFactory(); | 
| +  MediaStreamVideoSourceTest() | 
| +      : number_of_successful_constraints_applied_(0), | 
| +        number_of_failed_constraints_applied_(0) { | 
| webkit_source_.initialize(base::UTF8ToUTF16("dummy_source_id"), | 
| blink::WebMediaStreamSource::TypeVideo, | 
| base::UTF8ToUTF16("dummy_source_name")); | 
| @@ -43,12 +40,33 @@ class MediaStreamVideoSourceTest | 
|  | 
| protected: | 
| // Create a track that's associated with |webkit_source_|. | 
| -  blink::WebMediaStreamTrack CreateTrack(const std::string& id) { | 
| +  blink::WebMediaStreamTrack CreateTrack( | 
| +      const std::string& id, | 
| +      const blink::WebMediaConstraints& constraints) { | 
| blink::WebMediaStreamTrack track; | 
| track.initialize(base::UTF8ToUTF16(id), webkit_source_); | 
| + | 
| +    DummyMediaStreamVideoSource* source = | 
| +        static_cast<DummyMediaStreamVideoSource*>(track.source().extraData()); | 
| + | 
| +    source->AddTrack(track, | 
| +                     constraints, | 
| +                     base::Bind( | 
| +                         &MediaStreamVideoSourceTest::OnConstraintsApplied, | 
| +                         base::Unretained(this))); | 
| return track; | 
| } | 
|  | 
| +  // Simulate that the underlying device start successfully. | 
| +  void StartSource() { | 
| +    factory_.last_video_source()->SetLive(); | 
| +  } | 
| + | 
| +  // Simulate that the underlying device fail to start. | 
| +  void FailToStartSource() { | 
| +    factory_.last_video_source()->SetEnded(); | 
| +  } | 
| + | 
| void VerifyFrame(int width, int height, int num) { | 
| DummyMediaStreamVideoSource* source = | 
| static_cast<DummyMediaStreamVideoSource*>(webkit_source_.extraData()); | 
| @@ -58,17 +76,69 @@ class MediaStreamVideoSourceTest | 
| EXPECT_EQ(height, adapter->GetLastFrameHeight()); | 
| EXPECT_EQ(num, adapter->GetFrameNum()); | 
| } | 
| + | 
| +  int NumberOfSuccessConstraintsCallbacks() const { | 
| +    return number_of_successful_constraints_applied_; | 
| +  } | 
| + | 
| +  int NumberOfFailedConstraintsCallbacks() const { | 
| +    return number_of_failed_constraints_applied_; | 
| +  } | 
| + | 
| private: | 
| +  void OnConstraintsApplied(MediaStreamSource* source, bool success) { | 
| +    ASSERT_EQ(source, webkit_source_.extraData()); | 
| + | 
| +    if (success) | 
| +      ++number_of_successful_constraints_applied_; | 
| +    else | 
| +      ++number_of_failed_constraints_applied_; | 
| +  } | 
| + | 
| +  int number_of_successful_constraints_applied_; | 
| +  int number_of_failed_constraints_applied_; | 
| MockMediaStreamDependencyFactory factory_; | 
| blink::WebMediaStreamSource webkit_source_; | 
| }; | 
|  | 
| +TEST_F(MediaStreamVideoSourceTest, AddTrackAndStartAdapter) { | 
| +  blink::WebMediaConstraints constraints; | 
| +  blink::WebMediaStreamTrack track = CreateTrack("123", constraints); | 
| +  StartSource(); | 
| +  EXPECT_EQ(1, NumberOfSuccessConstraintsCallbacks()); | 
| +} | 
| + | 
| +TEST_F(MediaStreamVideoSourceTest, AddTwoTracksBeforeAdapterStart) { | 
| +  blink::WebMediaConstraints constraints; | 
| +  blink::WebMediaStreamTrack track1 = CreateTrack("123", constraints); | 
| +  blink::WebMediaStreamTrack track2 = CreateTrack("123", constraints); | 
| +  EXPECT_EQ(0, NumberOfSuccessConstraintsCallbacks()); | 
| +  StartSource(); | 
| +  EXPECT_EQ(2, NumberOfSuccessConstraintsCallbacks()); | 
| +} | 
| + | 
| +TEST_F(MediaStreamVideoSourceTest, AddTrackAfterAdapterStart) { | 
| +  blink::WebMediaConstraints constraints; | 
| +  blink::WebMediaStreamTrack track1 = CreateTrack("123", constraints); | 
| +  StartSource(); | 
| +  EXPECT_EQ(1, NumberOfSuccessConstraintsCallbacks()); | 
| +  blink::WebMediaStreamTrack track2 = CreateTrack("123", constraints); | 
| +  EXPECT_EQ(2, NumberOfSuccessConstraintsCallbacks()); | 
| +} | 
| + | 
| +TEST_F(MediaStreamVideoSourceTest, AddTrackAndFailToStartAdapter) { | 
| +  blink::WebMediaConstraints constraints; | 
| +  blink::WebMediaStreamTrack track = CreateTrack("123", constraints); | 
| +  FailToStartSource(); | 
| +  EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks()); | 
| +} | 
| + | 
| TEST_F(MediaStreamVideoSourceTest, DeliverVideoFrame) { | 
| blink::WebMediaConstraints constraints; | 
| -  blink::WebMediaStreamTrack track = CreateTrack("123"); | 
| +  blink::WebMediaStreamTrack track = CreateTrack("123", constraints); | 
| +  StartSource(); | 
| DummyMediaStreamVideoSource* source = | 
| static_cast<DummyMediaStreamVideoSource*>(track.source().extraData()); | 
| -  source->AddTrack(track, constraints); | 
| VerifyFrame(0, 0, 0); | 
| const int kWidth = 640; | 
| const int kHeight = 480; | 
|  |