blob: a0cef724162f7d83b197959e889f751c1725a788 [file] [log] [blame]
[email protected]669b2832012-02-21 23:37:121// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]ef5e98e2011-12-06 09:49:182// 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.h>
6
7#include "ppapi/cpp/module.h"
8#include "ppapi/tests/test_udp_socket_private_shared.h"
9#include "ppapi/tests/test_utils.h"
10#include "ppapi/tests/testing_instance.h"
11
12REGISTER_TEST_CASE(UDPSocketPrivateShared);
13
[email protected]ef5e98e2011-12-06 09:49:1814TestUDPSocketPrivateShared::TestUDPSocketPrivateShared(
15 TestingInstance* instance)
16 : TestCase(instance),
17 tcp_socket_private_interface_(NULL),
18 udp_socket_private_interface_(NULL) {
19}
20
21bool TestUDPSocketPrivateShared::Init() {
[email protected]4d529232011-12-08 22:31:2122 tcp_socket_private_interface_ = static_cast<const PPB_TCPSocket_Private*>(
23 pp::Module::Get()->GetBrowserInterface(PPB_TCPSOCKET_PRIVATE_INTERFACE));
[email protected]ef5e98e2011-12-06 09:49:1824 if (!tcp_socket_private_interface_)
25 instance_->AppendError("TCPSocketPrivate interface not available");
26
[email protected]4d529232011-12-08 22:31:2127 udp_socket_private_interface_ = static_cast<const PPB_UDPSocket_Private*>(
28 pp::Module::Get()->GetBrowserInterface(PPB_UDPSOCKET_PRIVATE_INTERFACE));
[email protected]ef5e98e2011-12-06 09:49:1829 if (!udp_socket_private_interface_)
30 instance_->AppendError("UDPSocketPrivate interface not available");
31
[email protected]961e8972011-12-15 15:29:1932 bool init_host_port = false;
33 if (!GetLocalHostPort(instance_->pp_instance(), &host_, &port_))
34 instance_->AppendError("Can't init host and port");
35 else
36 init_host_port = true;
37
38 return tcp_socket_private_interface_ &&
39 udp_socket_private_interface_ &&
40 init_host_port &&
[email protected]a732cec2011-12-22 08:35:5241 CheckTestingInterface();
[email protected]ef5e98e2011-12-06 09:49:1842}
43
44void TestUDPSocketPrivateShared::RunTests(const std::string& filter) {
45 RUN_TEST(Create, filter);
46 RUN_TEST_FORCEASYNC_AND_NOT(Connect, filter);
[email protected]669b2832012-02-21 23:37:1247 RUN_TEST_FORCEASYNC_AND_NOT(ConnectFailure, filter);
[email protected]ef5e98e2011-12-06 09:49:1848}
49
50void TestUDPSocketPrivateShared::QuitMessageLoop() {
51 testing_interface_->QuitMessageLoop(instance_->pp_instance());
52}
53
54std::string TestUDPSocketPrivateShared::GenerateNetAddress(
55 PP_Resource* socket, PP_NetAddress_Private* address) {
56 *socket = tcp_socket_private_interface_->Create(instance_->pp_instance());
57 if (0 == *socket)
58 return "PPB_TCPSocket_Private::Create failed";
59
60 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
61 int32_t rv = tcp_socket_private_interface_->Connect(
[email protected]961e8972011-12-15 15:29:1962 *socket, host_.c_str(), port_,
[email protected]ef5e98e2011-12-06 09:49:1863 static_cast<pp::CompletionCallback>(callback).pp_completion_callback());
64 if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
65 return ReportError("PPB_TCPSocket_Private::Connect force_async", rv);
66 if (rv == PP_OK_COMPLETIONPENDING)
67 rv = callback.WaitForResult();
68 if (rv != PP_OK)
69 return ReportError("PPB_TCPSocket_Private::Connect", rv);
70
71 rv = tcp_socket_private_interface_->GetLocalAddress(*socket, address);
72 if (rv != PP_TRUE)
73 return ReportError("PPB_TCPSocket_Private::GetLocalAddress", rv);
74
75 PASS();
76}
77
78std::string TestUDPSocketPrivateShared::CreateAndBindUDPSocket(
[email protected]669b2832012-02-21 23:37:1279 PP_NetAddress_Private *address,
[email protected]ef5e98e2011-12-06 09:49:1880 PP_Resource *socket) {
81 *socket = udp_socket_private_interface_->Create(instance_->pp_instance());
82 if (0 == *socket)
83 return "PPB_UDPSocket_Private::Create failed";
84 if (!udp_socket_private_interface_->IsUDPSocket(*socket))
85 return "PPB_UDPSocket_Private::IsUDPSocket failed";
86
87 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
88 int32_t rv = udp_socket_private_interface_->Bind(
89 *socket, address,
90 static_cast<pp::CompletionCallback>(callback).pp_completion_callback());
91
92 if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
93 return ReportError("PPB_UDPSocket_Private::Bind force_async", rv);
94 if (rv == PP_OK_COMPLETIONPENDING)
95 rv = callback.WaitForResult();
96 if (rv != PP_OK)
97 return ReportError("PPB_UDPSocket_Private::Bind", rv);
98
[email protected]669b2832012-02-21 23:37:1299 if (!udp_socket_private_interface_->GetBoundAddress(*socket, address))
100 return "PPB_UDPSocket_Private::GetBoundAddress: Failed";
101
102 PASS();
103}
104
105std::string TestUDPSocketPrivateShared::BindUDPSocketFailure(
106 PP_NetAddress_Private *address,
107 PP_Resource *socket) {
108 *socket = udp_socket_private_interface_->Create(instance_->pp_instance());
109 if (0 == *socket)
110 return "PPB_UDPSocket_Private::Create failed";
111 if (!udp_socket_private_interface_->IsUDPSocket(*socket))
112 return "PPB_UDPSocket_Private::IsUDPSocket failed";
113
114 TestCompletionCallback callback(instance_->pp_instance(), force_async_);
115 int32_t rv = udp_socket_private_interface_->Bind(
116 *socket, address,
117 static_cast<pp::CompletionCallback>(callback).pp_completion_callback());
118
119 if (force_async_ && rv != PP_OK_COMPLETIONPENDING)
120 return ReportError("PPB_UDPSocket_Private::Bind force_async", rv);
121 if (rv == PP_OK_COMPLETIONPENDING)
122 rv = callback.WaitForResult();
123 if (rv == PP_OK)
124 return ReportError("PPB_UDPSocket_Private::Bind", rv);
125
126 if (udp_socket_private_interface_->GetBoundAddress(*socket, address))
127 return "PPB_UDPSocket_Private::GetBoundAddress: Failed";
128
[email protected]ef5e98e2011-12-06 09:49:18129 PASS();
130}
131
132std::string TestUDPSocketPrivateShared::TestCreate() {
133 PP_Resource udp_socket;
134 std::string error_message;
135
136 udp_socket = udp_socket_private_interface_->Create(0);
137 if (0 != udp_socket)
138 return "PPB_UDPSocket_Private::Create returns valid socket " \
139 "for invalid instance";
140
141 udp_socket = udp_socket_private_interface_->Create(instance_->pp_instance());
142 if (0 == udp_socket)
143 return "PPB_UDPSocket_Private::Create failed";
144 if (!udp_socket_private_interface_->IsUDPSocket(udp_socket))
145 return "PPB_UDPSocket_Private::IsUDPSocket failed";
146
147 PASS();
148}
149
150std::string TestUDPSocketPrivateShared::TestConnect() {
151 PP_NetAddress_Private server_address, client_address;
152 PP_Resource tcp_socket_server, tcp_socket_client;
153 std::string error_message;
154
155 error_message = GenerateNetAddress(&tcp_socket_server, &server_address);
156 if (!error_message.empty())
157 return error_message;
158 error_message = GenerateNetAddress(&tcp_socket_client, &client_address);
[email protected]669b2832012-02-21 23:37:12159 if (!error_message.empty())
[email protected]ef5e98e2011-12-06 09:49:18160 return error_message;
161
162 PP_Resource socket_server, socket_client;
163 error_message = CreateAndBindUDPSocket(&server_address, &socket_server);
[email protected]669b2832012-02-21 23:37:12164 if (!error_message.empty())
[email protected]ef5e98e2011-12-06 09:49:18165 return error_message;
166 error_message = CreateAndBindUDPSocket(&client_address, &socket_client);
[email protected]669b2832012-02-21 23:37:12167 if (!error_message.empty())
[email protected]ef5e98e2011-12-06 09:49:18168 return error_message;
169
170 static const char* const kMessage =
171 "Simple message that will be sent via UDP";
172 static const size_t kMessageBufferSize = 1024;
173 char message_buffer[kMessageBufferSize];
174
175 TestCompletionCallback write_cb(instance_->pp_instance(), force_async_);
176 int32_t write_rv = udp_socket_private_interface_->SendTo(
177 socket_client,
178 kMessage,
179 strlen(kMessage),
180 &server_address,
181 static_cast<pp::CompletionCallback>(write_cb).pp_completion_callback());
182 if (force_async_ && write_rv != PP_OK_COMPLETIONPENDING)
183 return ReportError("PPB_UDPSocket_Private::SendTo force_async", write_rv);
184
185 TestCompletionCallback read_cb(instance_->pp_instance(), force_async_);
186 int32_t read_rv = udp_socket_private_interface_->RecvFrom(
187 socket_server,
188 message_buffer,
189 strlen(kMessage),
190 static_cast<pp::CompletionCallback>(read_cb).pp_completion_callback());
191 if (force_async_ && read_rv != PP_OK_COMPLETIONPENDING)
192 return ReportError("PPB_UDPSocket_Private::RecvFrom force_async", read_rv);
193
194 if (read_rv == PP_OK_COMPLETIONPENDING)
195 read_rv = read_cb.WaitForResult();
196 if (read_rv < 0 || strlen(kMessage) != static_cast<size_t>(read_rv))
197 return ReportError("PPB_UDPSocket_Private::RecvFrom", read_rv);
198
199 if (write_rv == PP_OK_COMPLETIONPENDING)
200 write_rv = write_cb.WaitForResult();
201 if (write_rv < 0 || strlen(kMessage) != static_cast<size_t>(write_rv))
202 return ReportError("PPB_UDPSocket_Private::SendTo", write_rv);
203
204 ASSERT_EQ(0, strncmp(kMessage, message_buffer, strlen(kMessage)));
205
206 udp_socket_private_interface_->Close(socket_server);
207 udp_socket_private_interface_->Close(socket_client);
208
209 tcp_socket_private_interface_->Disconnect(tcp_socket_server);
210 tcp_socket_private_interface_->Disconnect(tcp_socket_client);
211
[email protected]669b2832012-02-21 23:37:12212 if (udp_socket_private_interface_->GetBoundAddress(
213 socket_server, &server_address))
214 return "PPB_UDPSocket_Private::GetBoundAddress: expected Failure";
215
216 PASS();
217}
218
219std::string TestUDPSocketPrivateShared::TestConnectFailure() {
220 std::string error_message;
221 PP_NetAddress_Private invalid_address = { 0 };
222 PP_Resource socket;
223
224 error_message = BindUDPSocketFailure(&invalid_address, &socket);
225 if (!error_message.empty())
226 return error_message;
227
[email protected]ef5e98e2011-12-06 09:49:18228 PASS();
229}