- add sources.
[platform/framework/web/crosswalk.git] / src / ppapi / tests / test_video_destination.cc
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 // Tests PPB_VideoDestination_Private interface.
6
7 #include "ppapi/tests/test_video_destination.h"
8
9 #include <algorithm>
10 #include <limits>
11 #include <string>
12
13 #include "ppapi/c/dev/ppb_testing_dev.h"
14 #include "ppapi/cpp/completion_callback.h"
15 #include "ppapi/cpp/instance.h"
16 #include "ppapi/cpp/private/video_destination_private.h"
17 #include "ppapi/cpp/private/video_frame_private.h"
18 #include "ppapi/cpp/var.h"
19 #include "ppapi/tests/test_utils.h"
20 #include "ppapi/tests/testing_instance.h"
21
22 REGISTER_TEST_CASE(VideoDestination);
23
24 namespace {
25
26 const PP_Resource kInvalidResource = 0;
27 const PP_Instance kInvalidInstance = 0;
28
29 }
30
31 TestVideoDestination::TestVideoDestination(TestingInstance* instance)
32     : TestCase(instance),
33       ppb_video_destination_private_interface_(NULL),
34       ppb_core_interface_(NULL),
35       event_(instance_->pp_instance()) {
36 }
37
38 bool TestVideoDestination::Init() {
39   ppb_video_destination_private_interface_ =
40       static_cast<const PPB_VideoDestination_Private*>(
41           pp::Module::Get()->GetBrowserInterface(
42               PPB_VIDEODESTINATION_PRIVATE_INTERFACE));
43   if (!ppb_video_destination_private_interface_)
44     instance_->AppendError(
45         "PPB_VideoDestination_Private interface not available");
46
47   ppb_core_interface_ = static_cast<const PPB_Core*>(
48       pp::Module::Get()->GetBrowserInterface(PPB_CORE_INTERFACE));
49   if (!ppb_core_interface_)
50     instance_->AppendError("PPB_Core interface not available");
51
52   return
53       ppb_video_destination_private_interface_ &&
54       ppb_core_interface_;
55 }
56
57 TestVideoDestination::~TestVideoDestination() {
58 }
59
60 void TestVideoDestination::RunTests(const std::string& filter) {
61   RUN_TEST(Create, filter);
62   RUN_TEST(PutFrame, filter);
63 }
64
65 void TestVideoDestination::HandleMessage(const pp::Var& message_data) {
66   if (message_data.AsString().find("blob:") == 0) {
67     stream_url_ = message_data.AsString();
68     event_.Signal();
69   }
70 }
71
72 std::string TestVideoDestination::TestCreate() {
73   PP_Resource video_destination;
74   // Creating a destination from an invalid instance returns an invalid
75   // resource.
76   video_destination =
77       ppb_video_destination_private_interface_->Create(kInvalidInstance);
78   ASSERT_EQ(kInvalidResource, video_destination);
79   ASSERT_FALSE(
80       ppb_video_destination_private_interface_->IsVideoDestination(
81           video_destination));
82
83   // Creating a destination from a valid instance returns a valid resource.
84   video_destination =
85       ppb_video_destination_private_interface_->Create(
86           instance_->pp_instance());
87   ASSERT_NE(kInvalidResource, video_destination);
88   ASSERT_TRUE(
89       ppb_video_destination_private_interface_->IsVideoDestination(
90           video_destination));
91
92   ppb_core_interface_->ReleaseResource(video_destination);
93   // Once released, the resource shouldn't be a video destination.
94   ASSERT_FALSE(
95       ppb_video_destination_private_interface_->IsVideoDestination(
96           video_destination));
97
98   PASS();
99 }
100
101 std::string TestVideoDestination::TestPutFrame() {
102   std::string js_code;
103   js_code += "var test_stream = new webkitMediaStream([]);"
104              "var url = webkitURL.createObjectURL(test_stream);"
105              "var plugin = document.getElementById('plugin');"
106              "plugin.postMessage(url);";
107   instance_->EvalScript(js_code);
108   event_.Wait();
109
110   pp::VideoDestination_Private video_destination(instance_);
111   TestCompletionCallback cc1(instance_->pp_instance(), false);
112   cc1.WaitForResult(video_destination.Open(stream_url_, cc1.GetCallback()));
113   ASSERT_EQ(PP_OK, cc1.result());
114
115   pp::ImageData image_data(instance_,
116                            PP_IMAGEDATAFORMAT_BGRA_PREMUL,
117                            pp::Size(640, 480),
118                            false /* init_to_zero */);
119   pp::VideoFrame_Private video_frame(image_data,
120                                      0.0 /* timestamp */);
121   ASSERT_EQ(PP_OK, video_destination.PutFrame(video_frame));
122
123   video_destination.Close();
124
125   PASS();
126 }
127