From f65e1af922ff4178abcc0566be137c23793bd9c3 Mon Sep 17 00:00:00 2001 From: "agl@chromium.org" Date: Wed, 17 Nov 2010 17:40:19 +0000 Subject: snap_start_tests: test NPN misprediction. When snap startting, we can hit a case where we predicted that we would negotiation an NPN protocol with a server, but then found that we were wrong. r65837 deal with this from the HTTP stack's point of view. This change adds tests to make sure that we can recover from the misprediction and get it right next time. BUG=none TEST=snap_start_tests http://codereview.chromium.org/4854002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@66458 0039d316-1c4b-4281-b951-d872f2087c98 --- net/socket/ssl_client_socket_snapstart_unittest.cc | 45 ++++++++++++++++++++++ 1 file changed, 45 insertions(+) (limited to 'net/socket') diff --git a/net/socket/ssl_client_socket_snapstart_unittest.cc b/net/socket/ssl_client_socket_snapstart_unittest.cc index b3fb07e..13b2636 100644 --- a/net/socket/ssl_client_socket_snapstart_unittest.cc +++ b/net/socket/ssl_client_socket_snapstart_unittest.cc @@ -226,6 +226,8 @@ class SSLClientSocketSnapStartTest : public PlatformTest { EXPECT_EQ(8, rv); EXPECT_TRUE(memcmp(reply_buffer->data(), "goodbye!", 8) == 0); + next_proto_status_ = sock->GetNextProto(&next_proto_); + sock->Disconnect(); } @@ -266,6 +268,8 @@ class SSLClientSocketSnapStartTest : public PlatformTest { int client_; SSLConfig ssl_config_; CapturingNetLog log_; + SSLClientSocket::NextProtoStatus next_proto_status_; + std::string next_proto_; }; TEST_F(SSLClientSocketSnapStartTest, Basic) { @@ -318,4 +322,45 @@ TEST_F(SSLClientSocketSnapStartTest, SnapStartResumeRecovery) { EXPECT_TRUE(DidMerge()); } +TEST_F(SSLClientSocketSnapStartTest, SnapStartWithNPN) { + ssl_config_.next_protos.assign("\003foo\003bar"); + StartSnapStartServer("snap-start", "npn", NULL); + PerformConnection(); + EXPECT_EQ(SSLClientSocket::kNextProtoNegotiated, next_proto_status_); + EXPECT_EQ("foo", next_proto_); + EXPECT_EQ(SSL_SNAP_START_NONE, SnapStartEventType()); + EXPECT_FALSE(DidMerge()); + SSLClientSocketNSS::ClearSessionCache(); + PerformConnection(); + EXPECT_EQ(SSL_SNAP_START_FULL, SnapStartEventType()); + EXPECT_EQ(SSLClientSocket::kNextProtoNegotiated, next_proto_status_); + EXPECT_EQ("foo", next_proto_); + EXPECT_TRUE(DidMerge()); +} + +TEST_F(SSLClientSocketSnapStartTest, SnapStartWithNPNMispredict) { + // This tests that we recover in the event of a misprediction. + ssl_config_.next_protos.assign("\003foo\003baz"); + StartSnapStartServer("snap-start", "npn-mispredict", NULL); + PerformConnection(); + EXPECT_EQ(SSLClientSocket::kNextProtoNegotiated, next_proto_status_); + EXPECT_EQ("foo", next_proto_); + EXPECT_EQ(SSL_SNAP_START_NONE, SnapStartEventType()); + EXPECT_FALSE(DidMerge()); + + SSLClientSocketNSS::ClearSessionCache(); + PerformConnection(); + EXPECT_EQ(SSL_SNAP_START_RECOVERY, SnapStartEventType()); + EXPECT_EQ(SSLClientSocket::kNextProtoNegotiated, next_proto_status_); + EXPECT_EQ("baz", next_proto_); + EXPECT_TRUE(DidMerge()); + + SSLClientSocketNSS::ClearSessionCache(); + PerformConnection(); + EXPECT_EQ(SSL_SNAP_START_FULL, SnapStartEventType()); + EXPECT_EQ(SSLClientSocket::kNextProtoNegotiated, next_proto_status_); + EXPECT_EQ("baz", next_proto_); + EXPECT_TRUE(DidMerge()); +} + } // namespace net -- cgit v1.1