1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <string>
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/message_loop/message_loop.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/child/child_process.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/common/media/video_capture.h"
11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/public/renderer/media_stream_video_sink.h"
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/renderer/media/media_stream.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/renderer/media/media_stream_registry_interface.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/renderer/media/mock_media_stream_registry.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/renderer/media/video_source_handler.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h"
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "third_party/WebKit/public/web/WebHeap.h"
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace content {
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static const std::string kTestStreamUrl = "stream_url";
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static const std::string kTestVideoTrackId = "video_track_id";
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static const std::string kUnknownStreamUrl = "unknown_stream_url";
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class FakeFrameReader : public FrameReaderInterface {
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  virtual bool GotFrame(
31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      const scoped_refptr<media::VideoFrame>& frame) OVERRIDE {
32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    last_frame_ = frame;
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return true;
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const media::VideoFrame* last_frame() {
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return last_frame_.get();
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_refptr<media::VideoFrame> last_frame_;
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class VideoSourceHandlerTest : public ::testing::Test {
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  VideoSourceHandlerTest()
47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)       : child_process_(new ChildProcess()),
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         registry_(new MockMediaStreamRegistry()) {
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    handler_.reset(new VideoSourceHandler(registry_.get()));
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    registry_->Init(kTestStreamUrl);
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    registry_->AddVideoTrack(kTestVideoTrackId);
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void TearDown() {
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    registry_.reset();
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    blink::WebHeap::collectAllGarbageForTesting();
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected:
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::MessageLoop message_loop_;
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  scoped_ptr<ChildProcess> child_process_;
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<VideoSourceHandler> handler_;
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<MockMediaStreamRegistry> registry_;
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(VideoSourceHandlerTest, OpenClose) {
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeFrameReader reader;
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Unknow url will return false.
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_FALSE(handler_->Open(kUnknownStreamUrl, &reader));
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_TRUE(handler_->Open(kTestStreamUrl, &reader));
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  int width = 640;
73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  int height = 360;
74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  base::TimeDelta ts = base::TimeDelta::FromInternalValue(789012);
75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // A new frame is captured.
77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_refptr<media::VideoFrame> captured_frame =
78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      media::VideoFrame::CreateBlackFrame(gfx::Size(width, height));
79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  captured_frame->set_timestamp(ts);
80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // The frame is delivered to VideoSourceHandler.
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  handler_->DeliverFrameForTesting(&reader, captured_frame);
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Compare |frame| to |captured_frame|.
85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  const media::VideoFrame* frame = reader.last_frame();
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ASSERT_TRUE(frame != NULL);
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(width, frame->coded_size().width());
88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(height, frame->coded_size().height());
89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(ts, frame->timestamp());
90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(captured_frame->data(media::VideoFrame::kYPlane),
91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch            frame->data(media::VideoFrame::kYPlane));
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_FALSE(handler_->Close(NULL));
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(handler_->Close(&reader));
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(VideoSourceHandlerTest, OpenWithoutClose) {
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  FakeFrameReader reader;
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_TRUE(handler_->Open(kTestStreamUrl, &reader));
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace content
103