blob: d6dfd823031250bc297a317a356b52c5691c7b12 [file] [log] [blame]
[email protected]9d5eadf2012-10-09 03:43:481// 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
avie029c4132015-12-23 06:45:225#include <stdint.h>
6
tzika0f614d2016-03-08 00:35:157#include <tuple>
8
[email protected]9d5eadf2012-10-09 03:43:489#include "base/memory/ref_counted.h"
[email protected]a76295972013-07-18 00:42:3210#include "base/message_loop/message_loop.h"
[email protected]9d5eadf2012-10-09 03:43:4811#include "ppapi/c/pp_errors.h"
[email protected]9d5eadf2012-10-09 03:43:4812#include "ppapi/c/ppb_var.h"
[email protected]a76295972013-07-18 00:42:3213#include "ppapi/c/ppb_websocket.h"
[email protected]b73c6592013-03-30 17:08:1314#include "ppapi/proxy/locking_resource_releaser.h"
[email protected]511c58e2013-12-12 12:25:3315#include "ppapi/proxy/plugin_message_filter.h"
[email protected]9d5eadf2012-10-09 03:43:4816#include "ppapi/proxy/ppapi_messages.h"
17#include "ppapi/proxy/ppapi_proxy_test.h"
[email protected]a76295972013-07-18 00:42:3218#include "ppapi/proxy/websocket_resource.h"
[email protected]b73c6592013-03-30 17:08:1319#include "ppapi/shared_impl/ppapi_globals.h"
[email protected]9d5eadf2012-10-09 03:43:4820#include "ppapi/shared_impl/ppb_var_shared.h"
[email protected]b73c6592013-03-30 17:08:1321#include "ppapi/shared_impl/proxy_lock.h"
22#include "ppapi/shared_impl/resource_tracker.h"
[email protected]9d5eadf2012-10-09 03:43:4823#include "ppapi/shared_impl/scoped_pp_resource.h"
24#include "ppapi/shared_impl/scoped_pp_var.h"
25#include "ppapi/shared_impl/tracked_callback.h"
26#include "ppapi/shared_impl/var.h"
27#include "ppapi/thunk/thunk.h"
28
29namespace ppapi {
30namespace proxy {
31
32namespace {
33
34typedef PluginProxyTest WebSocketResourceTest;
35
36bool g_callback_called;
37int32_t g_callback_result;
38const PPB_Var* ppb_var_ = NULL;
39
40void Callback(void* user_data, int32_t result) {
41 g_callback_called = true;
42 g_callback_result = result;
43}
44
45PP_CompletionCallback MakeCallback() {
46 g_callback_called = false;
47 g_callback_result = PP_OK;
48 return PP_MakeCompletionCallback(Callback, NULL);
49}
50
51PP_Var MakeStringVar(const std::string& string) {
52 if (!ppb_var_)
[email protected]4d5a4e02014-02-13 14:50:0053 ppb_var_ = ppapi::PPB_Var_Shared::GetVarInterface1_2();
brettw669d47b12015-02-13 21:17:3854 return ppb_var_->VarFromUtf8(string.c_str(),
55 static_cast<uint32_t>(string.length()));
[email protected]9d5eadf2012-10-09 03:43:4856}
57
58} // namespace
59
60
61// Does a test of Connect().
62TEST_F(WebSocketResourceTest, Connect) {
63 const PPB_WebSocket_1_0* websocket_iface =
64 thunk::GetPPB_WebSocket_1_0_Thunk();
65
66 std::string url("ws://ws.google.com");
67 std::string protocol0("x-foo");
68 std::string protocol1("x-bar");
69 PP_Var url_var = MakeStringVar(url);
70 PP_Var protocols[] = { MakeStringVar(protocol0), MakeStringVar(protocol1) };
71
[email protected]b73c6592013-03-30 17:08:1372 LockingResourceReleaser res(websocket_iface->Create(pp_instance()));
[email protected]9d5eadf2012-10-09 03:43:4873
[email protected]b73c6592013-03-30 17:08:1374 int32_t result = websocket_iface->Connect(res.get(), url_var, protocols, 2,
75 MakeCallback());
[email protected]9d5eadf2012-10-09 03:43:4876 ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
77
78 // Should be sent a "Connect" message.
79 ResourceMessageCallParams params;
80 IPC::Message msg;
81 ASSERT_TRUE(sink().GetFirstResourceCallMatching(
82 PpapiHostMsg_WebSocket_Connect::ID, &params, &msg));
83 PpapiHostMsg_WebSocket_Connect::Schema::Param p;
84 PpapiHostMsg_WebSocket_Connect::Read(&msg, &p);
tzika0f614d2016-03-08 00:35:1585 EXPECT_EQ(url, std::get<0>(p));
86 EXPECT_EQ(protocol0, std::get<1>(p)[0]);
87 EXPECT_EQ(protocol1, std::get<1>(p)[1]);
[email protected]9d5eadf2012-10-09 03:43:4888
89 // Synthesize a response.
90 ResourceMessageReplyParams reply_params(params.pp_resource(),
91 params.sequence());
92 reply_params.set_result(PP_OK);
[email protected]511c58e2013-12-12 12:25:3393 PluginMessageFilter::DispatchResourceReplyForTest(
94 reply_params, PpapiPluginMsg_WebSocket_ConnectReply(url, protocol1));
[email protected]9d5eadf2012-10-09 03:43:4895
96 EXPECT_EQ(PP_OK, g_callback_result);
97 EXPECT_EQ(true, g_callback_called);
98}
99
100// Does a test for unsolicited replies.
101TEST_F(WebSocketResourceTest, UnsolicitedReplies) {
102 const PPB_WebSocket_1_0* websocket_iface =
103 thunk::GetPPB_WebSocket_1_0_Thunk();
104
[email protected]b73c6592013-03-30 17:08:13105 LockingResourceReleaser res(websocket_iface->Create(pp_instance()));
[email protected]9d5eadf2012-10-09 03:43:48106
107 // Check if BufferedAmountReply is handled.
[email protected]b73c6592013-03-30 17:08:13108 ResourceMessageReplyParams reply_params(res.get(), 0);
[email protected]9d5eadf2012-10-09 03:43:48109 reply_params.set_result(PP_OK);
[email protected]511c58e2013-12-12 12:25:33110 PluginMessageFilter::DispatchResourceReplyForTest(
111 reply_params, PpapiPluginMsg_WebSocket_BufferedAmountReply(19760227u));
[email protected]9d5eadf2012-10-09 03:43:48112
[email protected]b73c6592013-03-30 17:08:13113 uint64_t amount = websocket_iface->GetBufferedAmount(res.get());
[email protected]9d5eadf2012-10-09 03:43:48114 EXPECT_EQ(19760227u, amount);
115
116 // Check if StateReply is handled.
[email protected]511c58e2013-12-12 12:25:33117 PluginMessageFilter::DispatchResourceReplyForTest(
118 reply_params,
119 PpapiPluginMsg_WebSocket_StateReply(
120 static_cast<int32_t>(PP_WEBSOCKETREADYSTATE_CLOSING)));
[email protected]9d5eadf2012-10-09 03:43:48121
[email protected]b73c6592013-03-30 17:08:13122 PP_WebSocketReadyState state = websocket_iface->GetReadyState(res.get());
[email protected]9d5eadf2012-10-09 03:43:48123 EXPECT_EQ(PP_WEBSOCKETREADYSTATE_CLOSING, state);
124}
125
126TEST_F(WebSocketResourceTest, MessageError) {
127 const PPB_WebSocket_1_0* websocket_iface =
128 thunk::GetPPB_WebSocket_1_0_Thunk();
129
130 std::string url("ws://ws.google.com");
131 PP_Var url_var = MakeStringVar(url);
132
[email protected]b73c6592013-03-30 17:08:13133 LockingResourceReleaser res(websocket_iface->Create(pp_instance()));
[email protected]9d5eadf2012-10-09 03:43:48134
135 // Establish the connection virtually.
136 int32_t result =
[email protected]b73c6592013-03-30 17:08:13137 websocket_iface->Connect(res.get(), url_var, NULL, 0, MakeCallback());
[email protected]9d5eadf2012-10-09 03:43:48138 ASSERT_EQ(PP_OK_COMPLETIONPENDING, result);
139
140 ResourceMessageCallParams params;
141 IPC::Message msg;
142 ASSERT_TRUE(sink().GetFirstResourceCallMatching(
143 PpapiHostMsg_WebSocket_Connect::ID, &params, &msg));
144
145 ResourceMessageReplyParams connect_reply_params(params.pp_resource(),
146 params.sequence());
147 connect_reply_params.set_result(PP_OK);
[email protected]511c58e2013-12-12 12:25:33148 PluginMessageFilter::DispatchResourceReplyForTest(
149 connect_reply_params,
150 PpapiPluginMsg_WebSocket_ConnectReply(url, std::string()));
[email protected]9d5eadf2012-10-09 03:43:48151
152 EXPECT_EQ(PP_OK, g_callback_result);
[email protected]48b1fc92012-10-09 13:37:52153 EXPECT_TRUE(g_callback_called);
[email protected]9d5eadf2012-10-09 03:43:48154
155 PP_Var message;
[email protected]b73c6592013-03-30 17:08:13156 result = websocket_iface->ReceiveMessage(res.get(), &message, MakeCallback());
[email protected]48b1fc92012-10-09 13:37:52157 EXPECT_FALSE(g_callback_called);
[email protected]9d5eadf2012-10-09 03:43:48158
159 // Synthesize a WebSocket_ErrorReply message.
[email protected]b73c6592013-03-30 17:08:13160 ResourceMessageReplyParams error_reply_params(res.get(), 0);
[email protected]9d5eadf2012-10-09 03:43:48161 error_reply_params.set_result(PP_OK);
[email protected]511c58e2013-12-12 12:25:33162 PluginMessageFilter::DispatchResourceReplyForTest(
163 error_reply_params, PpapiPluginMsg_WebSocket_ErrorReply());
[email protected]9d5eadf2012-10-09 03:43:48164
165 EXPECT_EQ(PP_ERROR_FAILED, g_callback_result);
[email protected]48b1fc92012-10-09 13:37:52166 EXPECT_TRUE(g_callback_called);
[email protected]9d5eadf2012-10-09 03:43:48167}
168
169} // namespace proxy
170} // namespace ppapi