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 |