| 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 |