Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(82)

Side by Side Diff: net/socket/ssl_client_socket_unittest.cc

Issue 446623004: This CL adds unit tests for false start connections. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@sslcallback
Patch Set: Rewrote false start failure test such that failure occurs during read of server's second leg. Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "net/socket/ssl_client_socket.h" 5 #include "net/socket/ssl_client_socket.h"
6 6
7 #include "base/callback_helpers.h" 7 #include "base/callback_helpers.h"
8 #include "base/memory/ref_counted.h" 8 #include "base/memory/ref_counted.h"
9 #include "base/run_loop.h" 9 #include "base/run_loop.h"
10 #include "base/time/time.h" 10 #include "base/time/time.h"
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after
351 // underlying transport until UnblockWrite() has been called. Note: if there 351 // underlying transport until UnblockWrite() has been called. Note: if there
352 // is a pending asynchronous write, it is NOT blocked. For purposes of 352 // is a pending asynchronous write, it is NOT blocked. For purposes of
353 // blocking writes, data is considered to have reached the underlying 353 // blocking writes, data is considered to have reached the underlying
354 // transport as soon as Write() is called. 354 // transport as soon as Write() is called.
355 void BlockWrite(); 355 void BlockWrite();
356 void UnblockWrite(); 356 void UnblockWrite();
357 357
358 // Waits for the blocked Write() call to be scheduled. 358 // Waits for the blocked Write() call to be scheduled.
359 void WaitForWrite(); 359 void WaitForWrite();
360 360
361 // Returns the wrapped stream socket.
362 StreamSocket* transport() { return transport_.get(); }
363
361 private: 364 private:
362 // Handles completion from the underlying transport read. 365 // Handles completion from the underlying transport read.
363 void OnReadCompleted(int result); 366 void OnReadCompleted(int result);
364 367
365 // True if read callbacks are blocked. 368 // True if read callbacks are blocked.
366 bool should_block_read_; 369 bool should_block_read_;
367 370
368 // The user callback for the pending read call. 371 // The user callback for the pending read call.
369 CompletionCallback pending_read_callback_; 372 CompletionCallback pending_read_callback_;
370 373
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after
789 sock->Disconnect(); 792 sock->Disconnect();
790 EXPECT_FALSE(sock->IsConnected()); 793 EXPECT_FALSE(sock->IsConnected());
791 EXPECT_TRUE( 794 EXPECT_TRUE(
792 test_server.host_port_pair().Equals(request_info->host_and_port)); 795 test_server.host_port_pair().Equals(request_info->host_and_port));
793 796
794 return request_info; 797 return request_info;
795 } 798 }
796 }; 799 };
797 800
798 class SSLClientSocketFalseStartTest : public SSLClientSocketTest { 801 class SSLClientSocketFalseStartTest : public SSLClientSocketTest {
802 public:
803 SSLClientSocketFalseStartTest()
804 : monitor_handshake_callback_(false), expect_false_start_error_(false) {}
805
799 protected: 806 protected:
800 // Creates an SSLClientSocket with |client_config| attached to a 807 // Creates an SSLClientSocket with |client_config| attached to a
801 // FakeBlockingStreamSocket, returning both in |*out_raw_transport| and 808 // FakeBlockingStreamSocket, returning both in |*out_raw_transport| and
802 // |*out_sock|. The FakeBlockingStreamSocket is owned by the SSLClientSocket, 809 // |*out_sock|. The FakeBlockingStreamSocket is owned by the SSLClientSocket,
803 // so |*out_raw_transport| is a raw pointer. 810 // so |*out_raw_transport| is a raw pointer.
804 // 811 //
805 // The client socket will begin a connect using |callback| but stop before the 812 // The client socket will begin a connect using |callback| but stop before the
806 // server's finished message is received. The finished message will be blocked 813 // server's finished message is received. The finished message will be blocked
807 // in |*out_raw_transport|. To complete the handshake and successfully read 814 // in |*out_raw_transport|. To complete the handshake and successfully read
808 // data, the caller must unblock reads on |*out_raw_transport|. (Note that, if 815 // data, the caller must unblock reads on |*out_raw_transport|. (Note that, if
809 // the client successfully false started, |callback.WaitForResult()| will 816 // the client successfully false started, |callback.WaitForResult()| will
810 // return OK without unblocking transport reads. But Read() will still block.) 817 // return OK without unblocking transport reads. But Read() will still block.)
811 // 818 //
812 // Must be called after StartTestServer is called. 819 // Must be called after StartTestServer is called.
813 void CreateAndConnectUntilServerFinishedReceived( 820 void CreateAndConnectUntilServerFinishedReceived(
814 const SSLConfig& client_config, 821 const SSLConfig& client_config,
815 TestCompletionCallback* callback, 822 TestCompletionCallback* callback,
816 FakeBlockingStreamSocket** out_raw_transport, 823 FakeBlockingStreamSocket** out_raw_transport,
824 scoped_ptr<StreamSocket> real_transport,
davidben 2014/08/07 21:24:19 Nit: Switch the order of out_raw_transport and rea
817 scoped_ptr<SSLClientSocket>* out_sock) { 825 scoped_ptr<SSLClientSocket>* out_sock) {
818 CHECK(test_server()); 826 CHECK(test_server());
819 827
820 scoped_ptr<StreamSocket> real_transport(
821 new TCPClientSocket(addr(), NULL, NetLog::Source()));
822 scoped_ptr<FakeBlockingStreamSocket> transport( 828 scoped_ptr<FakeBlockingStreamSocket> transport(
823 new FakeBlockingStreamSocket(real_transport.Pass())); 829 new FakeBlockingStreamSocket(real_transport.Pass()));
824 int rv = callback->GetResult(transport->Connect(callback->callback())); 830 int rv = callback->GetResult(transport->Connect(callback->callback()));
825 EXPECT_EQ(OK, rv); 831 EXPECT_EQ(OK, rv);
826 832
827 FakeBlockingStreamSocket* raw_transport = transport.get(); 833 FakeBlockingStreamSocket* raw_transport = transport.get();
828 scoped_ptr<SSLClientSocket> sock = 834 scoped_ptr<SSLClientSocket> sock =
829 CreateSSLClientSocket(transport.PassAs<StreamSocket>(), 835 CreateSSLClientSocket(transport.PassAs<StreamSocket>(),
830 test_server()->host_port_pair(), 836 test_server()->host_port_pair(),
831 client_config); 837 client_config);
832 838
839 if (monitor_handshake_callback_) {
840 sock->SetHandshakeCompletionCallback(
841 base::Bind(&SSLClientSocketTest::RecordCompletedHandshake,
842 base::Unretained(this)));
843 }
844
833 // Connect. Stop before the client processes the first server leg 845 // Connect. Stop before the client processes the first server leg
834 // (ServerHello, etc.) 846 // (ServerHello, etc.)
835 raw_transport->BlockReadResult(); 847 raw_transport->BlockReadResult();
836 rv = sock->Connect(callback->callback()); 848 rv = sock->Connect(callback->callback());
837 EXPECT_EQ(ERR_IO_PENDING, rv); 849 EXPECT_EQ(ERR_IO_PENDING, rv);
838 raw_transport->WaitForReadResult(); 850 raw_transport->WaitForReadResult();
839 851
840 // Release the ServerHello and wait for the client to write 852 // Release the ServerHello and wait for the client to write
841 // ClientKeyExchange, etc. (A proxy for waiting for the entirety of the 853 // ClientKeyExchange, etc. (A proxy for waiting for the entirety of the
842 // server's leg to complete, since it may span multiple reads.) 854 // server's leg to complete, since it may span multiple reads.)
843 EXPECT_FALSE(callback->have_result()); 855 EXPECT_FALSE(callback->have_result());
844 raw_transport->BlockWrite(); 856 raw_transport->BlockWrite();
845 raw_transport->UnblockReadResult(); 857 raw_transport->UnblockReadResult();
846 raw_transport->WaitForWrite(); 858 raw_transport->WaitForWrite();
847 859
860 if (expect_false_start_error_) {
davidben 2014/08/07 21:24:19 So this is a little odd in that, if |expect_false_
861 SynchronousErrorStreamSocket* error_socket =
862 static_cast<SynchronousErrorStreamSocket*>(
863 raw_transport->transport());
864 error_socket->SetNextReadError(ERR_CONNECTION_RESET);
865 }
848 // And, finally, release that and block the next server leg 866 // And, finally, release that and block the next server leg
849 // (ChangeCipherSpec, Finished). 867 // (ChangeCipherSpec, Finished).
850 raw_transport->BlockReadResult(); 868 raw_transport->BlockReadResult();
851 raw_transport->UnblockWrite(); 869 raw_transport->UnblockWrite();
852 870
853 *out_raw_transport = raw_transport; 871 *out_raw_transport = raw_transport;
854 *out_sock = sock.Pass(); 872 *out_sock = sock.Pass();
855 } 873 }
856 874
857 void TestFalseStart(const SpawnedTestServer::SSLOptions& server_options, 875 void TestFalseStart(const SpawnedTestServer::SSLOptions& server_options,
858 const SSLConfig& client_config, 876 const SSLConfig& client_config,
859 bool expect_false_start) { 877 bool expect_false_start) {
860 ASSERT_TRUE(StartTestServer(server_options)); 878 ASSERT_TRUE(StartTestServer(server_options));
861 879
862 TestCompletionCallback callback; 880 TestCompletionCallback callback;
863 FakeBlockingStreamSocket* raw_transport = NULL; 881 FakeBlockingStreamSocket* raw_transport = NULL;
864 scoped_ptr<SSLClientSocket> sock; 882 scoped_ptr<SSLClientSocket> sock;
865 ASSERT_NO_FATAL_FAILURE(CreateAndConnectUntilServerFinishedReceived( 883 scoped_ptr<StreamSocket> real_transport = scoped_ptr<StreamSocket>(
866 client_config, &callback, &raw_transport, &sock)); 884 new TCPClientSocket(addr(), NULL, NetLog::Source()));
885 if (expect_false_start_error_)
886 real_transport.reset(
887 new SynchronousErrorStreamSocket(real_transport.Pass()));
888
889 ASSERT_NO_FATAL_FAILURE(
890 CreateAndConnectUntilServerFinishedReceived(client_config,
891 &callback,
892 &raw_transport,
893 real_transport.Pass(),
894 &sock));
867 895
868 if (expect_false_start) { 896 if (expect_false_start) {
869 // When False Starting, the handshake should complete before receiving the 897 // When False Starting, the handshake should complete before receiving the
870 // Change Cipher Spec and Finished messages. 898 // Change Cipher Spec and Finished messages.
871 // 899 //
872 // Note: callback.have_result() may not be true without waiting. The NSS 900 // Note: callback.have_result() may not be true without waiting. The NSS
873 // state machine sometimes lives on a separate thread, so this thread may 901 // state machine sometimes lives on a separate thread, so this thread may
874 // not yet have processed the signal that the handshake has completed. 902 // not yet have processed the signal that the handshake has completed.
875 int rv = callback.WaitForResult(); 903 int rv = callback.WaitForResult();
876 EXPECT_EQ(OK, rv); 904 EXPECT_EQ(OK, rv);
(...skipping 12 matching lines...) Expand all
889 EXPECT_EQ(kRequestTextSize, rv); 917 EXPECT_EQ(kRequestTextSize, rv);
890 918
891 // The read will hang; it's waiting for the peer to complete the 919 // The read will hang; it's waiting for the peer to complete the
892 // handshake, and the handshake is still blocked. 920 // handshake, and the handshake is still blocked.
893 scoped_refptr<IOBuffer> buf(new IOBuffer(4096)); 921 scoped_refptr<IOBuffer> buf(new IOBuffer(4096));
894 rv = sock->Read(buf.get(), 4096, callback.callback()); 922 rv = sock->Read(buf.get(), 4096, callback.callback());
895 923
896 // After releasing reads, the connection proceeds. 924 // After releasing reads, the connection proceeds.
897 raw_transport->UnblockReadResult(); 925 raw_transport->UnblockReadResult();
898 rv = callback.GetResult(rv); 926 rv = callback.GetResult(rv);
899 EXPECT_LT(0, rv); 927 if (expect_false_start_error_)
928 EXPECT_EQ(ERR_CONNECTION_RESET, rv);
929 else
930 EXPECT_LT(0, rv);
900 } else { 931 } else {
901 // False Start is not enabled, so the handshake will not complete because 932 // False Start is not enabled, so the handshake will not complete because
902 // the server second leg is blocked. 933 // the server second leg is blocked.
903 base::RunLoop().RunUntilIdle(); 934 base::RunLoop().RunUntilIdle();
904 EXPECT_FALSE(callback.have_result()); 935 EXPECT_FALSE(callback.have_result());
905 } 936 }
906 } 937 }
938
939 // Indicates that the socket's handshake completion callback should
940 // be monitored.
941 bool monitor_handshake_callback_;
942 // Indicates that this test's handshake should fail after the client
943 // "finished" message is sent.
944 bool expect_false_start_error_;
907 }; 945 };
908 946
909 class SSLClientSocketChannelIDTest : public SSLClientSocketTest { 947 class SSLClientSocketChannelIDTest : public SSLClientSocketTest {
910 protected: 948 protected:
911 void EnableChannelID() { 949 void EnableChannelID() {
912 channel_id_service_.reset( 950 channel_id_service_.reset(
913 new ChannelIDService(new DefaultChannelIDStore(NULL), 951 new ChannelIDService(new DefaultChannelIDStore(NULL),
914 base::MessageLoopProxy::current())); 952 base::MessageLoopProxy::current()));
915 context_.channel_id_service = channel_id_service_.get(); 953 context_.channel_id_service = channel_id_service_.get();
916 } 954 }
(...skipping 1846 matching lines...) Expand 10 before | Expand all | Expand 10 after
2763 2801
2764 if (sock->IsConnected()) 2802 if (sock->IsConnected())
2765 LOG(ERROR) << "SSL Socket prematurely connected"; 2803 LOG(ERROR) << "SSL Socket prematurely connected";
2766 2804
2767 rv = callback.GetResult(sock->Connect(callback.callback())); 2805 rv = callback.GetResult(sock->Connect(callback.callback()));
2768 2806
2769 EXPECT_EQ(OK, rv); 2807 EXPECT_EQ(OK, rv);
2770 EXPECT_TRUE(sock->IsConnected()); 2808 EXPECT_TRUE(sock->IsConnected());
2771 EXPECT_TRUE(ran_handshake_completion_callback_); 2809 EXPECT_TRUE(ran_handshake_completion_callback_);
2772 } 2810 }
2811
2812 TEST_F(SSLClientSocketFalseStartTest,
2813 HandshakeCallbackIsRun_WithFalseStartFailure) {
2814 // False Start requires NPN and a forward-secret cipher suite.
2815 SpawnedTestServer::SSLOptions server_options;
2816 server_options.key_exchanges =
2817 SpawnedTestServer::SSLOptions::KEY_EXCHANGE_DHE_RSA;
2818 server_options.enable_npn = true;
2819 SSLConfig client_config;
2820 client_config.next_protos.push_back("http/1.1");
2821 monitor_handshake_callback_ = true;
2822 expect_false_start_error_ = true;
2823 ASSERT_NO_FATAL_FAILURE(TestFalseStart(server_options, client_config, true));
2824 ASSERT_TRUE(ran_handshake_completion_callback_);
2825 }
2826
2827 TEST_F(SSLClientSocketFalseStartTest,
2828 HandshakeCallbackIsRun_WithFalseStartSuccess) {
2829 // False Start requires NPN and a forward-secret cipher suite.
2830 SpawnedTestServer::SSLOptions server_options;
2831 server_options.key_exchanges =
2832 SpawnedTestServer::SSLOptions::KEY_EXCHANGE_DHE_RSA;
2833 server_options.enable_npn = true;
2834 SSLConfig client_config;
2835 client_config.next_protos.push_back("http/1.1");
2836 monitor_handshake_callback_ = true;
2837 ASSERT_NO_FATAL_FAILURE(TestFalseStart(server_options, client_config, true));
2838 ASSERT_TRUE(ran_handshake_completion_callback_);
2839 }
2773 #endif // defined(USE_OPENSSL) 2840 #endif // defined(USE_OPENSSL)
2774 2841
2775 TEST_F(SSLClientSocketFalseStartTest, FalseStartEnabled) { 2842 TEST_F(SSLClientSocketFalseStartTest, FalseStartEnabled) {
2776 // False Start requires NPN and a forward-secret cipher suite. 2843 // False Start requires NPN and a forward-secret cipher suite.
2777 SpawnedTestServer::SSLOptions server_options; 2844 SpawnedTestServer::SSLOptions server_options;
2778 server_options.key_exchanges = 2845 server_options.key_exchanges =
2779 SpawnedTestServer::SSLOptions::KEY_EXCHANGE_DHE_RSA; 2846 SpawnedTestServer::SSLOptions::KEY_EXCHANGE_DHE_RSA;
2780 server_options.enable_npn = true; 2847 server_options.enable_npn = true;
2781 SSLConfig client_config; 2848 SSLConfig client_config;
2782 client_config.next_protos.push_back("http/1.1"); 2849 client_config.next_protos.push_back("http/1.1");
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
2847 server_options.enable_npn = true; 2914 server_options.enable_npn = true;
2848 ASSERT_TRUE(StartTestServer(server_options)); 2915 ASSERT_TRUE(StartTestServer(server_options));
2849 2916
2850 SSLConfig client_config; 2917 SSLConfig client_config;
2851 client_config.next_protos.push_back("http/1.1"); 2918 client_config.next_protos.push_back("http/1.1");
2852 2919
2853 // Start a handshake up to the server Finished message. 2920 // Start a handshake up to the server Finished message.
2854 TestCompletionCallback callback; 2921 TestCompletionCallback callback;
2855 FakeBlockingStreamSocket* raw_transport1; 2922 FakeBlockingStreamSocket* raw_transport1;
2856 scoped_ptr<SSLClientSocket> sock1; 2923 scoped_ptr<SSLClientSocket> sock1;
2857 ASSERT_NO_FATAL_FAILURE(CreateAndConnectUntilServerFinishedReceived( 2924 scoped_ptr<StreamSocket> real_transport(
2858 client_config, &callback, &raw_transport1, &sock1)); 2925 new TCPClientSocket(addr(), NULL, NetLog::Source()));
2926 ASSERT_NO_FATAL_FAILURE(
2927 CreateAndConnectUntilServerFinishedReceived(client_config,
2928 &callback,
2929 &raw_transport1,
2930 real_transport.Pass(),
2931 &sock1));
2859 // Although raw_transport1 has the server Finished blocked, the handshake 2932 // Although raw_transport1 has the server Finished blocked, the handshake
2860 // still completes. 2933 // still completes.
2861 EXPECT_EQ(OK, callback.WaitForResult()); 2934 EXPECT_EQ(OK, callback.WaitForResult());
2862 2935
2863 // Drop the old socket. This is needed because the Python test server can't 2936 // Drop the old socket. This is needed because the Python test server can't
2864 // service two sockets in parallel. 2937 // service two sockets in parallel.
2865 sock1.reset(); 2938 sock1.reset();
2866 2939
2867 // Start a second connection. 2940 // Start a second connection.
2868 scoped_ptr<StreamSocket> transport2( 2941 scoped_ptr<StreamSocket> transport2(
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
2934 ssl_config.channel_id_enabled = true; 3007 ssl_config.channel_id_enabled = true;
2935 3008
2936 int rv; 3009 int rv;
2937 ASSERT_TRUE(CreateAndConnectSSLClientSocket(ssl_config, &rv)); 3010 ASSERT_TRUE(CreateAndConnectSSLClientSocket(ssl_config, &rv));
2938 3011
2939 EXPECT_EQ(ERR_UNEXPECTED, rv); 3012 EXPECT_EQ(ERR_UNEXPECTED, rv);
2940 EXPECT_FALSE(sock_->IsConnected()); 3013 EXPECT_FALSE(sock_->IsConnected());
2941 } 3014 }
2942 3015
2943 } // namespace net 3016 } // namespace net
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698