| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <cstring> | 5 #include <cstring> |
| 6 #include <vector> | 6 #include <vector> |
| 7 | 7 |
| 8 #include "ppapi/cpp/module.h" | 8 #include "ppapi/cpp/module.h" |
| 9 #include "ppapi/cpp/private/net_address_private.h" | 9 #include "ppapi/cpp/private/net_address_private.h" |
| 10 #include "ppapi/cpp/private/tcp_socket_private.h" | 10 #include "ppapi/cpp/private/tcp_socket_private.h" |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 47 | 47 |
| 48 return tcp_socket_private_is_available && | 48 return tcp_socket_private_is_available && |
| 49 udp_socket_private_is_available && | 49 udp_socket_private_is_available && |
| 50 net_address_private_is_available && | 50 net_address_private_is_available && |
| 51 init_host_port && | 51 init_host_port && |
| 52 CheckTestingInterface() && | 52 CheckTestingInterface() && |
| 53 EnsureRunningOverHTTP(); | 53 EnsureRunningOverHTTP(); |
| 54 } | 54 } |
| 55 | 55 |
| 56 void TestUDPSocketPrivate::RunTests(const std::string& filter) { | 56 void TestUDPSocketPrivate::RunTests(const std::string& filter) { |
| 57 RUN_TEST_FORCEASYNC_AND_NOT(Connect, filter); | 57 RUN_CALLBACK_TEST(TestUDPSocketPrivate, Connect, filter); |
| 58 RUN_TEST_FORCEASYNC_AND_NOT(ConnectFailure, filter); | 58 RUN_CALLBACK_TEST(TestUDPSocketPrivate, ConnectFailure, filter); |
| 59 RUN_TEST_FORCEASYNC_AND_NOT(Broadcast, filter); | 59 RUN_CALLBACK_TEST(TestUDPSocketPrivate, Broadcast, filter); |
| 60 RUN_TEST_FORCEASYNC_AND_NOT(SetSocketFeatureErrors, filter); | 60 RUN_CALLBACK_TEST(TestUDPSocketPrivate, SetSocketFeatureErrors, filter); |
| 61 } | 61 } |
| 62 | 62 |
| 63 std::string TestUDPSocketPrivate::GetLocalAddress( | 63 std::string TestUDPSocketPrivate::GetLocalAddress( |
| 64 PP_NetAddress_Private* address) { | 64 PP_NetAddress_Private* address) { |
| 65 pp::TCPSocketPrivate socket(instance_); | 65 pp::TCPSocketPrivate socket(instance_); |
| 66 TestCompletionCallback callback(instance_->pp_instance(), force_async_); | 66 TestCompletionCallback callback(instance_->pp_instance(), callback_type()); |
| 67 int32_t rv = socket.Connect(host_.c_str(), port_, callback.GetCallback()); | 67 callback.WaitForResult( |
| 68 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) | 68 socket.Connect(host_.c_str(), port_, callback.GetCallback())); |
| 69 return ReportError("PPB_TCPSocket_Private::Connect force_async", rv); | 69 CHECK_CALLBACK_BEHAVIOR(callback); |
| 70 if (rv == PP_OK_COMPLETIONPENDING) | 70 ASSERT_EQ(PP_OK, callback.result()); |
| 71 rv = callback.WaitForResult(); | 71 ASSERT_TRUE(socket.GetLocalAddress(address)); |
| 72 if (rv != PP_OK) | |
| 73 return ReportError("PPB_TCPSocket_Private::Connect", rv); | |
| 74 if (!socket.GetLocalAddress(address)) | |
| 75 return "PPB_TCPSocket_Private::GetLocalAddress: Failed"; | |
| 76 socket.Disconnect(); | 72 socket.Disconnect(); |
| 77 PASS(); | 73 PASS(); |
| 78 } | 74 } |
| 79 | 75 |
| 80 std::string TestUDPSocketPrivate::SetBroadcastOptions( | 76 std::string TestUDPSocketPrivate::SetBroadcastOptions( |
| 81 pp::UDPSocketPrivate* socket) { | 77 pp::UDPSocketPrivate* socket) { |
| 82 int32_t rv = socket->SetSocketFeature(PP_UDPSOCKETFEATURE_ADDRESS_REUSE, | 78 int32_t rv = socket->SetSocketFeature(PP_UDPSOCKETFEATURE_ADDRESS_REUSE, |
| 83 pp::Var(true)); | 79 pp::Var(true)); |
| 84 if (rv != PP_OK) | 80 if (rv != PP_OK) |
| 85 return ReportError("PPB_UDPSocket_Private::SetSocketFeature", rv); | 81 return ReportError("PPB_UDPSocket_Private::SetSocketFeature", rv); |
| 86 | 82 |
| 87 rv = socket->SetSocketFeature(PP_UDPSOCKETFEATURE_BROADCAST, pp::Var(true)); | 83 rv = socket->SetSocketFeature(PP_UDPSOCKETFEATURE_BROADCAST, pp::Var(true)); |
| 88 if (rv != PP_OK) | 84 if (rv != PP_OK) |
| 89 return ReportError("PPB_UDPSocket_Private::SetSocketFeature", rv); | 85 return ReportError("PPB_UDPSocket_Private::SetSocketFeature", rv); |
| 90 | 86 |
| 91 PASS(); | 87 PASS(); |
| 92 } | 88 } |
| 93 | 89 |
| 94 std::string TestUDPSocketPrivate::BindUDPSocket( | 90 std::string TestUDPSocketPrivate::BindUDPSocket( |
| 95 pp::UDPSocketPrivate* socket, | 91 pp::UDPSocketPrivate* socket, |
| 96 PP_NetAddress_Private* address) { | 92 PP_NetAddress_Private* address) { |
| 97 TestCompletionCallback callback(instance_->pp_instance(), force_async_); | 93 TestCompletionCallback callback(instance_->pp_instance(), callback_type()); |
| 98 int32_t rv = socket->Bind(address, callback.GetCallback()); | 94 callback.WaitForResult(socket->Bind(address, callback.GetCallback())); |
| 99 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) | 95 CHECK_CALLBACK_BEHAVIOR(callback); |
| 100 return ReportError("PPB_UDPSocket_Private::Bind force_async", rv); | 96 ASSERT_EQ(PP_OK, callback.result()); |
| 101 if (rv == PP_OK_COMPLETIONPENDING) | |
| 102 rv = callback.WaitForResult(); | |
| 103 if (rv != PP_OK) | |
| 104 return ReportError("PPB_UDPSocket_Private::Bind", rv); | |
| 105 PASS(); | 97 PASS(); |
| 106 } | 98 } |
| 107 | 99 |
| 108 std::string TestUDPSocketPrivate::LookupPortAndBindUDPSocket( | 100 std::string TestUDPSocketPrivate::LookupPortAndBindUDPSocket( |
| 109 pp::UDPSocketPrivate* socket, | 101 pp::UDPSocketPrivate* socket, |
| 110 PP_NetAddress_Private *address) { | 102 PP_NetAddress_Private *address) { |
| 111 PP_NetAddress_Private base_address; | 103 PP_NetAddress_Private base_address; |
| 112 ASSERT_SUBTEST_SUCCESS(GetLocalAddress(&base_address)); | 104 ASSERT_SUBTEST_SUCCESS(GetLocalAddress(&base_address)); |
| 113 | 105 |
| 114 bool is_free_port_found = false; | 106 bool is_free_port_found = false; |
| 115 for (uint16_t port = kPortScanFrom; port < kPortScanTo; ++port) { | 107 for (uint16_t port = kPortScanFrom; port < kPortScanTo; ++port) { |
| 116 if (!pp::NetAddressPrivate::ReplacePort(base_address, port, address)) | 108 if (!pp::NetAddressPrivate::ReplacePort(base_address, port, address)) |
| 117 return "PPB_NetAddress_Private::ReplacePort: Failed"; | 109 return "PPB_NetAddress_Private::ReplacePort: Failed"; |
| 118 if (BindUDPSocket(socket, address).empty()) { | 110 if (BindUDPSocket(socket, address).empty()) { |
| 119 is_free_port_found = true; | 111 is_free_port_found = true; |
| 120 break; | 112 break; |
| 121 } | 113 } |
| 122 } | 114 } |
| 123 if (!is_free_port_found) | 115 if (!is_free_port_found) |
| 124 return "Can't find available port"; | 116 return "Can't find available port"; |
| 125 if (!socket->GetBoundAddress(address)) | 117 if (!socket->GetBoundAddress(address)) |
| 126 return "PPB_UDPSocket_Private::GetBoundAddress: Failed"; | 118 return "PPB_UDPSocket_Private::GetBoundAddress: Failed"; |
| 127 PASS(); | 119 PASS(); |
| 128 } | 120 } |
| 129 | 121 |
| 130 std::string TestUDPSocketPrivate::BindUDPSocketFailure( | 122 std::string TestUDPSocketPrivate::BindUDPSocketFailure( |
| 131 pp::UDPSocketPrivate* socket, | 123 pp::UDPSocketPrivate* socket, |
| 132 PP_NetAddress_Private *address) { | 124 PP_NetAddress_Private *address) { |
| 133 TestCompletionCallback callback(instance_->pp_instance(), force_async_); | 125 TestCompletionCallback callback(instance_->pp_instance(), callback_type()); |
| 134 int32_t rv = socket->Bind(address, callback.GetCallback()); | 126 callback.WaitForResult(socket->Bind(address, callback.GetCallback())); |
| 135 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) | 127 CHECK_CALLBACK_BEHAVIOR(callback); |
| 136 return ReportError("PPB_UDPSocket_Private::Bind force_async", rv); | 128 ASSERT_NE(PP_OK, callback.result()); |
| 137 if (rv == PP_OK_COMPLETIONPENDING) | 129 ASSERT_FALSE(socket->GetBoundAddress(address)); |
| 138 rv = callback.WaitForResult(); | |
| 139 if (rv == PP_OK) | |
| 140 return ReportError("PPB_UDPSocket_Private::Bind", rv); | |
| 141 if (socket->GetBoundAddress(address)) | |
| 142 return "PPB_UDPSocket_Private::GetBoundAddress: Failed"; | |
| 143 PASS(); | 130 PASS(); |
| 144 } | 131 } |
| 145 | 132 |
| 146 std::string TestUDPSocketPrivate::ReadSocket(pp::UDPSocketPrivate* socket, | 133 std::string TestUDPSocketPrivate::ReadSocket(pp::UDPSocketPrivate* socket, |
| 147 PP_NetAddress_Private* address, | 134 PP_NetAddress_Private* address, |
| 148 size_t size, | 135 size_t size, |
| 149 std::string* message) { | 136 std::string* message) { |
| 150 std::vector<char> buffer(size); | 137 std::vector<char> buffer(size); |
| 151 TestCompletionCallback callback(instance_->pp_instance(), force_async_); | 138 TestCompletionCallback callback(instance_->pp_instance(), callback_type()); |
| 152 int32_t rv = socket->RecvFrom(&buffer[0], size, callback.GetCallback()); | 139 callback.WaitForResult( |
| 153 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) | 140 socket->RecvFrom(&buffer[0], size, callback.GetCallback())); |
| 154 return ReportError("PPB_UDPSocket_Private::RecvFrom force_async", rv); | 141 CHECK_CALLBACK_BEHAVIOR(callback); |
| 155 if (rv == PP_OK_COMPLETIONPENDING) | 142 ASSERT_FALSE(callback.result() < 0); |
| 156 rv = callback.WaitForResult(); | 143 ASSERT_EQ(size, static_cast<size_t>(callback.result())); |
| 157 if (rv < 0 || size != static_cast<size_t>(rv)) | |
| 158 return ReportError("PPB_UDPSocket_Private::RecvFrom", rv); | |
| 159 message->assign(buffer.begin(), buffer.end()); | 144 message->assign(buffer.begin(), buffer.end()); |
| 160 PASS(); | 145 PASS(); |
| 161 } | 146 } |
| 162 | 147 |
| 163 std::string TestUDPSocketPrivate::PassMessage(pp::UDPSocketPrivate* target, | 148 std::string TestUDPSocketPrivate::PassMessage(pp::UDPSocketPrivate* target, |
| 164 pp::UDPSocketPrivate* source, | 149 pp::UDPSocketPrivate* source, |
| 165 PP_NetAddress_Private* address, | 150 PP_NetAddress_Private* address, |
| 166 const std::string& message) { | 151 const std::string& message) { |
| 167 TestCompletionCallback callback(instance_->pp_instance(), force_async_); | 152 TestCompletionCallback callback(instance_->pp_instance(), callback_type()); |
| 168 int32_t rv = source->SendTo(message.c_str(), message.size(), address, | 153 int32_t rv = source->SendTo(message.c_str(), message.size(), address, |
| 169 callback.GetCallback()); | 154 callback.GetCallback()); |
| 170 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) | |
| 171 return ReportError("PPB_UDPSocket_Private::SendTo force_async", rv); | |
| 172 | |
| 173 std::string str; | 155 std::string str; |
| 174 ASSERT_SUBTEST_SUCCESS(ReadSocket(target, address, message.size(), &str)); | 156 ASSERT_SUBTEST_SUCCESS(ReadSocket(target, address, message.size(), &str)); |
| 175 | 157 |
| 176 if (rv == PP_OK_COMPLETIONPENDING) | 158 callback.WaitForResult(rv); |
| 177 rv = callback.WaitForResult(); | 159 CHECK_CALLBACK_BEHAVIOR(callback); |
| 178 if (rv < 0 || message.size() != static_cast<size_t>(rv)) | 160 ASSERT_FALSE(callback.result() < 0); |
| 179 return ReportError("PPB_UDPSocket_Private::SendTo", rv); | 161 ASSERT_EQ(message.size(), static_cast<size_t>(callback.result())); |
| 180 | |
| 181 ASSERT_EQ(message, str); | 162 ASSERT_EQ(message, str); |
| 182 PASS(); | 163 PASS(); |
| 183 } | 164 } |
| 184 | 165 |
| 185 std::string TestUDPSocketPrivate::TestConnect() { | 166 std::string TestUDPSocketPrivate::TestConnect() { |
| 186 pp::UDPSocketPrivate server_socket(instance_), client_socket(instance_); | 167 pp::UDPSocketPrivate server_socket(instance_), client_socket(instance_); |
| 187 PP_NetAddress_Private server_address, client_address; | 168 PP_NetAddress_Private server_address, client_address; |
| 188 | 169 |
| 189 ASSERT_SUBTEST_SUCCESS(LookupPortAndBindUDPSocket(&server_socket, | 170 ASSERT_SUBTEST_SUCCESS(LookupPortAndBindUDPSocket(&server_socket, |
| 190 &server_address)); | 171 &server_address)); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 267 // Try to pass incorrect feature name. | 248 // Try to pass incorrect feature name. |
| 268 int32_t rv = socket.SetSocketFeature(PP_UDPSOCKETFEATURE_COUNT, | 249 int32_t rv = socket.SetSocketFeature(PP_UDPSOCKETFEATURE_COUNT, |
| 269 pp::Var(true)); | 250 pp::Var(true)); |
| 270 ASSERT_EQ(PP_ERROR_BADARGUMENT, rv); | 251 ASSERT_EQ(PP_ERROR_BADARGUMENT, rv); |
| 271 | 252 |
| 272 // Try to pass incorrect feature value's type. | 253 // Try to pass incorrect feature value's type. |
| 273 rv = socket.SetSocketFeature(PP_UDPSOCKETFEATURE_ADDRESS_REUSE, pp::Var(1)); | 254 rv = socket.SetSocketFeature(PP_UDPSOCKETFEATURE_ADDRESS_REUSE, pp::Var(1)); |
| 274 ASSERT_EQ(PP_ERROR_BADARGUMENT, rv); | 255 ASSERT_EQ(PP_ERROR_BADARGUMENT, rv); |
| 275 PASS(); | 256 PASS(); |
| 276 } | 257 } |
| OLD | NEW |