Skip to content

Commit

Permalink
Refactor SSLSocketDataProvider to provide an SSLInfo
Browse files Browse the repository at this point in the history
SSLSocketDataProvider is used to vend MockSSLClientSockets
for unittests. It was originally just used to simulate the
behaviour of Connect() with a given cert, but has since
grown to include a number of additional fields that are then
exposed via the StreamSocket::GetSSLInfo() interface.

Rather than maintaining discrete fields on the
SSLSocketDataProvider and adding more fields as they grow,
just store an SSLInfo in the data provider so that any of
the fields can be simulated.

BUG=787574

Cq-Include-Trybots: master.tryserver.chromium.android:android_cronet_tester;master.tryserver.chromium.mac:ios-simulator-cronet
Change-Id: I03f5dd6241e38221067220e9547b1ea5052a539a
Reviewed-on: https://chromium-review.googlesource.com/783256
Reviewed-by: Tarun Bansal <tbansal@chromium.org>
Reviewed-by: David Benjamin <davidben@chromium.org>
Commit-Queue: Ryan Sleevi <rsleevi@chromium.org>
Cr-Commit-Position: refs/heads/master@{#518439}
  • Loading branch information
sleevi authored and Commit Bot committed Nov 21, 2017
1 parent f48b1f3 commit 4f83209
Show file tree
Hide file tree
Showing 19 changed files with 105 additions and 89 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -345,7 +345,7 @@ class DataReductionProxyNetworkDelegateTest : public testing::Test {
lofi_ui_service_(nullptr),
ssl_socket_data_provider_(net::ASYNC, net::OK) {
ssl_socket_data_provider_.next_proto = net::kProtoHTTP11;
ssl_socket_data_provider_.cert = net::ImportCertFromFile(
ssl_socket_data_provider_.ssl_info.cert = net::ImportCertFromFile(
net::GetTestCertsDirectory(), "unittest.selfsigned.der");
}

Expand Down
5 changes: 3 additions & 2 deletions net/http/bidirectional_stream_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -394,7 +394,8 @@ class BidirectionalStreamTest : public testing::Test {
key_(host_port_pair_, ProxyServer::Direct(), PRIVACY_MODE_DISABLED),
ssl_data_(SSLSocketDataProvider(ASYNC, OK)) {
ssl_data_.next_proto = kProtoHTTP2;
ssl_data_.cert = ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
ssl_data_.ssl_info.cert =
ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
net_log_.SetCaptureMode(NetLogCaptureMode::IncludeSocketBytes());
}

Expand All @@ -411,7 +412,7 @@ class BidirectionalStreamTest : public testing::Test {
size_t reads_count,
MockWrite* writes,
size_t writes_count) {
ASSERT_TRUE(ssl_data_.cert.get());
ASSERT_TRUE(ssl_data_.ssl_info.cert.get());
session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_data_);
sequenced_data_.reset(
new SequencedSocketData(reads, reads_count, writes, writes_count));
Expand Down
12 changes: 6 additions & 6 deletions net/http/http_network_transaction_ssl_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -105,8 +105,8 @@ TEST_F(HttpNetworkTransactionSSLTest, TokenBinding) {
session_context_.channel_id_service = &channel_id_service;

SSLSocketDataProvider ssl_data(ASYNC, OK);
ssl_data.token_binding_negotiated = true;
ssl_data.token_binding_key_param = TB_PARAM_ECDSAP256;
ssl_data.ssl_info.token_binding_negotiated = true;
ssl_data.ssl_info.token_binding_key_param = TB_PARAM_ECDSAP256;
mock_socket_factory_.AddSSLSocketDataProvider(&ssl_data);
MockRead mock_reads[] = {MockRead("HTTP/1.1 200 OK\r\n\r\n"),
MockRead(SYNCHRONOUS, OK)};
Expand Down Expand Up @@ -154,8 +154,8 @@ TEST_F(HttpNetworkTransactionSSLTest, NoTokenBindingOverHttp) {
session_context_.channel_id_service = &channel_id_service;

SSLSocketDataProvider ssl_data(ASYNC, OK);
ssl_data.token_binding_negotiated = true;
ssl_data.token_binding_key_param = TB_PARAM_ECDSAP256;
ssl_data.ssl_info.token_binding_negotiated = true;
ssl_data.ssl_info.token_binding_key_param = TB_PARAM_ECDSAP256;
mock_socket_factory_.AddSSLSocketDataProvider(&ssl_data);
MockRead mock_reads[] = {MockRead("HTTP/1.1 200 OK\r\n\r\n"),
MockRead(SYNCHRONOUS, OK)};
Expand Down Expand Up @@ -191,8 +191,8 @@ TEST_F(HttpNetworkTransactionSSLTest, TokenBindingAsync) {
session_context_.channel_id_service = &channel_id_service;

SSLSocketDataProvider ssl_data(ASYNC, OK);
ssl_data.token_binding_negotiated = true;
ssl_data.token_binding_key_param = TB_PARAM_ECDSAP256;
ssl_data.ssl_info.token_binding_negotiated = true;
ssl_data.ssl_info.token_binding_key_param = TB_PARAM_ECDSAP256;
ssl_data.next_proto = kProtoHTTP2;
mock_socket_factory_.AddSSLSocketDataProvider(&ssl_data);

Expand Down
46 changes: 27 additions & 19 deletions net/http/http_network_transaction_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -569,8 +569,9 @@ class HttpNetworkTransactionTest : public PlatformTest {

void AddSSLSocketData() {
ssl_.next_proto = kProtoHTTP2;
ssl_.cert = ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem");
ASSERT_TRUE(ssl_.cert);
ssl_.ssl_info.cert =
ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem");
ASSERT_TRUE(ssl_.ssl_info.cert);
session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_);
}

Expand Down Expand Up @@ -10406,9 +10407,10 @@ TEST_F(HttpNetworkTransactionTest, IgnoreAltSvcWithInvalidCert) {
session_deps_.socket_factory->AddSocketDataProvider(&data);

SSLSocketDataProvider ssl(ASYNC, OK);
ssl.cert = ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem");
ASSERT_TRUE(ssl.cert);
ssl.cert_status = CERT_STATUS_COMMON_NAME_INVALID;
ssl.ssl_info.cert =
ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem");
ASSERT_TRUE(ssl.ssl_info.cert);
ssl.ssl_info.cert_status = CERT_STATUS_COMMON_NAME_INVALID;
session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl);

TestCompletionCallback callback;
Expand Down Expand Up @@ -10459,8 +10461,9 @@ TEST_F(HttpNetworkTransactionTest, HonorAlternativeServiceHeader) {
session_deps_.socket_factory->AddSocketDataProvider(&data);

SSLSocketDataProvider ssl(ASYNC, OK);
ssl.cert = ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem");
ASSERT_TRUE(ssl.cert);
ssl.ssl_info.cert =
ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem");
ASSERT_TRUE(ssl.ssl_info.cert);
session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl);

TestCompletionCallback callback;
Expand Down Expand Up @@ -10658,8 +10661,9 @@ TEST_F(HttpNetworkTransactionTest, ClearAlternativeServices) {
session_deps_.socket_factory->AddSocketDataProvider(&data);

SSLSocketDataProvider ssl(ASYNC, OK);
ssl.cert = ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem");
ASSERT_TRUE(ssl.cert);
ssl.ssl_info.cert =
ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem");
ASSERT_TRUE(ssl.ssl_info.cert);
session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl);

HttpRequestInfo request;
Expand Down Expand Up @@ -10705,8 +10709,9 @@ TEST_F(HttpNetworkTransactionTest, HonorMultipleAlternativeServiceHeaders) {
session_deps_.socket_factory->AddSocketDataProvider(&data);

SSLSocketDataProvider ssl(ASYNC, OK);
ssl.cert = ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem");
ASSERT_TRUE(ssl.cert);
ssl.ssl_info.cert =
ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem");
ASSERT_TRUE(ssl.ssl_info.cert);
session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl);

TestCompletionCallback callback;
Expand Down Expand Up @@ -11336,8 +11341,9 @@ TEST_F(HttpNetworkTransactionTest, AlternateProtocolWithSpdyLateBinding) {
session_deps_.socket_factory->AddSocketDataProvider(&http11_data);

SSLSocketDataProvider ssl_http11(ASYNC, OK);
ssl_http11.cert = ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem");
ASSERT_TRUE(ssl_http11.cert);
ssl_http11.ssl_info.cert =
ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem");
ASSERT_TRUE(ssl_http11.ssl_info.cert);
session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_http11);

// Second transaction starts an alternative and a non-alternative Job.
Expand Down Expand Up @@ -11449,8 +11455,9 @@ TEST_F(HttpNetworkTransactionTest, StallAlternativeServiceForNpnSpdy) {
session_deps_.socket_factory->AddSocketDataProvider(&first_transaction);

SSLSocketDataProvider ssl(ASYNC, OK);
ssl.cert = ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem");
ASSERT_TRUE(ssl.cert);
ssl.ssl_info.cert =
ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem");
ASSERT_TRUE(ssl.ssl_info.cert);
session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl);

MockConnect never_finishing_connect(SYNCHRONOUS, ERR_IO_PENDING);
Expand Down Expand Up @@ -14883,8 +14890,9 @@ TEST_F(HttpNetworkTransactionTest, DoNotUseSpdySessionIfCertDoesNotMatch) {
// be valid for proxy because the MockSSLClientSocket does
// not actually verify it. But SpdySession will use this
// to see if it is valid for the new origin
ssl1.cert = ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
ASSERT_TRUE(ssl1.cert);
ssl1.ssl_info.cert =
ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
ASSERT_TRUE(ssl1.ssl_info.cert);
session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl1);
session_deps_.socket_factory->AddSocketDataProvider(&data1);

Expand Down Expand Up @@ -17145,8 +17153,8 @@ TEST_F(HttpNetworkTransactionTest, TokenBindingSpdy) {
request.method = "GET";

SSLSocketDataProvider ssl(ASYNC, OK);
ssl.token_binding_negotiated = true;
ssl.token_binding_key_param = TB_PARAM_ECDSAP256;
ssl.ssl_info.token_binding_negotiated = true;
ssl.ssl_info.token_binding_key_param = TB_PARAM_ECDSAP256;
ssl.next_proto = kProtoHTTP2;
session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl);

Expand Down
4 changes: 2 additions & 2 deletions net/quic/chromium/quic_network_transaction_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -748,9 +748,9 @@ class QuicNetworkTransactionTest
}

static void AddCertificate(SSLSocketDataProvider* ssl_data) {
ssl_data->cert =
ssl_data->ssl_info.cert =
ImportCertFromFile(GetTestCertsDirectory(), "wildcard.pem");
ASSERT_TRUE(ssl_data->cert);
ASSERT_TRUE(ssl_data->ssl_info.cert);
}

const QuicTransportVersion version_;
Expand Down
22 changes: 6 additions & 16 deletions net/socket/socket_test_util.cc
Original file line number Diff line number Diff line change
Expand Up @@ -296,16 +296,12 @@ void StaticSocketDataProvider::Reset() {
SSLSocketDataProvider::SSLSocketDataProvider(IoMode mode, int result)
: connect(mode, result),
next_proto(kProtoUnknown),
client_cert_sent(false),
cert_request_info(NULL),
cert_status(0),
channel_id_sent(false),
connection_status(0),
token_binding_negotiated(false) {
channel_id_service(NULL) {
SSLConnectionStatusSetVersion(SSL_CONNECTION_VERSION_TLS1_2,
&connection_status);
&ssl_info.connection_status);
// Set to TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305
SSLConnectionStatusSetCipherSuite(0xcca9, &connection_status);
SSLConnectionStatusSetCipherSuite(0xcca9, &ssl_info.connection_status);
}

SSLSocketDataProvider::SSLSocketDataProvider(
Expand Down Expand Up @@ -1247,15 +1243,9 @@ NextProto MockSSLClientSocket::GetNegotiatedProtocol() const {
return data_->next_proto;
}

bool MockSSLClientSocket::GetSSLInfo(SSLInfo* ssl_info) {
ssl_info->Reset();
ssl_info->cert = data_->cert;
ssl_info->cert_status = data_->cert_status;
ssl_info->client_cert_sent = data_->client_cert_sent;
ssl_info->channel_id_sent = data_->channel_id_sent;
ssl_info->connection_status = data_->connection_status;
ssl_info->token_binding_negotiated = data_->token_binding_negotiated;
ssl_info->token_binding_key_param = data_->token_binding_key_param;
bool MockSSLClientSocket::GetSSLInfo(SSLInfo* requested_ssl_info) {
requested_ssl_info->Reset();
*requested_ssl_info = data_->ssl_info;
return true;
}

Expand Down
18 changes: 10 additions & 8 deletions net/socket/socket_test_util.h
Original file line number Diff line number Diff line change
Expand Up @@ -358,18 +358,20 @@ struct SSLSocketDataProvider {
SSLSocketDataProvider(const SSLSocketDataProvider& other);
~SSLSocketDataProvider();

// Result for Connect().
MockConnect connect;

// Result for GetNegotiatedProtocol().
NextProto next_proto;
NextProtoVector next_protos_expected_in_ssl_config;
bool client_cert_sent;

// Result for GetSSLInfo().
SSLInfo ssl_info;

// Result for GetSSLCertRequestInfo().
SSLCertRequestInfo* cert_request_info;
scoped_refptr<X509Certificate> cert;
CertStatus cert_status;
bool channel_id_sent;

ChannelIDService* channel_id_service;
int connection_status;
bool token_binding_negotiated;
TokenBindingParam token_binding_key_param;
NextProtoVector next_protos_expected_in_ssl_config;
};

// Uses the sequence_number field in the mock reads and writes to
Expand Down
12 changes: 6 additions & 6 deletions net/socket/ssl_client_socket_pool_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -849,9 +849,9 @@ TEST_F(SSLClientSocketPoolTest, IPPooling) {
StaticSocketDataProvider data(reads, arraysize(reads), NULL, 0);
socket_factory_.AddSocketDataProvider(&data);
SSLSocketDataProvider ssl(ASYNC, OK);
ssl.cert = X509Certificate::CreateFromBytes(
ssl.ssl_info.cert = X509Certificate::CreateFromBytes(
reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der));
ASSERT_TRUE(ssl.cert);
ASSERT_TRUE(ssl.ssl_info.cert);
ssl.next_proto = kProtoHTTP2;
socket_factory_.AddSSLSocketDataProvider(&ssl);

Expand Down Expand Up @@ -926,18 +926,18 @@ void SSLClientSocketPoolTest::TestIPPoolingDisabled(
// pooling.
TEST_F(SSLClientSocketPoolTest, IPPoolingClientCert) {
SSLSocketDataProvider ssl(ASYNC, OK);
ssl.cert = X509Certificate::CreateFromBytes(
ssl.ssl_info.cert = X509Certificate::CreateFromBytes(
reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der));
ASSERT_TRUE(ssl.cert);
ssl.client_cert_sent = true;
ASSERT_TRUE(ssl.ssl_info.cert);
ssl.ssl_info.client_cert_sent = true;
ssl.next_proto = kProtoHTTP2;
TestIPPoolingDisabled(&ssl);
}

// Verifies that an SSL connection with channel ID disables SPDY IP pooling.
TEST_F(SSLClientSocketPoolTest, IPPoolingChannelID) {
SSLSocketDataProvider ssl(ASYNC, OK);
ssl.channel_id_sent = true;
ssl.ssl_info.channel_id_sent = true;
ssl.next_proto = kProtoHTTP2;
TestIPPoolingDisabled(&ssl);
}
Expand Down
5 changes: 3 additions & 2 deletions net/spdy/chromium/bidirectional_stream_spdy_impl_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,8 @@ class BidirectionalStreamSpdyImplTest : public testing::TestWithParam<bool> {
key_(host_port_pair_, ProxyServer::Direct(), PRIVACY_MODE_DISABLED),
ssl_data_(SSLSocketDataProvider(ASYNC, OK)) {
ssl_data_.next_proto = kProtoHTTP2;
ssl_data_.cert = ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
ssl_data_.ssl_info.cert =
ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem");
}

protected:
Expand All @@ -252,7 +253,7 @@ class BidirectionalStreamSpdyImplTest : public testing::TestWithParam<bool> {
size_t reads_count,
MockWrite* writes,
size_t writes_count) {
ASSERT_TRUE(ssl_data_.cert.get());
ASSERT_TRUE(ssl_data_.ssl_info.cert.get());
session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_data_);
sequenced_data_ = std::make_unique<SequencedSocketData>(
reads, reads_count, writes, writes_count);
Expand Down
8 changes: 6 additions & 2 deletions net/spdy/chromium/http2_push_promise_index_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,9 @@ TEST_F(Http2PushPromiseIndexTest, Empty) {
TEST_F(Http2PushPromiseIndexTest, FindMultipleSessionsWithDifferentUrl) {
MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
SSLSocketDataProvider ssl(SYNCHRONOUS, OK);
ssl.cert = ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem");
ssl.ssl_info.cert =
ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem");
ASSERT_TRUE(ssl.ssl_info.cert);
// For first session.
SequencedSocketData data1(reads, arraysize(reads), nullptr, 0);
session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl);
Expand Down Expand Up @@ -105,7 +107,9 @@ TEST_F(Http2PushPromiseIndexTest, FindMultipleSessionsWithDifferentUrl) {
TEST_F(Http2PushPromiseIndexTest, MultipleSessionsForSingleUrl) {
MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)};
SSLSocketDataProvider ssl(SYNCHRONOUS, OK);
ssl.cert = ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem");
ssl.ssl_info.cert =
ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem");
ASSERT_TRUE(ssl.ssl_info.cert);
// For first session.
SequencedSocketData data1(reads, arraysize(reads), nullptr, 0);
session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl);
Expand Down
5 changes: 3 additions & 2 deletions net/spdy/chromium/spdy_http_stream_unittest.cc
Original file line number Diff line number Diff line change
Expand Up @@ -149,8 +149,9 @@ class SpdyHttpStreamTest : public testing::Test {
reads, reads_count, writes, writes_count);
session_deps_.socket_factory->AddSocketDataProvider(sequenced_data_.get());

ssl_.cert = ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem");
ASSERT_TRUE(ssl_.cert);
ssl_.ssl_info.cert =
ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem");
ASSERT_TRUE(ssl_.ssl_info.cert);
session_deps_.socket_factory->AddSSLSocketDataProvider(&ssl_);

http_session_ = SpdySessionDependencies::SpdyCreateSession(&session_deps_);
Expand Down
Loading

0 comments on commit 4f83209

Please sign in to comment.