video_destination_handler_unittest.cc revision 010d83a9304c5a91596085d917d248abff47903a
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/run_loop.h"
9#include "base/strings/utf_string_conversions.h"
10#include "content/child/child_process.h"
11#include "content/renderer/media/media_stream.h"
12#include "content/renderer/media/media_stream_video_track.h"
13#include "content/renderer/media/mock_media_stream_registry.h"
14#include "content/renderer/media/mock_media_stream_video_sink.h"
15#include "content/renderer/media/webrtc/video_destination_handler.h"
16#include "content/renderer/pepper/pepper_plugin_instance_impl.h"
17#include "content/renderer/pepper/ppb_image_data_impl.h"
18#include "content/test/ppapi_unittest.h"
19#include "testing/gmock/include/gmock/gmock.h"
20#include "testing/gtest/include/gtest/gtest.h"
21#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
22#include "third_party/WebKit/public/platform/WebString.h"
23
24using ::testing::_;
25
26namespace content {
27
28ACTION_P(RunClosure, closure) {
29  closure.Run();
30}
31
32static const std::string kTestStreamUrl = "stream_url";
33static const std::string kUnknownStreamUrl = "unknown_stream_url";
34
35class VideoDestinationHandlerTest : public PpapiUnittest {
36 public:
37  VideoDestinationHandlerTest()
38     : child_process_(new ChildProcess()),
39       registry_(MockMediaStreamRegistry()) {
40    registry_.Init(kTestStreamUrl);
41  }
42
43  base::MessageLoop* io_message_loop() const {
44    return child_process_->io_message_loop();
45  }
46
47 protected:
48  scoped_ptr<ChildProcess> child_process_;
49  MockMediaStreamRegistry registry_;
50};
51
52TEST_F(VideoDestinationHandlerTest, Open) {
53  FrameWriterInterface* frame_writer = NULL;
54  // Unknow url will return false.
55  EXPECT_FALSE(VideoDestinationHandler::Open(&registry_,
56                                             kUnknownStreamUrl, &frame_writer));
57  EXPECT_TRUE(VideoDestinationHandler::Open(&registry_,
58                                            kTestStreamUrl, &frame_writer));
59  // The |frame_writer| is a proxy and is owned by whoever call Open.
60  delete frame_writer;
61}
62
63TEST_F(VideoDestinationHandlerTest, PutFrame) {
64  FrameWriterInterface* frame_writer = NULL;
65  EXPECT_TRUE(VideoDestinationHandler::Open(&registry_,
66                                            kTestStreamUrl, &frame_writer));
67  ASSERT_TRUE(frame_writer);
68
69  // Verify the video track has been added.
70  const blink::WebMediaStream test_stream = registry_.test_stream();
71  blink::WebVector<blink::WebMediaStreamTrack> video_tracks;
72  test_stream.videoTracks(video_tracks);
73  ASSERT_EQ(1u, video_tracks.size());
74
75  // Verify the native video track has been added.
76  MediaStreamVideoTrack* native_track =
77      MediaStreamVideoTrack::GetVideoTrack(video_tracks[0]);
78  ASSERT_TRUE(native_track != NULL);
79
80  MockMediaStreamVideoSink sink;
81  native_track->AddSink(&sink);
82
83  scoped_refptr<PPB_ImageData_Impl> image(
84      new PPB_ImageData_Impl(instance()->pp_instance(),
85                             PPB_ImageData_Impl::ForTest()));
86  image->Init(PP_IMAGEDATAFORMAT_BGRA_PREMUL, 640, 360, true);
87  {
88    base::RunLoop run_loop;
89    base::Closure quit_closure = run_loop.QuitClosure();
90
91    EXPECT_CALL(sink, OnVideoFrame()).WillOnce(
92        RunClosure(quit_closure));
93    frame_writer->PutFrame(image, 10);
94    run_loop.Run();
95  }
96  // TODO(perkj): Verify that the track output I420 when
97  // https://codereview.chromium.org/213423006/ is landed.
98  EXPECT_EQ(1, sink.number_of_frames());
99  native_track->RemoveSink(&sink);
100
101  // The |frame_writer| is a proxy and is owned by whoever call Open.
102  delete frame_writer;
103}
104
105}  // namespace content
106