Index: ppapi/native_client/tests/ppapi_browser/ppb_tcp_socket_private/ppapi_ppb_tcp_socket_private.cc |
diff --git a/ppapi/native_client/tests/ppapi_browser/ppb_tcp_socket_private/ppapi_ppb_tcp_socket_private.cc b/ppapi/native_client/tests/ppapi_browser/ppb_tcp_socket_private/ppapi_ppb_tcp_socket_private.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..693934e742f5275de88e3b778ce6bec0adc13736 |
--- /dev/null |
+++ b/ppapi/native_client/tests/ppapi_browser/ppb_tcp_socket_private/ppapi_ppb_tcp_socket_private.cc |
@@ -0,0 +1,162 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include <string.h> |
+#include <algorithm> |
+ |
+#include "native_client/src/include/nacl_macros.h" |
+#include "native_client/src/shared/platform/nacl_check.h" |
+#include "native_client/tests/ppapi_test_lib/get_browser_interface.h" |
+#include "native_client/tests/ppapi_test_lib/test_interface.h" |
+#include "native_client/tests/ppapi_test_lib/testable_callback.h" |
+#include "ppapi/c/pp_errors.h" |
+#include "ppapi/cpp/private/tcp_socket_private.h" |
+ |
+namespace { |
+ |
+const char* const kServerHost = "www.google.com"; |
+const int kServerPort = 443; |
+ |
+PP_Resource CreateSocket() { |
+ PP_Resource socket = PPBTCPSocketPrivate()->Create(pp_instance()); |
+ EXPECT(socket != kInvalidInstance); |
+ EXPECT(PPBTCPSocketPrivate()->IsTCPSocket(socket)); |
+ return socket; |
+} |
+ |
+void SyncConnect(PP_Resource socket, const char* host, int port) { |
+ TestableCallback callback(pp_instance(), true); |
+ callback.Reset(); |
+ EXPECT(PP_OK_COMPLETIONPENDING == |
+ PPBTCPSocketPrivate()->Connect(socket, host, port, |
+ callback.GetCallback())); |
+ EXPECT(PP_OK == callback.WaitForResult()); |
+} |
+ |
+void SyncConnectWithNetAddress(PP_Resource socket, |
+ const PP_NetAddress_Private &addr) { |
+ TestableCallback callback(pp_instance(), true); |
+ callback.Reset(); |
+ EXPECT(PP_OK_COMPLETIONPENDING == |
+ PPBTCPSocketPrivate()->ConnectWithNetAddress(socket, &addr, |
+ callback.GetCallback())); |
+ EXPECT(PP_OK == callback.WaitForResult()); |
+} |
+ |
+void SyncSSLHandshake(PP_Resource socket, const char* host, int port) { |
+ TestableCallback callback(pp_instance(), true); |
+ callback.Reset(); |
+ EXPECT(PP_OK_COMPLETIONPENDING == |
+ PPBTCPSocketPrivate()->SSLHandshake(socket, host, port, |
+ callback.GetCallback())); |
+ EXPECT(PP_OK == callback.WaitForResult()); |
+} |
+ |
+int32_t SyncRead(PP_Resource socket, char* buffer, int32_t num_bytes) { |
+ TestableCallback callback(pp_instance(), true); |
+ callback.Reset(); |
+ EXPECT(PP_OK_COMPLETIONPENDING == |
+ PPBTCPSocketPrivate()->Read(socket, buffer, num_bytes, |
+ callback.GetCallback())); |
+ return callback.WaitForResult(); |
+} |
+ |
+int32_t SyncWrite(PP_Resource socket, const char* buffer, int32_t num_bytes) { |
+ TestableCallback callback(pp_instance(), true); |
+ callback.Reset(); |
+ EXPECT(PP_OK_COMPLETIONPENDING == |
+ PPBTCPSocketPrivate()->Write(socket, buffer, num_bytes, |
+ callback.GetCallback())); |
+ return callback.WaitForResult(); |
+} |
+ |
+void CheckHTTPResponse(PP_Resource socket, const char* request, |
+ const char* response) { |
+ int32_t rv; |
+ |
+ rv = SyncWrite(socket, request, strlen(request)); |
+ EXPECT(0 < rv); |
+ EXPECT(strlen(request) == static_cast<size_t>(rv)); |
+ |
+ static const size_t kResponseBufferSize = 1024; |
+ char response_buffer[kResponseBufferSize]; |
+ |
+ rv = SyncRead(socket, response_buffer, kResponseBufferSize); |
+ EXPECT(0 < rv); |
+ |
+ EXPECT(0 == strncmp(response, response_buffer, |
+ std::min(static_cast<size_t>(rv), |
+ strlen(response)))); |
+} |
+ |
+void TestCreate() { |
+ PP_Resource socket; |
+ socket = PPBTCPSocketPrivate()->Create(kInvalidInstance); |
+ EXPECT(socket == kInvalidResource); |
+ socket = CreateSocket(); |
+ |
+ TEST_PASSED; |
+} |
+ |
+void TestGetAddress() { |
+ PP_Resource socket = CreateSocket(); |
+ SyncConnect(socket, kServerHost, kServerPort); |
+ |
+ PP_NetAddress_Private local_address, remote_address; |
+ |
+ EXPECT(PP_TRUE == |
+ PPBTCPSocketPrivate()->GetLocalAddress(socket, &local_address)); |
+ EXPECT(PP_TRUE == |
+ PPBTCPSocketPrivate()->GetRemoteAddress(socket, &remote_address)); |
+ |
+ PPBTCPSocketPrivate()->Disconnect(socket); |
+ |
+ TEST_PASSED; |
+} |
+ |
+void TestConnect() { |
+ PP_Resource socket = CreateSocket(); |
+ SyncConnect(socket, kServerHost, kServerPort); |
+ SyncSSLHandshake(socket, kServerHost, kServerPort); |
+ |
+ CheckHTTPResponse(socket, "GET /robots.txt\r\n", "HTTP/1.0 200 OK"); |
+ |
+ PPBTCPSocketPrivate()->Disconnect(socket); |
+ |
+ TEST_PASSED; |
+} |
+ |
+void TestReconnect() { |
+ PP_Resource socket = CreateSocket(); |
+ SyncConnect(socket, kServerHost, kServerPort); |
+ SyncSSLHandshake(socket, kServerHost, kServerPort); |
+ |
+ PP_NetAddress_Private remote_address; |
+ EXPECT(PP_TRUE == |
+ PPBTCPSocketPrivate()->GetRemoteAddress(socket, &remote_address)); |
+ PPBTCPSocketPrivate()->Disconnect(socket); |
+ |
+ socket = CreateSocket(); |
+ SyncConnectWithNetAddress(socket, remote_address); |
+ SyncSSLHandshake(socket, kServerHost, kServerPort); |
+ |
+ CheckHTTPResponse(socket, "GET /robots.txt\r\n", "HTTP/1.0 200 OK"); |
+ |
+ PPBTCPSocketPrivate()->Disconnect(socket); |
+ |
+ TEST_PASSED; |
+} |
+ |
+} // namespace |
+ |
+void SetupTests() { |
+ RegisterTest("TestCreate", TestCreate); |
+ RegisterTest("TestGetAddress", TestGetAddress); |
+ RegisterTest("TestConnect", TestConnect); |
+ RegisterTest("TestReconnect", TestReconnect); |
+} |
+ |
+void SetupPluginInterfaces() { |
+ // none |
+} |