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 |