ppp_messaging_proxy_unittest.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
1// Copyright (c) 2012 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 <cstring>
6
7#include "base/synchronization/waitable_event.h"
8#include "ppapi/c/pp_var.h"
9#include "ppapi/c/ppb_var.h"
10#include "ppapi/c/ppp_messaging.h"
11#include "ppapi/proxy/ppapi_proxy_test.h"
12#include "ppapi/shared_impl/var.h"
13
14namespace ppapi {
15namespace proxy {
16
17namespace {
18
19// This is a poor man's mock of PPP_Messaging using global variables. Eventually
20// we should generalize making PPAPI interface mocks by using IDL or macro/
21// template magic.
22PP_Instance received_instance;
23PP_Var received_var;
24base::WaitableEvent handle_message_called(false, false);
25
26void HandleMessage(PP_Instance instance, PP_Var message_data) {
27  received_instance = instance;
28  received_var = message_data;
29  handle_message_called.Signal();
30}
31
32// Clear all the 'received' values for our mock.  Call this before you expect
33// one of the functions to be invoked.
34void ResetReceived() {
35  received_instance = 0;
36  received_var.type = PP_VARTYPE_UNDEFINED;
37  received_var.value.as_id = 0;
38}
39
40PPP_Messaging ppp_messaging_mock = {
41  &HandleMessage
42};
43
44class PPP_Messaging_ProxyTest : public TwoWayTest {
45 public:
46  PPP_Messaging_ProxyTest()
47      : TwoWayTest(TwoWayTest::TEST_PPP_INTERFACE) {
48    plugin().RegisterTestInterface(PPP_MESSAGING_INTERFACE,
49                                   &ppp_messaging_mock);
50  }
51};
52
53void CompareAndReleaseStringVar(PluginProxyTestHarness* plugin_harness,
54                                PP_Var received_var,
55                                const std::string& test_string) {
56  Var* received_string = plugin_harness->var_tracker().GetVar(received_var);
57  ASSERT_TRUE(received_string);
58  ASSERT_TRUE(received_string->AsStringVar());
59  EXPECT_EQ(test_string, received_string->AsStringVar()->value());
60  // Now release the var, and the string should go away (because the ref
61  // count should be one).
62  plugin_harness->var_tracker().ReleaseVar(received_var);
63  EXPECT_FALSE(StringVar::FromPPVar(received_var));
64}
65
66}  // namespace
67
68TEST_F(PPP_Messaging_ProxyTest, SendMessages) {
69  // Grab the host-side proxy of ppp_messaging.
70  const PPP_Messaging* ppp_messaging = static_cast<const PPP_Messaging*>(
71      host().host_dispatcher()->GetProxiedInterface(
72          PPP_MESSAGING_INTERFACE));
73
74  PP_Instance expected_instance = pp_instance();
75  PP_Var expected_var = PP_MakeUndefined();
76  ResetReceived();
77  ppp_messaging->HandleMessage(expected_instance, expected_var);
78  handle_message_called.Wait();
79  EXPECT_EQ(expected_instance, received_instance);
80  EXPECT_EQ(expected_var.type, received_var.type);
81
82  expected_var = PP_MakeNull();
83  ResetReceived();
84  ppp_messaging->HandleMessage(expected_instance, expected_var);
85  handle_message_called.Wait();
86  EXPECT_EQ(expected_instance, received_instance);
87  EXPECT_EQ(expected_var.type, received_var.type);
88
89  expected_var = PP_MakeBool(PP_TRUE);
90  ResetReceived();
91  ppp_messaging->HandleMessage(expected_instance, expected_var);
92  handle_message_called.Wait();
93  EXPECT_EQ(expected_instance, received_instance);
94  EXPECT_EQ(expected_var.type, received_var.type);
95  EXPECT_EQ(expected_var.value.as_bool, received_var.value.as_bool);
96
97  expected_var = PP_MakeInt32(12345);
98  ResetReceived();
99  ppp_messaging->HandleMessage(expected_instance, expected_var);
100  handle_message_called.Wait();
101  EXPECT_EQ(expected_instance, received_instance);
102  EXPECT_EQ(expected_var.type, received_var.type);
103  EXPECT_EQ(expected_var.value.as_int, received_var.value.as_int);
104
105  expected_var = PP_MakeDouble(3.1415);
106  ResetReceived();
107  ppp_messaging->HandleMessage(expected_instance, expected_var);
108  handle_message_called.Wait();
109  EXPECT_EQ(expected_instance, received_instance);
110  EXPECT_EQ(expected_var.type, received_var.type);
111  EXPECT_EQ(expected_var.value.as_double, received_var.value.as_double);
112
113  const std::string kTestString("Hello world!");
114  expected_var = StringVar::StringToPPVar(kTestString);
115  ResetReceived();
116  ppp_messaging->HandleMessage(expected_instance, expected_var);
117  // Now release the var, and the string should go away (because the ref
118  // count should be one).
119  host().var_tracker().ReleaseVar(expected_var);
120  EXPECT_FALSE(StringVar::FromPPVar(expected_var));
121
122  handle_message_called.Wait();
123  EXPECT_EQ(expected_instance, received_instance);
124  EXPECT_EQ(expected_var.type, received_var.type);
125  PostTaskOnRemoteHarness(
126      base::Bind(CompareAndReleaseStringVar,
127                 &plugin(),
128                 received_var,
129                 kTestString));
130}
131
132}  // namespace proxy
133}  // namespace ppapi
134
135