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

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

Issue 994373004: Properly handle alerts from the peer in SSL_read. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 9 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
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 1245 matching lines...) Expand 10 before | Expand all | Expand 10 after
1256 1256
1257 sock->Disconnect(); 1257 sock->Disconnect();
1258 EXPECT_FALSE(sock->IsConnected()); 1258 EXPECT_FALSE(sock->IsConnected());
1259 } 1259 }
1260 1260
1261 // TODO(wtc): Add unit tests for IsConnectedAndIdle: 1261 // TODO(wtc): Add unit tests for IsConnectedAndIdle:
1262 // - Server closes an SSL connection (with a close_notify alert message). 1262 // - Server closes an SSL connection (with a close_notify alert message).
1263 // - Server closes the underlying TCP connection directly. 1263 // - Server closes the underlying TCP connection directly.
1264 // - Server sends data unexpectedly. 1264 // - Server sends data unexpectedly.
1265 1265
1266 // Tests that the socket can be read from successfully. Also test that a peer's
1267 // close_notify alert is successfully processed without error.
1266 TEST_F(SSLClientSocketTest, Read) { 1268 TEST_F(SSLClientSocketTest, Read) {
1267 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS, 1269 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS,
1268 SpawnedTestServer::kLocalhost, 1270 SpawnedTestServer::kLocalhost,
1269 base::FilePath()); 1271 base::FilePath());
1270 ASSERT_TRUE(test_server.Start()); 1272 ASSERT_TRUE(test_server.Start());
1271 1273
1272 AddressList addr; 1274 AddressList addr;
1273 ASSERT_TRUE(test_server.GetAddressList(&addr)); 1275 ASSERT_TRUE(test_server.GetAddressList(&addr));
1274 1276
1275 TestCompletionCallback callback; 1277 TestCompletionCallback callback;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1307 rv = sock->Read(buf.get(), 4096, callback.callback()); 1309 rv = sock->Read(buf.get(), 4096, callback.callback());
1308 EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING); 1310 EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING);
1309 1311
1310 if (rv == ERR_IO_PENDING) 1312 if (rv == ERR_IO_PENDING)
1311 rv = callback.WaitForResult(); 1313 rv = callback.WaitForResult();
1312 1314
1313 EXPECT_GE(rv, 0); 1315 EXPECT_GE(rv, 0);
1314 if (rv <= 0) 1316 if (rv <= 0)
1315 break; 1317 break;
1316 } 1318 }
1319
1320 // The peer should have cleanly closed the connection with a close_notify.
1321 EXPECT_EQ(0, rv);
1317 } 1322 }
1318 1323
1319 // Tests that SSLClientSocket properly handles when the underlying transport 1324 // Tests that SSLClientSocket properly handles when the underlying transport
1320 // synchronously fails a transport read in during the handshake. The error code 1325 // synchronously fails a transport read in during the handshake. The error code
1321 // should be preserved so SSLv3 fallback logic can condition on it. 1326 // should be preserved so SSLv3 fallback logic can condition on it.
1322 TEST_F(SSLClientSocketTest, Connect_WithSynchronousError) { 1327 TEST_F(SSLClientSocketTest, Connect_WithSynchronousError) {
1323 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS, 1328 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS,
1324 SpawnedTestServer::kLocalhost, 1329 SpawnedTestServer::kLocalhost,
1325 base::FilePath()); 1330 base::FilePath());
1326 ASSERT_TRUE(test_server.Start()); 1331 ASSERT_TRUE(test_server.Start());
(...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after
1847 scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket( 1852 scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket(
1848 transport.Pass(), test_server.host_port_pair(), SSLConfig())); 1853 transport.Pass(), test_server.host_port_pair(), SSLConfig()));
1849 1854
1850 raw_transport->SetNextReadError(0); 1855 raw_transport->SetNextReadError(0);
1851 1856
1852 rv = callback.GetResult(sock->Connect(callback.callback())); 1857 rv = callback.GetResult(sock->Connect(callback.callback()));
1853 EXPECT_EQ(ERR_CONNECTION_CLOSED, rv); 1858 EXPECT_EQ(ERR_CONNECTION_CLOSED, rv);
1854 EXPECT_FALSE(sock->IsConnected()); 1859 EXPECT_FALSE(sock->IsConnected());
1855 } 1860 }
1856 1861
1857 // Tests that SSLClientSocket cleanly returns a Read of size 0 if the 1862 // Tests that SSLClientSocket returns a Read of size 0 if the underlying socket
1858 // underlying socket is cleanly closed. 1863 // is cleanly closed, but the peer does not send close_notify.
1859 // This is a regression test for https://crbug.com/422246 1864 // This is a regression test for https://crbug.com/422246
1860 TEST_F(SSLClientSocketTest, Read_WithZeroReturn) { 1865 TEST_F(SSLClientSocketTest, Read_WithZeroReturn) {
1861 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS, 1866 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS,
1862 SpawnedTestServer::kLocalhost, 1867 SpawnedTestServer::kLocalhost,
1863 base::FilePath()); 1868 base::FilePath());
1864 ASSERT_TRUE(test_server.Start()); 1869 ASSERT_TRUE(test_server.Start());
1865 1870
1866 AddressList addr; 1871 AddressList addr;
1867 ASSERT_TRUE(test_server.GetAddressList(&addr)); 1872 ASSERT_TRUE(test_server.GetAddressList(&addr));
1868 1873
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1935 raw_transport->BlockReadResult(); 1940 raw_transport->BlockReadResult();
1936 scoped_refptr<IOBuffer> buf(new IOBuffer(4096)); 1941 scoped_refptr<IOBuffer> buf(new IOBuffer(4096));
1937 rv = sock->Read(buf.get(), 4096, callback.callback()); 1942 rv = sock->Read(buf.get(), 4096, callback.callback());
1938 EXPECT_EQ(ERR_IO_PENDING, rv); 1943 EXPECT_EQ(ERR_IO_PENDING, rv);
1939 1944
1940 raw_transport->UnblockReadResult(); 1945 raw_transport->UnblockReadResult();
1941 rv = callback.GetResult(rv); 1946 rv = callback.GetResult(rv);
1942 EXPECT_EQ(0, rv); 1947 EXPECT_EQ(0, rv);
1943 } 1948 }
1944 1949
1950 // Tests that fatal alerts from the peer are processed. This is a regression
1951 // test for https://crbug.com/466303.
1952 TEST_F(SSLClientSocketTest, Read_WithFatalAlert) {
1953 SpawnedTestServer::SSLOptions ssl_options;
1954 ssl_options.alert_after_handshake = true;
1955 ASSERT_TRUE(StartTestServer(ssl_options));
1956
1957 SSLConfig ssl_config;
1958 TestCompletionCallback callback;
1959 scoped_ptr<StreamSocket> transport(
1960 new TCPClientSocket(addr(), &log_, NetLog::Source()));
1961 EXPECT_EQ(OK, callback.GetResult(transport->Connect(callback.callback())));
1962 scoped_ptr<SSLClientSocket> sock(CreateSSLClientSocket(
1963 transport.Pass(), test_server()->host_port_pair(), ssl_config));
1964 EXPECT_EQ(OK, callback.GetResult(sock->Connect(callback.callback())));
1965
1966 // Receive the fatal alert.
1967 scoped_refptr<IOBuffer> buf(new IOBuffer(4096));
1968 EXPECT_EQ(ERR_SSL_PROTOCOL_ERROR, callback.GetResult(sock->Read(
1969 buf.get(), 4096, callback.callback())));
1970 }
1971
1945 TEST_F(SSLClientSocketTest, Read_SmallChunks) { 1972 TEST_F(SSLClientSocketTest, Read_SmallChunks) {
1946 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS, 1973 SpawnedTestServer test_server(SpawnedTestServer::TYPE_HTTPS,
1947 SpawnedTestServer::kLocalhost, 1974 SpawnedTestServer::kLocalhost,
1948 base::FilePath()); 1975 base::FilePath());
1949 ASSERT_TRUE(test_server.Start()); 1976 ASSERT_TRUE(test_server.Start());
1950 1977
1951 AddressList addr; 1978 AddressList addr;
1952 ASSERT_TRUE(test_server.GetAddressList(&addr)); 1979 ASSERT_TRUE(test_server.GetAddressList(&addr));
1953 1980
1954 TestCompletionCallback callback; 1981 TestCompletionCallback callback;
(...skipping 1311 matching lines...) Expand 10 before | Expand all | Expand 10 after
3266 ssl_config.channel_id_enabled = true; 3293 ssl_config.channel_id_enabled = true;
3267 3294
3268 int rv; 3295 int rv;
3269 ASSERT_TRUE(CreateAndConnectSSLClientSocket(ssl_config, &rv)); 3296 ASSERT_TRUE(CreateAndConnectSSLClientSocket(ssl_config, &rv));
3270 3297
3271 EXPECT_EQ(ERR_UNEXPECTED, rv); 3298 EXPECT_EQ(ERR_UNEXPECTED, rv);
3272 EXPECT_FALSE(sock_->IsConnected()); 3299 EXPECT_FALSE(sock_->IsConnected());
3273 } 3300 }
3274 3301
3275 } // namespace net 3302 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698