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 // This test suite uses SSLClientSocket to test the implementation of | 5 // This test suite uses SSLClientSocket to test the implementation of |
6 // SSLServerSocket. In order to establish connections between the sockets | 6 // SSLServerSocket. In order to establish connections between the sockets |
7 // we need two additional classes: | 7 // we need two additional classes: |
8 // 1. FakeSocket | 8 // 1. FakeSocket |
9 // Connects SSL socket to FakeDataChannel. This class is just a stub. | 9 // Connects SSL socket to FakeDataChannel. This class is just a stub. |
10 // | 10 // |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 | 63 |
64 int Read(IOBuffer* buf, int buf_len, const CompletionCallback& callback) { | 64 int Read(IOBuffer* buf, int buf_len, const CompletionCallback& callback) { |
65 DCHECK(read_callback_.is_null()); | 65 DCHECK(read_callback_.is_null()); |
66 DCHECK(!read_buf_); | 66 DCHECK(!read_buf_); |
67 if (closed_) | 67 if (closed_) |
68 return 0; | 68 return 0; |
69 if (data_.empty()) { | 69 if (data_.empty()) { |
70 read_callback_ = callback; | 70 read_callback_ = callback; |
71 read_buf_ = buf; | 71 read_buf_ = buf; |
72 read_buf_len_ = buf_len; | 72 read_buf_len_ = buf_len; |
73 return net::ERR_IO_PENDING; | 73 return ERR_IO_PENDING; |
74 } | 74 } |
75 return PropogateData(buf, buf_len); | 75 return PropogateData(buf, buf_len); |
76 } | 76 } |
77 | 77 |
78 int Write(IOBuffer* buf, int buf_len, const CompletionCallback& callback) { | 78 int Write(IOBuffer* buf, int buf_len, const CompletionCallback& callback) { |
79 DCHECK(write_callback_.is_null()); | 79 DCHECK(write_callback_.is_null()); |
80 if (closed_) { | 80 if (closed_) { |
81 if (write_called_after_close_) | 81 if (write_called_after_close_) |
82 return net::ERR_CONNECTION_RESET; | 82 return ERR_CONNECTION_RESET; |
83 write_called_after_close_ = true; | 83 write_called_after_close_ = true; |
84 write_callback_ = callback; | 84 write_callback_ = callback; |
85 base::MessageLoop::current()->PostTask( | 85 base::MessageLoop::current()->PostTask( |
86 FROM_HERE, base::Bind(&FakeDataChannel::DoWriteCallback, | 86 FROM_HERE, base::Bind(&FakeDataChannel::DoWriteCallback, |
87 weak_factory_.GetWeakPtr())); | 87 weak_factory_.GetWeakPtr())); |
88 return net::ERR_IO_PENDING; | 88 return ERR_IO_PENDING; |
89 } | 89 } |
90 // This function returns synchronously, so make a copy of the buffer. | 90 // This function returns synchronously, so make a copy of the buffer. |
91 data_.push(new net::DrainableIOBuffer( | 91 data_.push(new DrainableIOBuffer( |
92 new net::StringIOBuffer(std::string(buf->data(), buf_len)), | 92 new StringIOBuffer(std::string(buf->data(), buf_len)), |
93 buf_len)); | 93 buf_len)); |
94 base::MessageLoop::current()->PostTask( | 94 base::MessageLoop::current()->PostTask( |
95 FROM_HERE, base::Bind(&FakeDataChannel::DoReadCallback, | 95 FROM_HERE, base::Bind(&FakeDataChannel::DoReadCallback, |
96 weak_factory_.GetWeakPtr())); | 96 weak_factory_.GetWeakPtr())); |
97 return buf_len; | 97 return buf_len; |
98 } | 98 } |
99 | 99 |
100 // Closes the FakeDataChannel. After Close() is called, Read() returns 0, | 100 // Closes the FakeDataChannel. After Close() is called, Read() returns 0, |
101 // indicating EOF, and Write() fails with ERR_CONNECTION_RESET. Note that | 101 // indicating EOF, and Write() fails with ERR_CONNECTION_RESET. Note that |
102 // after the FakeDataChannel is closed, the first Write() call completes | 102 // after the FakeDataChannel is closed, the first Write() call completes |
(...skipping 14 matching lines...) Expand all Loading... |
117 read_buf_len_ = 0; | 117 read_buf_len_ = 0; |
118 callback.Run(copied); | 118 callback.Run(copied); |
119 } | 119 } |
120 | 120 |
121 void DoWriteCallback() { | 121 void DoWriteCallback() { |
122 if (write_callback_.is_null()) | 122 if (write_callback_.is_null()) |
123 return; | 123 return; |
124 | 124 |
125 CompletionCallback callback = write_callback_; | 125 CompletionCallback callback = write_callback_; |
126 write_callback_.Reset(); | 126 write_callback_.Reset(); |
127 callback.Run(net::ERR_CONNECTION_RESET); | 127 callback.Run(ERR_CONNECTION_RESET); |
128 } | 128 } |
129 | 129 |
130 int PropogateData(scoped_refptr<net::IOBuffer> read_buf, int read_buf_len) { | 130 int PropogateData(scoped_refptr<IOBuffer> read_buf, int read_buf_len) { |
131 scoped_refptr<net::DrainableIOBuffer> buf = data_.front(); | 131 scoped_refptr<DrainableIOBuffer> buf = data_.front(); |
132 int copied = std::min(buf->BytesRemaining(), read_buf_len); | 132 int copied = std::min(buf->BytesRemaining(), read_buf_len); |
133 memcpy(read_buf->data(), buf->data(), copied); | 133 memcpy(read_buf->data(), buf->data(), copied); |
134 buf->DidConsume(copied); | 134 buf->DidConsume(copied); |
135 | 135 |
136 if (!buf->BytesRemaining()) | 136 if (!buf->BytesRemaining()) |
137 data_.pop(); | 137 data_.pop(); |
138 return copied; | 138 return copied; |
139 } | 139 } |
140 | 140 |
141 CompletionCallback read_callback_; | 141 CompletionCallback read_callback_; |
142 scoped_refptr<net::IOBuffer> read_buf_; | 142 scoped_refptr<IOBuffer> read_buf_; |
143 int read_buf_len_; | 143 int read_buf_len_; |
144 | 144 |
145 CompletionCallback write_callback_; | 145 CompletionCallback write_callback_; |
146 | 146 |
147 std::queue<scoped_refptr<net::DrainableIOBuffer> > data_; | 147 std::queue<scoped_refptr<DrainableIOBuffer> > data_; |
148 | 148 |
149 // True if Close() has been called. | 149 // True if Close() has been called. |
150 bool closed_; | 150 bool closed_; |
151 | 151 |
152 // Controls the completion of Write() after the FakeDataChannel is closed. | 152 // Controls the completion of Write() after the FakeDataChannel is closed. |
153 // After the FakeDataChannel is closed, the first Write() call completes | 153 // After the FakeDataChannel is closed, the first Write() call completes |
154 // asynchronously. | 154 // asynchronously. |
155 bool write_called_after_close_; | 155 bool write_called_after_close_; |
156 | 156 |
157 base::WeakPtrFactory<FakeDataChannel> weak_factory_; | 157 base::WeakPtrFactory<FakeDataChannel> weak_factory_; |
(...skipping 20 matching lines...) Expand all Loading... |
178 } | 178 } |
179 | 179 |
180 virtual int Write(IOBuffer* buf, int buf_len, | 180 virtual int Write(IOBuffer* buf, int buf_len, |
181 const CompletionCallback& callback) OVERRIDE { | 181 const CompletionCallback& callback) OVERRIDE { |
182 // Write random number of bytes. | 182 // Write random number of bytes. |
183 buf_len = rand() % buf_len + 1; | 183 buf_len = rand() % buf_len + 1; |
184 return outgoing_->Write(buf, buf_len, callback); | 184 return outgoing_->Write(buf, buf_len, callback); |
185 } | 185 } |
186 | 186 |
187 virtual int SetReceiveBufferSize(int32 size) OVERRIDE { | 187 virtual int SetReceiveBufferSize(int32 size) OVERRIDE { |
188 return net::OK; | 188 return OK; |
189 } | 189 } |
190 | 190 |
191 virtual int SetSendBufferSize(int32 size) OVERRIDE { | 191 virtual int SetSendBufferSize(int32 size) OVERRIDE { |
192 return net::OK; | 192 return OK; |
193 } | 193 } |
194 | 194 |
195 virtual int Connect(const CompletionCallback& callback) OVERRIDE { | 195 virtual int Connect(const CompletionCallback& callback) OVERRIDE { |
196 return net::OK; | 196 return OK; |
197 } | 197 } |
198 | 198 |
199 virtual void Disconnect() OVERRIDE { | 199 virtual void Disconnect() OVERRIDE { |
200 incoming_->Close(); | 200 incoming_->Close(); |
201 outgoing_->Close(); | 201 outgoing_->Close(); |
202 } | 202 } |
203 | 203 |
204 virtual bool IsConnected() const OVERRIDE { | 204 virtual bool IsConnected() const OVERRIDE { |
205 return true; | 205 return true; |
206 } | 206 } |
207 | 207 |
208 virtual bool IsConnectedAndIdle() const OVERRIDE { | 208 virtual bool IsConnectedAndIdle() const OVERRIDE { |
209 return true; | 209 return true; |
210 } | 210 } |
211 | 211 |
212 virtual int GetPeerAddress(IPEndPoint* address) const OVERRIDE { | 212 virtual int GetPeerAddress(IPEndPoint* address) const OVERRIDE { |
213 net::IPAddressNumber ip_address(net::kIPv4AddressSize); | 213 IPAddressNumber ip_address(kIPv4AddressSize); |
214 *address = net::IPEndPoint(ip_address, 0 /*port*/); | 214 *address = IPEndPoint(ip_address, 0 /*port*/); |
215 return net::OK; | 215 return OK; |
216 } | 216 } |
217 | 217 |
218 virtual int GetLocalAddress(IPEndPoint* address) const OVERRIDE { | 218 virtual int GetLocalAddress(IPEndPoint* address) const OVERRIDE { |
219 net::IPAddressNumber ip_address(4); | 219 IPAddressNumber ip_address(4); |
220 *address = net::IPEndPoint(ip_address, 0); | 220 *address = IPEndPoint(ip_address, 0); |
221 return net::OK; | 221 return OK; |
222 } | 222 } |
223 | 223 |
224 virtual const BoundNetLog& NetLog() const OVERRIDE { | 224 virtual const BoundNetLog& NetLog() const OVERRIDE { |
225 return net_log_; | 225 return net_log_; |
226 } | 226 } |
227 | 227 |
228 virtual void SetSubresourceSpeculation() OVERRIDE {} | 228 virtual void SetSubresourceSpeculation() OVERRIDE {} |
229 virtual void SetOmniboxSpeculation() OVERRIDE {} | 229 virtual void SetOmniboxSpeculation() OVERRIDE {} |
230 | 230 |
231 virtual bool WasEverUsed() const OVERRIDE { | 231 virtual bool WasEverUsed() const OVERRIDE { |
(...skipping 11 matching lines...) Expand all Loading... |
243 | 243 |
244 virtual NextProto GetNegotiatedProtocol() const OVERRIDE { | 244 virtual NextProto GetNegotiatedProtocol() const OVERRIDE { |
245 return kProtoUnknown; | 245 return kProtoUnknown; |
246 } | 246 } |
247 | 247 |
248 virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE { | 248 virtual bool GetSSLInfo(SSLInfo* ssl_info) OVERRIDE { |
249 return false; | 249 return false; |
250 } | 250 } |
251 | 251 |
252 private: | 252 private: |
253 net::BoundNetLog net_log_; | 253 BoundNetLog net_log_; |
254 FakeDataChannel* incoming_; | 254 FakeDataChannel* incoming_; |
255 FakeDataChannel* outgoing_; | 255 FakeDataChannel* outgoing_; |
256 | 256 |
257 DISALLOW_COPY_AND_ASSIGN(FakeSocket); | 257 DISALLOW_COPY_AND_ASSIGN(FakeSocket); |
258 }; | 258 }; |
259 | 259 |
260 } // namespace | 260 } // namespace |
261 | 261 |
262 // Verify the correctness of the test helper classes first. | 262 // Verify the correctness of the test helper classes first. |
263 TEST(FakeSocketTest, DataTransfer) { | 263 TEST(FakeSocketTest, DataTransfer) { |
264 // Establish channels between two sockets. | 264 // Establish channels between two sockets. |
265 FakeDataChannel channel_1; | 265 FakeDataChannel channel_1; |
266 FakeDataChannel channel_2; | 266 FakeDataChannel channel_2; |
267 FakeSocket client(&channel_1, &channel_2); | 267 FakeSocket client(&channel_1, &channel_2); |
268 FakeSocket server(&channel_2, &channel_1); | 268 FakeSocket server(&channel_2, &channel_1); |
269 | 269 |
270 const char kTestData[] = "testing123"; | 270 const char kTestData[] = "testing123"; |
271 const int kTestDataSize = strlen(kTestData); | 271 const int kTestDataSize = strlen(kTestData); |
272 const int kReadBufSize = 1024; | 272 const int kReadBufSize = 1024; |
273 scoped_refptr<net::IOBuffer> write_buf = new net::StringIOBuffer(kTestData); | 273 scoped_refptr<IOBuffer> write_buf = new StringIOBuffer(kTestData); |
274 scoped_refptr<net::IOBuffer> read_buf = new net::IOBuffer(kReadBufSize); | 274 scoped_refptr<IOBuffer> read_buf = new IOBuffer(kReadBufSize); |
275 | 275 |
276 // Write then read. | 276 // Write then read. |
277 int written = | 277 int written = |
278 server.Write(write_buf.get(), kTestDataSize, CompletionCallback()); | 278 server.Write(write_buf.get(), kTestDataSize, CompletionCallback()); |
279 EXPECT_GT(written, 0); | 279 EXPECT_GT(written, 0); |
280 EXPECT_LE(written, kTestDataSize); | 280 EXPECT_LE(written, kTestDataSize); |
281 | 281 |
282 int read = client.Read(read_buf.get(), kReadBufSize, CompletionCallback()); | 282 int read = client.Read(read_buf.get(), kReadBufSize, CompletionCallback()); |
283 EXPECT_GT(read, 0); | 283 EXPECT_GT(read, 0); |
284 EXPECT_LE(read, written); | 284 EXPECT_LE(read, written); |
285 EXPECT_EQ(0, memcmp(kTestData, read_buf->data(), read)); | 285 EXPECT_EQ(0, memcmp(kTestData, read_buf->data(), read)); |
286 | 286 |
287 // Read then write. | 287 // Read then write. |
288 TestCompletionCallback callback; | 288 TestCompletionCallback callback; |
289 EXPECT_EQ(net::ERR_IO_PENDING, | 289 EXPECT_EQ(ERR_IO_PENDING, |
290 server.Read(read_buf.get(), kReadBufSize, callback.callback())); | 290 server.Read(read_buf.get(), kReadBufSize, callback.callback())); |
291 | 291 |
292 written = client.Write(write_buf.get(), kTestDataSize, CompletionCallback()); | 292 written = client.Write(write_buf.get(), kTestDataSize, CompletionCallback()); |
293 EXPECT_GT(written, 0); | 293 EXPECT_GT(written, 0); |
294 EXPECT_LE(written, kTestDataSize); | 294 EXPECT_LE(written, kTestDataSize); |
295 | 295 |
296 read = callback.WaitForResult(); | 296 read = callback.WaitForResult(); |
297 EXPECT_GT(read, 0); | 297 EXPECT_GT(read, 0); |
298 EXPECT_LE(read, written); | 298 EXPECT_LE(read, written); |
299 EXPECT_EQ(0, memcmp(kTestData, read_buf->data(), read)); | 299 EXPECT_EQ(0, memcmp(kTestData, read_buf->data(), read)); |
300 } | 300 } |
301 | 301 |
302 class SSLServerSocketTest : public PlatformTest { | 302 class SSLServerSocketTest : public PlatformTest { |
303 public: | 303 public: |
304 SSLServerSocketTest() | 304 SSLServerSocketTest() |
305 : socket_factory_(net::ClientSocketFactory::GetDefaultFactory()), | 305 : socket_factory_(ClientSocketFactory::GetDefaultFactory()), |
306 cert_verifier_(new MockCertVerifier()), | 306 cert_verifier_(new MockCertVerifier()), |
307 transport_security_state_(new TransportSecurityState) { | 307 transport_security_state_(new TransportSecurityState) { |
308 cert_verifier_->set_default_result(net::CERT_STATUS_AUTHORITY_INVALID); | 308 cert_verifier_->set_default_result(CERT_STATUS_AUTHORITY_INVALID); |
309 } | 309 } |
310 | 310 |
311 protected: | 311 protected: |
312 void Initialize() { | 312 void Initialize() { |
313 scoped_ptr<ClientSocketHandle> client_connection(new ClientSocketHandle); | 313 scoped_ptr<ClientSocketHandle> client_connection(new ClientSocketHandle); |
314 client_connection->SetSocket( | 314 client_connection->SetSocket( |
315 scoped_ptr<StreamSocket>(new FakeSocket(&channel_1_, &channel_2_))); | 315 scoped_ptr<StreamSocket>(new FakeSocket(&channel_1_, &channel_2_))); |
316 scoped_ptr<StreamSocket> server_socket( | 316 scoped_ptr<StreamSocket> server_socket( |
317 new FakeSocket(&channel_2_, &channel_1_)); | 317 new FakeSocket(&channel_2_, &channel_1_)); |
318 | 318 |
319 base::FilePath certs_dir(GetTestCertsDirectory()); | 319 base::FilePath certs_dir(GetTestCertsDirectory()); |
320 | 320 |
321 base::FilePath cert_path = certs_dir.AppendASCII("unittest.selfsigned.der"); | 321 base::FilePath cert_path = certs_dir.AppendASCII("unittest.selfsigned.der"); |
322 std::string cert_der; | 322 std::string cert_der; |
323 ASSERT_TRUE(base::ReadFileToString(cert_path, &cert_der)); | 323 ASSERT_TRUE(base::ReadFileToString(cert_path, &cert_der)); |
324 | 324 |
325 scoped_refptr<net::X509Certificate> cert = | 325 scoped_refptr<X509Certificate> cert = |
326 X509Certificate::CreateFromBytes(cert_der.data(), cert_der.size()); | 326 X509Certificate::CreateFromBytes(cert_der.data(), cert_der.size()); |
327 | 327 |
328 base::FilePath key_path = certs_dir.AppendASCII("unittest.key.bin"); | 328 base::FilePath key_path = certs_dir.AppendASCII("unittest.key.bin"); |
329 std::string key_string; | 329 std::string key_string; |
330 ASSERT_TRUE(base::ReadFileToString(key_path, &key_string)); | 330 ASSERT_TRUE(base::ReadFileToString(key_path, &key_string)); |
331 std::vector<uint8> key_vector( | 331 std::vector<uint8> key_vector( |
332 reinterpret_cast<const uint8*>(key_string.data()), | 332 reinterpret_cast<const uint8*>(key_string.data()), |
333 reinterpret_cast<const uint8*>(key_string.data() + | 333 reinterpret_cast<const uint8*>(key_string.data() + |
334 key_string.length())); | 334 key_string.length())); |
335 | 335 |
336 scoped_ptr<crypto::RSAPrivateKey> private_key( | 336 scoped_ptr<crypto::RSAPrivateKey> private_key( |
337 crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(key_vector)); | 337 crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(key_vector)); |
338 | 338 |
339 net::SSLConfig ssl_config; | 339 SSLConfig ssl_config; |
340 ssl_config.false_start_enabled = false; | 340 ssl_config.false_start_enabled = false; |
341 ssl_config.channel_id_enabled = false; | 341 ssl_config.channel_id_enabled = false; |
342 | 342 |
343 // Certificate provided by the host doesn't need authority. | 343 // Certificate provided by the host doesn't need authority. |
344 net::SSLConfig::CertAndStatus cert_and_status; | 344 SSLConfig::CertAndStatus cert_and_status; |
345 cert_and_status.cert_status = CERT_STATUS_AUTHORITY_INVALID; | 345 cert_and_status.cert_status = CERT_STATUS_AUTHORITY_INVALID; |
346 cert_and_status.der_cert = cert_der; | 346 cert_and_status.der_cert = cert_der; |
347 ssl_config.allowed_bad_certs.push_back(cert_and_status); | 347 ssl_config.allowed_bad_certs.push_back(cert_and_status); |
348 | 348 |
349 net::HostPortPair host_and_pair("unittest", 0); | 349 HostPortPair host_and_pair("unittest", 0); |
350 net::SSLClientSocketContext context; | 350 SSLClientSocketContext context; |
351 context.cert_verifier = cert_verifier_.get(); | 351 context.cert_verifier = cert_verifier_.get(); |
352 context.transport_security_state = transport_security_state_.get(); | 352 context.transport_security_state = transport_security_state_.get(); |
353 client_socket_ = | 353 client_socket_ = |
354 socket_factory_->CreateSSLClientSocket( | 354 socket_factory_->CreateSSLClientSocket( |
355 client_connection.Pass(), host_and_pair, ssl_config, context); | 355 client_connection.Pass(), host_and_pair, ssl_config, context); |
356 server_socket_ = net::CreateSSLServerSocket( | 356 server_socket_ = CreateSSLServerSocket( |
357 server_socket.Pass(), | 357 server_socket.Pass(), |
358 cert.get(), private_key.get(), net::SSLConfig()); | 358 cert.get(), private_key.get(), SSLConfig()); |
359 } | 359 } |
360 | 360 |
361 FakeDataChannel channel_1_; | 361 FakeDataChannel channel_1_; |
362 FakeDataChannel channel_2_; | 362 FakeDataChannel channel_2_; |
363 scoped_ptr<net::SSLClientSocket> client_socket_; | 363 scoped_ptr<SSLClientSocket> client_socket_; |
364 scoped_ptr<net::SSLServerSocket> server_socket_; | 364 scoped_ptr<SSLServerSocket> server_socket_; |
365 net::ClientSocketFactory* socket_factory_; | 365 ClientSocketFactory* socket_factory_; |
366 scoped_ptr<net::MockCertVerifier> cert_verifier_; | 366 scoped_ptr<MockCertVerifier> cert_verifier_; |
367 scoped_ptr<net::TransportSecurityState> transport_security_state_; | 367 scoped_ptr<TransportSecurityState> transport_security_state_; |
368 }; | 368 }; |
369 | 369 |
370 // This test only executes creation of client and server sockets. This is to | 370 // This test only executes creation of client and server sockets. This is to |
371 // test that creation of sockets doesn't crash and have minimal code to run | 371 // test that creation of sockets doesn't crash and have minimal code to run |
372 // under valgrind in order to help debugging memory problems. | 372 // under valgrind in order to help debugging memory problems. |
373 TEST_F(SSLServerSocketTest, Initialize) { | 373 TEST_F(SSLServerSocketTest, Initialize) { |
374 Initialize(); | 374 Initialize(); |
375 } | 375 } |
376 | 376 |
377 // This test executes Connect() on SSLClientSocket and Handshake() on | 377 // This test executes Connect() on SSLClientSocket and Handshake() on |
378 // SSLServerSocket to make sure handshaking between the two sockets is | 378 // SSLServerSocket to make sure handshaking between the two sockets is |
379 // completed successfully. | 379 // completed successfully. |
380 TEST_F(SSLServerSocketTest, Handshake) { | 380 TEST_F(SSLServerSocketTest, Handshake) { |
381 Initialize(); | 381 Initialize(); |
382 | 382 |
383 TestCompletionCallback connect_callback; | 383 TestCompletionCallback connect_callback; |
384 TestCompletionCallback handshake_callback; | 384 TestCompletionCallback handshake_callback; |
385 | 385 |
386 int server_ret = server_socket_->Handshake(handshake_callback.callback()); | 386 int server_ret = server_socket_->Handshake(handshake_callback.callback()); |
387 EXPECT_TRUE(server_ret == net::OK || server_ret == net::ERR_IO_PENDING); | 387 EXPECT_TRUE(server_ret == OK || server_ret == ERR_IO_PENDING); |
388 | 388 |
389 int client_ret = client_socket_->Connect(connect_callback.callback()); | 389 int client_ret = client_socket_->Connect(connect_callback.callback()); |
390 EXPECT_TRUE(client_ret == net::OK || client_ret == net::ERR_IO_PENDING); | 390 EXPECT_TRUE(client_ret == OK || client_ret == ERR_IO_PENDING); |
391 | 391 |
392 if (client_ret == net::ERR_IO_PENDING) { | 392 if (client_ret == ERR_IO_PENDING) { |
393 EXPECT_EQ(net::OK, connect_callback.WaitForResult()); | 393 EXPECT_EQ(OK, connect_callback.WaitForResult()); |
394 } | 394 } |
395 if (server_ret == net::ERR_IO_PENDING) { | 395 if (server_ret == ERR_IO_PENDING) { |
396 EXPECT_EQ(net::OK, handshake_callback.WaitForResult()); | 396 EXPECT_EQ(OK, handshake_callback.WaitForResult()); |
397 } | 397 } |
398 | 398 |
399 // Make sure the cert status is expected. | 399 // Make sure the cert status is expected. |
400 SSLInfo ssl_info; | 400 SSLInfo ssl_info; |
401 client_socket_->GetSSLInfo(&ssl_info); | 401 client_socket_->GetSSLInfo(&ssl_info); |
402 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, ssl_info.cert_status); | 402 EXPECT_EQ(CERT_STATUS_AUTHORITY_INVALID, ssl_info.cert_status); |
403 } | 403 } |
404 | 404 |
405 TEST_F(SSLServerSocketTest, DataTransfer) { | 405 TEST_F(SSLServerSocketTest, DataTransfer) { |
406 Initialize(); | 406 Initialize(); |
407 | 407 |
408 TestCompletionCallback connect_callback; | 408 TestCompletionCallback connect_callback; |
409 TestCompletionCallback handshake_callback; | 409 TestCompletionCallback handshake_callback; |
410 | 410 |
411 // Establish connection. | 411 // Establish connection. |
412 int client_ret = client_socket_->Connect(connect_callback.callback()); | 412 int client_ret = client_socket_->Connect(connect_callback.callback()); |
413 ASSERT_TRUE(client_ret == net::OK || client_ret == net::ERR_IO_PENDING); | 413 ASSERT_TRUE(client_ret == OK || client_ret == ERR_IO_PENDING); |
414 | 414 |
415 int server_ret = server_socket_->Handshake(handshake_callback.callback()); | 415 int server_ret = server_socket_->Handshake(handshake_callback.callback()); |
416 ASSERT_TRUE(server_ret == net::OK || server_ret == net::ERR_IO_PENDING); | 416 ASSERT_TRUE(server_ret == OK || server_ret == ERR_IO_PENDING); |
417 | 417 |
418 client_ret = connect_callback.GetResult(client_ret); | 418 client_ret = connect_callback.GetResult(client_ret); |
419 ASSERT_EQ(net::OK, client_ret); | 419 ASSERT_EQ(OK, client_ret); |
420 server_ret = handshake_callback.GetResult(server_ret); | 420 server_ret = handshake_callback.GetResult(server_ret); |
421 ASSERT_EQ(net::OK, server_ret); | 421 ASSERT_EQ(OK, server_ret); |
422 | 422 |
423 const int kReadBufSize = 1024; | 423 const int kReadBufSize = 1024; |
424 scoped_refptr<net::StringIOBuffer> write_buf = | 424 scoped_refptr<StringIOBuffer> write_buf = |
425 new net::StringIOBuffer("testing123"); | 425 new StringIOBuffer("testing123"); |
426 scoped_refptr<net::DrainableIOBuffer> read_buf = | 426 scoped_refptr<DrainableIOBuffer> read_buf = |
427 new net::DrainableIOBuffer(new net::IOBuffer(kReadBufSize), | 427 new DrainableIOBuffer(new IOBuffer(kReadBufSize), kReadBufSize); |
428 kReadBufSize); | |
429 | 428 |
430 // Write then read. | 429 // Write then read. |
431 TestCompletionCallback write_callback; | 430 TestCompletionCallback write_callback; |
432 TestCompletionCallback read_callback; | 431 TestCompletionCallback read_callback; |
433 server_ret = server_socket_->Write( | 432 server_ret = server_socket_->Write( |
434 write_buf.get(), write_buf->size(), write_callback.callback()); | 433 write_buf.get(), write_buf->size(), write_callback.callback()); |
435 EXPECT_TRUE(server_ret > 0 || server_ret == net::ERR_IO_PENDING); | 434 EXPECT_TRUE(server_ret > 0 || server_ret == ERR_IO_PENDING); |
436 client_ret = client_socket_->Read( | 435 client_ret = client_socket_->Read( |
437 read_buf.get(), read_buf->BytesRemaining(), read_callback.callback()); | 436 read_buf.get(), read_buf->BytesRemaining(), read_callback.callback()); |
438 EXPECT_TRUE(client_ret > 0 || client_ret == net::ERR_IO_PENDING); | 437 EXPECT_TRUE(client_ret > 0 || client_ret == ERR_IO_PENDING); |
439 | 438 |
440 server_ret = write_callback.GetResult(server_ret); | 439 server_ret = write_callback.GetResult(server_ret); |
441 EXPECT_GT(server_ret, 0); | 440 EXPECT_GT(server_ret, 0); |
442 client_ret = read_callback.GetResult(client_ret); | 441 client_ret = read_callback.GetResult(client_ret); |
443 ASSERT_GT(client_ret, 0); | 442 ASSERT_GT(client_ret, 0); |
444 | 443 |
445 read_buf->DidConsume(client_ret); | 444 read_buf->DidConsume(client_ret); |
446 while (read_buf->BytesConsumed() < write_buf->size()) { | 445 while (read_buf->BytesConsumed() < write_buf->size()) { |
447 client_ret = client_socket_->Read( | 446 client_ret = client_socket_->Read( |
448 read_buf.get(), read_buf->BytesRemaining(), read_callback.callback()); | 447 read_buf.get(), read_buf->BytesRemaining(), read_callback.callback()); |
449 EXPECT_TRUE(client_ret > 0 || client_ret == net::ERR_IO_PENDING); | 448 EXPECT_TRUE(client_ret > 0 || client_ret == ERR_IO_PENDING); |
450 client_ret = read_callback.GetResult(client_ret); | 449 client_ret = read_callback.GetResult(client_ret); |
451 ASSERT_GT(client_ret, 0); | 450 ASSERT_GT(client_ret, 0); |
452 read_buf->DidConsume(client_ret); | 451 read_buf->DidConsume(client_ret); |
453 } | 452 } |
454 EXPECT_EQ(write_buf->size(), read_buf->BytesConsumed()); | 453 EXPECT_EQ(write_buf->size(), read_buf->BytesConsumed()); |
455 read_buf->SetOffset(0); | 454 read_buf->SetOffset(0); |
456 EXPECT_EQ(0, memcmp(write_buf->data(), read_buf->data(), write_buf->size())); | 455 EXPECT_EQ(0, memcmp(write_buf->data(), read_buf->data(), write_buf->size())); |
457 | 456 |
458 // Read then write. | 457 // Read then write. |
459 write_buf = new net::StringIOBuffer("hello123"); | 458 write_buf = new StringIOBuffer("hello123"); |
460 server_ret = server_socket_->Read( | 459 server_ret = server_socket_->Read( |
461 read_buf.get(), read_buf->BytesRemaining(), read_callback.callback()); | 460 read_buf.get(), read_buf->BytesRemaining(), read_callback.callback()); |
462 EXPECT_TRUE(server_ret > 0 || server_ret == net::ERR_IO_PENDING); | 461 EXPECT_TRUE(server_ret > 0 || server_ret == ERR_IO_PENDING); |
463 client_ret = client_socket_->Write( | 462 client_ret = client_socket_->Write( |
464 write_buf.get(), write_buf->size(), write_callback.callback()); | 463 write_buf.get(), write_buf->size(), write_callback.callback()); |
465 EXPECT_TRUE(client_ret > 0 || client_ret == net::ERR_IO_PENDING); | 464 EXPECT_TRUE(client_ret > 0 || client_ret == ERR_IO_PENDING); |
466 | 465 |
467 server_ret = read_callback.GetResult(server_ret); | 466 server_ret = read_callback.GetResult(server_ret); |
468 ASSERT_GT(server_ret, 0); | 467 ASSERT_GT(server_ret, 0); |
469 client_ret = write_callback.GetResult(client_ret); | 468 client_ret = write_callback.GetResult(client_ret); |
470 EXPECT_GT(client_ret, 0); | 469 EXPECT_GT(client_ret, 0); |
471 | 470 |
472 read_buf->DidConsume(server_ret); | 471 read_buf->DidConsume(server_ret); |
473 while (read_buf->BytesConsumed() < write_buf->size()) { | 472 while (read_buf->BytesConsumed() < write_buf->size()) { |
474 server_ret = server_socket_->Read( | 473 server_ret = server_socket_->Read( |
475 read_buf.get(), read_buf->BytesRemaining(), read_callback.callback()); | 474 read_buf.get(), read_buf->BytesRemaining(), read_callback.callback()); |
476 EXPECT_TRUE(server_ret > 0 || server_ret == net::ERR_IO_PENDING); | 475 EXPECT_TRUE(server_ret > 0 || server_ret == ERR_IO_PENDING); |
477 server_ret = read_callback.GetResult(server_ret); | 476 server_ret = read_callback.GetResult(server_ret); |
478 ASSERT_GT(server_ret, 0); | 477 ASSERT_GT(server_ret, 0); |
479 read_buf->DidConsume(server_ret); | 478 read_buf->DidConsume(server_ret); |
480 } | 479 } |
481 EXPECT_EQ(write_buf->size(), read_buf->BytesConsumed()); | 480 EXPECT_EQ(write_buf->size(), read_buf->BytesConsumed()); |
482 read_buf->SetOffset(0); | 481 read_buf->SetOffset(0); |
483 EXPECT_EQ(0, memcmp(write_buf->data(), read_buf->data(), write_buf->size())); | 482 EXPECT_EQ(0, memcmp(write_buf->data(), read_buf->data(), write_buf->size())); |
484 } | 483 } |
485 | 484 |
486 // A regression test for bug 127822 (http://crbug.com/127822). | 485 // A regression test for bug 127822 (http://crbug.com/127822). |
487 // If the server closes the connection after the handshake is finished, | 486 // If the server closes the connection after the handshake is finished, |
488 // the client's Write() call should not cause an infinite loop. | 487 // the client's Write() call should not cause an infinite loop. |
489 // NOTE: this is a test for SSLClientSocket rather than SSLServerSocket. | 488 // NOTE: this is a test for SSLClientSocket rather than SSLServerSocket. |
490 TEST_F(SSLServerSocketTest, ClientWriteAfterServerClose) { | 489 TEST_F(SSLServerSocketTest, ClientWriteAfterServerClose) { |
491 Initialize(); | 490 Initialize(); |
492 | 491 |
493 TestCompletionCallback connect_callback; | 492 TestCompletionCallback connect_callback; |
494 TestCompletionCallback handshake_callback; | 493 TestCompletionCallback handshake_callback; |
495 | 494 |
496 // Establish connection. | 495 // Establish connection. |
497 int client_ret = client_socket_->Connect(connect_callback.callback()); | 496 int client_ret = client_socket_->Connect(connect_callback.callback()); |
498 ASSERT_TRUE(client_ret == net::OK || client_ret == net::ERR_IO_PENDING); | 497 ASSERT_TRUE(client_ret == OK || client_ret == ERR_IO_PENDING); |
499 | 498 |
500 int server_ret = server_socket_->Handshake(handshake_callback.callback()); | 499 int server_ret = server_socket_->Handshake(handshake_callback.callback()); |
501 ASSERT_TRUE(server_ret == net::OK || server_ret == net::ERR_IO_PENDING); | 500 ASSERT_TRUE(server_ret == OK || server_ret == ERR_IO_PENDING); |
502 | 501 |
503 client_ret = connect_callback.GetResult(client_ret); | 502 client_ret = connect_callback.GetResult(client_ret); |
504 ASSERT_EQ(net::OK, client_ret); | 503 ASSERT_EQ(OK, client_ret); |
505 server_ret = handshake_callback.GetResult(server_ret); | 504 server_ret = handshake_callback.GetResult(server_ret); |
506 ASSERT_EQ(net::OK, server_ret); | 505 ASSERT_EQ(OK, server_ret); |
507 | 506 |
508 scoped_refptr<net::StringIOBuffer> write_buf = | 507 scoped_refptr<StringIOBuffer> write_buf = new StringIOBuffer("testing123"); |
509 new net::StringIOBuffer("testing123"); | |
510 | 508 |
511 // The server closes the connection. The server needs to write some | 509 // The server closes the connection. The server needs to write some |
512 // data first so that the client's Read() calls from the transport | 510 // data first so that the client's Read() calls from the transport |
513 // socket won't return ERR_IO_PENDING. This ensures that the client | 511 // socket won't return ERR_IO_PENDING. This ensures that the client |
514 // will call Read() on the transport socket again. | 512 // will call Read() on the transport socket again. |
515 TestCompletionCallback write_callback; | 513 TestCompletionCallback write_callback; |
516 | 514 |
517 server_ret = server_socket_->Write( | 515 server_ret = server_socket_->Write( |
518 write_buf.get(), write_buf->size(), write_callback.callback()); | 516 write_buf.get(), write_buf->size(), write_callback.callback()); |
519 EXPECT_TRUE(server_ret > 0 || server_ret == net::ERR_IO_PENDING); | 517 EXPECT_TRUE(server_ret > 0 || server_ret == ERR_IO_PENDING); |
520 | 518 |
521 server_ret = write_callback.GetResult(server_ret); | 519 server_ret = write_callback.GetResult(server_ret); |
522 EXPECT_GT(server_ret, 0); | 520 EXPECT_GT(server_ret, 0); |
523 | 521 |
524 server_socket_->Disconnect(); | 522 server_socket_->Disconnect(); |
525 | 523 |
526 // The client writes some data. This should not cause an infinite loop. | 524 // The client writes some data. This should not cause an infinite loop. |
527 client_ret = client_socket_->Write( | 525 client_ret = client_socket_->Write( |
528 write_buf.get(), write_buf->size(), write_callback.callback()); | 526 write_buf.get(), write_buf->size(), write_callback.callback()); |
529 EXPECT_TRUE(client_ret > 0 || client_ret == net::ERR_IO_PENDING); | 527 EXPECT_TRUE(client_ret > 0 || client_ret == ERR_IO_PENDING); |
530 | 528 |
531 client_ret = write_callback.GetResult(client_ret); | 529 client_ret = write_callback.GetResult(client_ret); |
532 EXPECT_GT(client_ret, 0); | 530 EXPECT_GT(client_ret, 0); |
533 | 531 |
534 base::MessageLoop::current()->PostDelayedTask( | 532 base::MessageLoop::current()->PostDelayedTask( |
535 FROM_HERE, base::MessageLoop::QuitClosure(), | 533 FROM_HERE, base::MessageLoop::QuitClosure(), |
536 base::TimeDelta::FromMilliseconds(10)); | 534 base::TimeDelta::FromMilliseconds(10)); |
537 base::MessageLoop::current()->Run(); | 535 base::MessageLoop::current()->Run(); |
538 } | 536 } |
539 | 537 |
540 // This test executes ExportKeyingMaterial() on the client and server sockets, | 538 // This test executes ExportKeyingMaterial() on the client and server sockets, |
541 // after connecting them, and verifies that the results match. | 539 // after connecting them, and verifies that the results match. |
542 // This test will fail if False Start is enabled (see crbug.com/90208). | 540 // This test will fail if False Start is enabled (see crbug.com/90208). |
543 TEST_F(SSLServerSocketTest, ExportKeyingMaterial) { | 541 TEST_F(SSLServerSocketTest, ExportKeyingMaterial) { |
544 Initialize(); | 542 Initialize(); |
545 | 543 |
546 TestCompletionCallback connect_callback; | 544 TestCompletionCallback connect_callback; |
547 TestCompletionCallback handshake_callback; | 545 TestCompletionCallback handshake_callback; |
548 | 546 |
549 int client_ret = client_socket_->Connect(connect_callback.callback()); | 547 int client_ret = client_socket_->Connect(connect_callback.callback()); |
550 ASSERT_TRUE(client_ret == net::OK || client_ret == net::ERR_IO_PENDING); | 548 ASSERT_TRUE(client_ret == OK || client_ret == ERR_IO_PENDING); |
551 | 549 |
552 int server_ret = server_socket_->Handshake(handshake_callback.callback()); | 550 int server_ret = server_socket_->Handshake(handshake_callback.callback()); |
553 ASSERT_TRUE(server_ret == net::OK || server_ret == net::ERR_IO_PENDING); | 551 ASSERT_TRUE(server_ret == OK || server_ret == ERR_IO_PENDING); |
554 | 552 |
555 if (client_ret == net::ERR_IO_PENDING) { | 553 if (client_ret == ERR_IO_PENDING) { |
556 ASSERT_EQ(net::OK, connect_callback.WaitForResult()); | 554 ASSERT_EQ(OK, connect_callback.WaitForResult()); |
557 } | 555 } |
558 if (server_ret == net::ERR_IO_PENDING) { | 556 if (server_ret == ERR_IO_PENDING) { |
559 ASSERT_EQ(net::OK, handshake_callback.WaitForResult()); | 557 ASSERT_EQ(OK, handshake_callback.WaitForResult()); |
560 } | 558 } |
561 | 559 |
562 const int kKeyingMaterialSize = 32; | 560 const int kKeyingMaterialSize = 32; |
563 const char* kKeyingLabel = "EXPERIMENTAL-server-socket-test"; | 561 const char* kKeyingLabel = "EXPERIMENTAL-server-socket-test"; |
564 const char* kKeyingContext = ""; | 562 const char* kKeyingContext = ""; |
565 unsigned char server_out[kKeyingMaterialSize]; | 563 unsigned char server_out[kKeyingMaterialSize]; |
566 int rv = server_socket_->ExportKeyingMaterial(kKeyingLabel, | 564 int rv = server_socket_->ExportKeyingMaterial(kKeyingLabel, |
567 false, kKeyingContext, | 565 false, kKeyingContext, |
568 server_out, sizeof(server_out)); | 566 server_out, sizeof(server_out)); |
569 ASSERT_EQ(net::OK, rv); | 567 ASSERT_EQ(OK, rv); |
570 | 568 |
571 unsigned char client_out[kKeyingMaterialSize]; | 569 unsigned char client_out[kKeyingMaterialSize]; |
572 rv = client_socket_->ExportKeyingMaterial(kKeyingLabel, | 570 rv = client_socket_->ExportKeyingMaterial(kKeyingLabel, |
573 false, kKeyingContext, | 571 false, kKeyingContext, |
574 client_out, sizeof(client_out)); | 572 client_out, sizeof(client_out)); |
575 ASSERT_EQ(net::OK, rv); | 573 ASSERT_EQ(OK, rv); |
576 EXPECT_EQ(0, memcmp(server_out, client_out, sizeof(server_out))); | 574 EXPECT_EQ(0, memcmp(server_out, client_out, sizeof(server_out))); |
577 | 575 |
578 const char* kKeyingLabelBad = "EXPERIMENTAL-server-socket-test-bad"; | 576 const char* kKeyingLabelBad = "EXPERIMENTAL-server-socket-test-bad"; |
579 unsigned char client_bad[kKeyingMaterialSize]; | 577 unsigned char client_bad[kKeyingMaterialSize]; |
580 rv = client_socket_->ExportKeyingMaterial(kKeyingLabelBad, | 578 rv = client_socket_->ExportKeyingMaterial(kKeyingLabelBad, |
581 false, kKeyingContext, | 579 false, kKeyingContext, |
582 client_bad, sizeof(client_bad)); | 580 client_bad, sizeof(client_bad)); |
583 ASSERT_EQ(rv, net::OK); | 581 ASSERT_EQ(rv, OK); |
584 EXPECT_NE(0, memcmp(server_out, client_bad, sizeof(server_out))); | 582 EXPECT_NE(0, memcmp(server_out, client_bad, sizeof(server_out))); |
585 } | 583 } |
586 | 584 |
587 } // namespace net | 585 } // namespace net |
OLD | NEW |