Home | History | Annotate | Download | only in media
      1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include <string>
      6 
      7 #include "base/message_loop/message_loop.h"
      8 #include "base/strings/utf_string_conversions.h"
      9 #include "content/child/child_process.h"
     10 #include "content/common/media/video_capture.h"
     11 #include "content/public/renderer/media_stream_video_sink.h"
     12 #include "content/renderer/media/media_stream.h"
     13 #include "content/renderer/media/media_stream_registry_interface.h"
     14 #include "content/renderer/media/mock_media_stream_registry.h"
     15 #include "content/renderer/media/video_source_handler.h"
     16 #include "testing/gmock/include/gmock/gmock.h"
     17 #include "testing/gtest/include/gtest/gtest.h"
     18 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
     19 #include "third_party/WebKit/public/platform/WebString.h"
     20 #include "third_party/WebKit/public/web/WebHeap.h"
     21 
     22 namespace content {
     23 
     24 static const std::string kTestStreamUrl = "stream_url";
     25 static const std::string kTestVideoTrackId = "video_track_id";
     26 static const std::string kUnknownStreamUrl = "unknown_stream_url";
     27 
     28 class FakeFrameReader : public FrameReaderInterface {
     29  public:
     30   virtual bool GotFrame(
     31       const scoped_refptr<media::VideoFrame>& frame) OVERRIDE {
     32     last_frame_ = frame;
     33     return true;
     34   }
     35 
     36   const media::VideoFrame* last_frame() {
     37     return last_frame_.get();
     38   }
     39 
     40  private:
     41   scoped_refptr<media::VideoFrame> last_frame_;
     42 };
     43 
     44 class VideoSourceHandlerTest : public ::testing::Test {
     45  public:
     46   VideoSourceHandlerTest()
     47        : child_process_(new ChildProcess()),
     48          registry_(new MockMediaStreamRegistry()) {
     49     handler_.reset(new VideoSourceHandler(registry_.get()));
     50     registry_->Init(kTestStreamUrl);
     51     registry_->AddVideoTrack(kTestVideoTrackId);
     52   }
     53 
     54   virtual void TearDown() {
     55     registry_.reset();
     56     blink::WebHeap::collectAllGarbageForTesting();
     57   }
     58 
     59  protected:
     60   base::MessageLoop message_loop_;
     61   scoped_ptr<ChildProcess> child_process_;
     62   scoped_ptr<VideoSourceHandler> handler_;
     63   scoped_ptr<MockMediaStreamRegistry> registry_;
     64 };
     65 
     66 TEST_F(VideoSourceHandlerTest, OpenClose) {
     67   FakeFrameReader reader;
     68   // Unknow url will return false.
     69   EXPECT_FALSE(handler_->Open(kUnknownStreamUrl, &reader));
     70   EXPECT_TRUE(handler_->Open(kTestStreamUrl, &reader));
     71 
     72   int width = 640;
     73   int height = 360;
     74   base::TimeDelta ts = base::TimeDelta::FromInternalValue(789012);
     75 
     76   // A new frame is captured.
     77   scoped_refptr<media::VideoFrame> captured_frame =
     78       media::VideoFrame::CreateBlackFrame(gfx::Size(width, height));
     79   captured_frame->set_timestamp(ts);
     80 
     81   // The frame is delivered to VideoSourceHandler.
     82   handler_->DeliverFrameForTesting(&reader, captured_frame);
     83 
     84   // Compare |frame| to |captured_frame|.
     85   const media::VideoFrame* frame = reader.last_frame();
     86   ASSERT_TRUE(frame != NULL);
     87   EXPECT_EQ(width, frame->coded_size().width());
     88   EXPECT_EQ(height, frame->coded_size().height());
     89   EXPECT_EQ(ts, frame->timestamp());
     90   EXPECT_EQ(captured_frame->data(media::VideoFrame::kYPlane),
     91             frame->data(media::VideoFrame::kYPlane));
     92 
     93   EXPECT_FALSE(handler_->Close(NULL));
     94   EXPECT_TRUE(handler_->Close(&reader));
     95 }
     96 
     97 TEST_F(VideoSourceHandlerTest, OpenWithoutClose) {
     98   FakeFrameReader reader;
     99   EXPECT_TRUE(handler_->Open(kTestStreamUrl, &reader));
    100 }
    101 
    102 }  // namespace content
    103