| 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 "ppapi/tests/test_tcp_socket_private.h" | 5 #include "ppapi/tests/test_tcp_socket_private.h" |
| 6 | 6 |
| 7 #include <stdlib.h> | 7 #include <stdlib.h> |
| 8 | 8 |
| 9 #include "ppapi/cpp/private/tcp_socket_private.h" | 9 #include "ppapi/cpp/private/tcp_socket_private.h" |
| 10 #include "ppapi/tests/testing_instance.h" | 10 #include "ppapi/tests/testing_instance.h" |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 if (!GetLocalHostPort(instance_->pp_instance(), &host_, &port_)) | 40 if (!GetLocalHostPort(instance_->pp_instance(), &host_, &port_)) |
| 41 return false; | 41 return false; |
| 42 | 42 |
| 43 // Get the port for the SSL server. | 43 // Get the port for the SSL server. |
| 44 ssl_port_ = instance_->ssl_server_port(); | 44 ssl_port_ = instance_->ssl_server_port(); |
| 45 | 45 |
| 46 return true; | 46 return true; |
| 47 } | 47 } |
| 48 | 48 |
| 49 void TestTCPSocketPrivate::RunTests(const std::string& filter) { | 49 void TestTCPSocketPrivate::RunTests(const std::string& filter) { |
| 50 RUN_TEST_FORCEASYNC_AND_NOT(Basic, filter); | 50 RUN_CALLBACK_TEST(TestTCPSocketPrivate, Basic, filter); |
| 51 RUN_TEST_FORCEASYNC_AND_NOT(ReadWrite, filter); | 51 RUN_CALLBACK_TEST(TestTCPSocketPrivate, ReadWrite, filter); |
| 52 RUN_TEST_FORCEASYNC_AND_NOT(ReadWriteSSL, filter); | 52 RUN_CALLBACK_TEST(TestTCPSocketPrivate, ReadWriteSSL, filter); |
| 53 RUN_TEST_FORCEASYNC_AND_NOT(ConnectAddress, filter); | 53 RUN_CALLBACK_TEST(TestTCPSocketPrivate, ConnectAddress, filter); |
| 54 RUN_TEST_FORCEASYNC_AND_NOT(SetOption, filter); | 54 RUN_CALLBACK_TEST(TestTCPSocketPrivate, SetOption, filter); |
| 55 } | 55 } |
| 56 | 56 |
| 57 std::string TestTCPSocketPrivate::TestBasic() { | 57 std::string TestTCPSocketPrivate::TestBasic() { |
| 58 pp::TCPSocketPrivate socket(instance_); | 58 pp::TCPSocketPrivate socket(instance_); |
| 59 TestCompletionCallback cb(instance_->pp_instance(), force_async_); | 59 TestCompletionCallback cb(instance_->pp_instance(), callback_type()); |
| 60 | 60 |
| 61 int32_t rv = socket.Connect(host_.c_str(), port_, cb.GetCallback()); | 61 cb.WaitForResult(socket.Connect(host_.c_str(), port_, cb.GetCallback())); |
| 62 ASSERT_TRUE(!force_async_ || rv == PP_OK_COMPLETIONPENDING); | 62 CHECK_CALLBACK_BEHAVIOR(cb); |
| 63 if (rv == PP_OK_COMPLETIONPENDING) | 63 ASSERT_EQ(PP_OK, cb.result()); |
| 64 rv = cb.WaitForResult(); | |
| 65 ASSERT_EQ(PP_OK, rv); | |
| 66 | 64 |
| 67 PP_NetAddress_Private unused; | 65 PP_NetAddress_Private unused; |
| 68 // TODO(viettrungluu): check the values somehow. | 66 // TODO(viettrungluu): check the values somehow. |
| 69 ASSERT_TRUE(socket.GetLocalAddress(&unused)); | 67 ASSERT_TRUE(socket.GetLocalAddress(&unused)); |
| 70 ASSERT_TRUE(socket.GetRemoteAddress(&unused)); | 68 ASSERT_TRUE(socket.GetRemoteAddress(&unused)); |
| 71 | 69 |
| 72 socket.Disconnect(); | 70 socket.Disconnect(); |
| 73 | 71 |
| 74 PASS(); | 72 PASS(); |
| 75 } | 73 } |
| 76 | 74 |
| 77 std::string TestTCPSocketPrivate::TestReadWrite() { | 75 std::string TestTCPSocketPrivate::TestReadWrite() { |
| 78 pp::TCPSocketPrivate socket(instance_); | 76 pp::TCPSocketPrivate socket(instance_); |
| 79 TestCompletionCallback cb(instance_->pp_instance(), force_async_); | 77 TestCompletionCallback cb(instance_->pp_instance(), callback_type()); |
| 80 | 78 |
| 81 int32_t rv = socket.Connect(host_.c_str(), port_, cb.GetCallback()); | 79 cb.WaitForResult(socket.Connect(host_.c_str(), port_, cb.GetCallback())); |
| 82 ASSERT_TRUE(!force_async_ || rv == PP_OK_COMPLETIONPENDING); | 80 CHECK_CALLBACK_BEHAVIOR(cb); |
| 83 if (rv == PP_OK_COMPLETIONPENDING) | 81 ASSERT_EQ(PP_OK, cb.result()); |
| 84 rv = cb.WaitForResult(); | |
| 85 ASSERT_EQ(PP_OK, rv); | |
| 86 | 82 |
| 87 ASSERT_EQ(PP_OK, WriteStringToSocket(&socket, "GET / HTTP/1.0\r\n\r\n")); | 83 ASSERT_EQ(PP_OK, WriteStringToSocket(&socket, "GET / HTTP/1.0\r\n\r\n")); |
| 88 | 84 |
| 89 // Read up to the first \n and check that it looks like valid HTTP response. | 85 // Read up to the first \n and check that it looks like valid HTTP response. |
| 90 std::string s; | 86 std::string s; |
| 91 ASSERT_EQ(PP_OK, ReadFirstLineFromSocket(&socket, &s)); | 87 ASSERT_EQ(PP_OK, ReadFirstLineFromSocket(&socket, &s)); |
| 92 ASSERT_TRUE(ValidateHttpResponse(s)); | 88 ASSERT_TRUE(ValidateHttpResponse(s)); |
| 93 | 89 |
| 94 socket.Disconnect(); | 90 socket.Disconnect(); |
| 95 | 91 |
| 96 PASS(); | 92 PASS(); |
| 97 } | 93 } |
| 98 | 94 |
| 99 std::string TestTCPSocketPrivate::TestReadWriteSSL() { | 95 std::string TestTCPSocketPrivate::TestReadWriteSSL() { |
| 100 pp::TCPSocketPrivate socket(instance_); | 96 pp::TCPSocketPrivate socket(instance_); |
| 101 TestCompletionCallback cb(instance_->pp_instance(), force_async_); | 97 TestCompletionCallback cb(instance_->pp_instance(), callback_type()); |
| 102 | 98 |
| 103 int32_t rv = socket.Connect(host_.c_str(), ssl_port_, cb.GetCallback()); | 99 cb.WaitForResult(socket.Connect(host_.c_str(), ssl_port_, cb.GetCallback())); |
| 104 ASSERT_TRUE(!force_async_ || rv == PP_OK_COMPLETIONPENDING); | 100 CHECK_CALLBACK_BEHAVIOR(cb); |
| 105 if (rv == PP_OK_COMPLETIONPENDING) | 101 ASSERT_EQ(PP_OK, cb.result()); |
| 106 rv = cb.WaitForResult(); | |
| 107 ASSERT_EQ(PP_OK, rv); | |
| 108 | 102 |
| 109 rv = socket.SSLHandshake(host_.c_str(), ssl_port_, cb.GetCallback()); | 103 cb.WaitForResult( |
| 110 ASSERT_TRUE(!force_async_ || rv == PP_OK_COMPLETIONPENDING); | 104 socket.SSLHandshake(host_.c_str(), ssl_port_, cb.GetCallback())); |
| 111 if (rv == PP_OK_COMPLETIONPENDING) | 105 CHECK_CALLBACK_BEHAVIOR(cb); |
| 112 rv = cb.WaitForResult(); | 106 ASSERT_EQ(PP_OK, cb.result()); |
| 113 ASSERT_EQ(PP_OK, rv); | |
| 114 | 107 |
| 115 ASSERT_EQ(PP_OK, WriteStringToSocket(&socket, "GET / HTTP/1.0\r\n\r\n")); | 108 ASSERT_EQ(PP_OK, WriteStringToSocket(&socket, "GET / HTTP/1.0\r\n\r\n")); |
| 116 | 109 |
| 117 // Read up to the first \n and check that it looks like valid HTTP response. | 110 // Read up to the first \n and check that it looks like valid HTTP response. |
| 118 std::string s; | 111 std::string s; |
| 119 ASSERT_EQ(PP_OK, ReadFirstLineFromSocket(&socket, &s)); | 112 ASSERT_EQ(PP_OK, ReadFirstLineFromSocket(&socket, &s)); |
| 120 ASSERT_TRUE(ValidateHttpResponse(s)); | 113 ASSERT_TRUE(ValidateHttpResponse(s)); |
| 121 | 114 |
| 122 socket.Disconnect(); | 115 socket.Disconnect(); |
| 123 | 116 |
| 124 PASS(); | 117 PASS(); |
| 125 } | 118 } |
| 126 | 119 |
| 127 std::string TestTCPSocketPrivate::TestConnectAddress() { | 120 std::string TestTCPSocketPrivate::TestConnectAddress() { |
| 128 PP_NetAddress_Private address; | 121 PP_NetAddress_Private address; |
| 129 | 122 |
| 130 // First, bring up a connection and grab the address. | 123 // First, bring up a connection and grab the address. |
| 131 { | 124 { |
| 132 pp::TCPSocketPrivate socket(instance_); | 125 pp::TCPSocketPrivate socket(instance_); |
| 133 TestCompletionCallback cb(instance_->pp_instance(), force_async_); | 126 TestCompletionCallback cb(instance_->pp_instance(), callback_type()); |
| 134 int32_t rv = socket.Connect(host_.c_str(), port_, cb.GetCallback()); | 127 cb.WaitForResult(socket.Connect(host_.c_str(), port_, cb.GetCallback())); |
| 135 ASSERT_TRUE(!force_async_ || rv == PP_OK_COMPLETIONPENDING); | 128 CHECK_CALLBACK_BEHAVIOR(cb); |
| 136 if (rv == PP_OK_COMPLETIONPENDING) | 129 ASSERT_EQ(PP_OK, cb.result()); |
| 137 rv = cb.WaitForResult(); | |
| 138 ASSERT_EQ(PP_OK, rv); | |
| 139 ASSERT_TRUE(socket.GetRemoteAddress(&address)); | 130 ASSERT_TRUE(socket.GetRemoteAddress(&address)); |
| 140 // Omit the |Disconnect()| here to make sure we don't crash if we just let | 131 // Omit the |Disconnect()| here to make sure we don't crash if we just let |
| 141 // the resource be destroyed. | 132 // the resource be destroyed. |
| 142 } | 133 } |
| 143 | 134 |
| 144 // Connect to that address. | 135 // Connect to that address. |
| 145 pp::TCPSocketPrivate socket(instance_); | 136 pp::TCPSocketPrivate socket(instance_); |
| 146 TestCompletionCallback cb(instance_->pp_instance(), force_async_); | 137 TestCompletionCallback cb(instance_->pp_instance(), callback_type()); |
| 147 int32_t rv = socket.ConnectWithNetAddress(&address, cb.GetCallback()); | 138 cb.WaitForResult(socket.ConnectWithNetAddress(&address, cb.GetCallback())); |
| 148 ASSERT_TRUE(!force_async_ || rv == PP_OK_COMPLETIONPENDING); | 139 CHECK_CALLBACK_BEHAVIOR(cb); |
| 149 if (rv == PP_OK_COMPLETIONPENDING) | 140 ASSERT_EQ(PP_OK, cb.result()); |
| 150 rv = cb.WaitForResult(); | |
| 151 ASSERT_EQ(PP_OK, rv); | |
| 152 | 141 |
| 153 // Make sure we can read/write to it properly (see |TestReadWrite()|). | 142 // Make sure we can read/write to it properly (see |TestReadWrite()|). |
| 154 ASSERT_EQ(PP_OK, WriteStringToSocket(&socket, "GET / HTTP/1.0\r\n\r\n")); | 143 ASSERT_EQ(PP_OK, WriteStringToSocket(&socket, "GET / HTTP/1.0\r\n\r\n")); |
| 155 std::string s; | 144 std::string s; |
| 156 ASSERT_EQ(PP_OK, ReadFirstLineFromSocket(&socket, &s)); | 145 ASSERT_EQ(PP_OK, ReadFirstLineFromSocket(&socket, &s)); |
| 157 ASSERT_TRUE(ValidateHttpResponse(s)); | 146 ASSERT_TRUE(ValidateHttpResponse(s)); |
| 158 | 147 |
| 159 socket.Disconnect(); | 148 socket.Disconnect(); |
| 160 | 149 |
| 161 PASS(); | 150 PASS(); |
| 162 } | 151 } |
| 163 | 152 |
| 164 std::string TestTCPSocketPrivate::TestSetOption() { | 153 std::string TestTCPSocketPrivate::TestSetOption() { |
| 165 pp::TCPSocketPrivate socket(instance_); | 154 pp::TCPSocketPrivate socket(instance_); |
| 166 TestCompletionCallback cb(instance_->pp_instance(), force_async_); | 155 TestCompletionCallback cb(instance_->pp_instance(), callback_type()); |
| 167 | 156 |
| 168 int32_t rv = socket.SetOption(PP_TCPSOCKETOPTION_NO_DELAY, true, | 157 cb.WaitForResult( |
| 169 cb.GetCallback()); | 158 socket.SetOption(PP_TCPSOCKETOPTION_NO_DELAY, true, cb.GetCallback())); |
| 170 ASSERT_TRUE(!force_async_ || rv == PP_OK_COMPLETIONPENDING); | 159 CHECK_CALLBACK_BEHAVIOR(cb); |
| 171 if (rv == PP_OK_COMPLETIONPENDING) | 160 ASSERT_EQ(PP_ERROR_FAILED, cb.result()); |
| 172 rv = cb.WaitForResult(); | |
| 173 ASSERT_EQ(PP_ERROR_FAILED, rv); | |
| 174 | 161 |
| 175 rv = socket.Connect(host_.c_str(), port_, cb.GetCallback()); | 162 cb.WaitForResult(socket.Connect(host_.c_str(), port_, cb.GetCallback())); |
| 176 ASSERT_TRUE(!force_async_ || rv == PP_OK_COMPLETIONPENDING); | 163 CHECK_CALLBACK_BEHAVIOR(cb); |
| 177 if (rv == PP_OK_COMPLETIONPENDING) | 164 ASSERT_EQ(PP_OK, cb.result()); |
| 178 rv = cb.WaitForResult(); | |
| 179 ASSERT_EQ(PP_OK, rv); | |
| 180 | 165 |
| 181 rv = socket.SetOption(PP_TCPSOCKETOPTION_NO_DELAY, true, cb.GetCallback()); | 166 cb.WaitForResult( |
| 182 ASSERT_TRUE(!force_async_ || rv == PP_OK_COMPLETIONPENDING); | 167 socket.SetOption(PP_TCPSOCKETOPTION_NO_DELAY, true, cb.GetCallback())); |
| 183 if (rv == PP_OK_COMPLETIONPENDING) | 168 CHECK_CALLBACK_BEHAVIOR(cb); |
| 184 rv = cb.WaitForResult(); | 169 ASSERT_EQ(PP_OK, cb.result()); |
| 185 ASSERT_EQ(PP_OK, rv); | |
| 186 | 170 |
| 187 rv = socket.SetOption(PP_TCPSOCKETOPTION_INVALID, true, cb.GetCallback()); | 171 cb.WaitForResult( |
| 188 ASSERT_TRUE(!force_async_ || rv == PP_OK_COMPLETIONPENDING); | 172 socket.SetOption(PP_TCPSOCKETOPTION_INVALID, true, cb.GetCallback())); |
| 189 if (rv == PP_OK_COMPLETIONPENDING) | 173 CHECK_CALLBACK_BEHAVIOR(cb); |
| 190 rv = cb.WaitForResult(); | 174 ASSERT_EQ(PP_ERROR_BADARGUMENT, cb.result()); |
| 191 ASSERT_EQ(PP_ERROR_BADARGUMENT, rv); | |
| 192 | 175 |
| 193 socket.Disconnect(); | 176 socket.Disconnect(); |
| 194 | 177 |
| 195 PASS(); | 178 PASS(); |
| 196 } | 179 } |
| 197 | 180 |
| 198 int32_t TestTCPSocketPrivate::ReadFirstLineFromSocket( | 181 int32_t TestTCPSocketPrivate::ReadFirstLineFromSocket( |
| 199 pp::TCPSocketPrivate* socket, | 182 pp::TCPSocketPrivate* socket, |
| 200 std::string* s) { | 183 std::string* s) { |
| 201 char buffer[10000]; | 184 char buffer[10000]; |
| 202 | 185 |
| 203 s->clear(); | 186 s->clear(); |
| 204 // Make sure we don't just hang if |Read()| spews. | 187 // Make sure we don't just hang if |Read()| spews. |
| 205 while (s->size() < 1000000) { | 188 while (s->size() < 1000000) { |
| 206 TestCompletionCallback cb(instance_->pp_instance(), force_async_); | 189 TestCompletionCallback cb(instance_->pp_instance(), callback_type()); |
| 207 int32_t rv = socket->Read(buffer, sizeof(buffer), cb.GetCallback()); | 190 int32_t rv = socket->Read(buffer, sizeof(buffer), cb.GetCallback()); |
| 208 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) | 191 if (callback_type() == PP_REQUIRED && rv != PP_OK_COMPLETIONPENDING) |
| 209 return PP_ERROR_FAILED; | 192 return PP_ERROR_FAILED; |
| 210 if (rv == PP_OK_COMPLETIONPENDING) | 193 cb.WaitForResult(rv); |
| 211 rv = cb.WaitForResult(); | 194 if (cb.result() < 0) |
| 212 if (rv < 0) | 195 return cb.result(); |
| 213 return rv; | 196 if (cb.result() == 0) |
| 214 if (rv == 0) | |
| 215 return PP_ERROR_FAILED; // Didn't get a \n-terminated line. | 197 return PP_ERROR_FAILED; // Didn't get a \n-terminated line. |
| 216 s->reserve(s->size() + rv); | 198 s->reserve(s->size() + cb.result()); |
| 217 for (int32_t i = 0; i < rv; i++) { | 199 for (int32_t i = 0; i < cb.result(); i++) { |
| 218 s->push_back(buffer[i]); | 200 s->push_back(buffer[i]); |
| 219 if (buffer[i] == '\n') | 201 if (buffer[i] == '\n') |
| 220 return PP_OK; | 202 return PP_OK; |
| 221 } | 203 } |
| 222 } | 204 } |
| 223 return PP_ERROR_FAILED; | 205 return PP_ERROR_FAILED; |
| 224 } | 206 } |
| 225 | 207 |
| 226 int32_t TestTCPSocketPrivate::WriteStringToSocket(pp::TCPSocketPrivate* socket, | 208 int32_t TestTCPSocketPrivate::WriteStringToSocket(pp::TCPSocketPrivate* socket, |
| 227 const std::string& s) { | 209 const std::string& s) { |
| 228 const char* buffer = s.data(); | 210 const char* buffer = s.data(); |
| 229 size_t written = 0; | 211 size_t written = 0; |
| 230 while (written < s.size()) { | 212 while (written < s.size()) { |
| 231 TestCompletionCallback cb(instance_->pp_instance(), force_async_); | 213 TestCompletionCallback cb(instance_->pp_instance(), callback_type()); |
| 232 int32_t rv = socket->Write(buffer + written, s.size() - written, | 214 int32_t rv = socket->Write(buffer + written, s.size() - written, |
| 233 cb.GetCallback()); | 215 cb.GetCallback()); |
| 234 if (force_async_ && rv != PP_OK_COMPLETIONPENDING) | 216 if (callback_type() == PP_REQUIRED && rv != PP_OK_COMPLETIONPENDING) |
| 235 return PP_ERROR_FAILED; | 217 return PP_ERROR_FAILED; |
| 236 if (rv == PP_OK_COMPLETIONPENDING) | 218 cb.WaitForResult(rv); |
| 237 rv = cb.WaitForResult(); | 219 if (cb.result() < 0) |
| 238 if (rv < 0) | 220 return cb.result(); |
| 239 return rv; | 221 if (cb.result() == 0) |
| 240 if (rv == 0) | |
| 241 return PP_ERROR_FAILED; | 222 return PP_ERROR_FAILED; |
| 242 written += rv; | 223 written += cb.result(); |
| 243 } | 224 } |
| 244 if (written != s.size()) | 225 if (written != s.size()) |
| 245 return PP_ERROR_FAILED; | 226 return PP_ERROR_FAILED; |
| 246 return PP_OK; | 227 return PP_OK; |
| 247 } | 228 } |
| OLD | NEW |