Index: webrtc/base/sslstreamadapter_unittest.cc |
diff --git a/webrtc/base/sslstreamadapter_unittest.cc b/webrtc/base/sslstreamadapter_unittest.cc |
index 6abaaa3bb9e678a0d14a796a72e313b0a60b5845..67658ba6103ed8e6f4e0bf369ad5a1126cc07378 100644 |
--- a/webrtc/base/sslstreamadapter_unittest.cc |
+++ b/webrtc/base/sslstreamadapter_unittest.cc |
@@ -23,6 +23,11 @@ |
#include "webrtc/base/stream.h" |
#include "webrtc/test/testsupport/gtest_disable.h" |
+using ::testing::WithParamInterface; |
+using ::testing::Values; |
+using ::testing::Combine; |
+using ::testing::tuple; |
+ |
static const int kBlockSize = 4096; |
static const char kAES_CM_HMAC_SHA1_80[] = "AES_CM_128_HMAC_SHA1_80"; |
static const char kAES_CM_HMAC_SHA1_32[] = "AES_CM_128_HMAC_SHA1_32"; |
@@ -158,18 +163,27 @@ class SSLStreamAdapterTestBase : public testing::Test, |
public: |
SSLStreamAdapterTestBase(const std::string& client_cert_pem, |
const std::string& client_private_key_pem, |
- bool dtls) : |
- client_buffer_(kFifoBufferSize), server_buffer_(kFifoBufferSize), |
- client_stream_( |
- new SSLDummyStream(this, "c2s", &client_buffer_, &server_buffer_)), |
- server_stream_( |
- new SSLDummyStream(this, "s2c", &server_buffer_, &client_buffer_)), |
- client_ssl_(rtc::SSLStreamAdapter::Create(client_stream_)), |
- server_ssl_(rtc::SSLStreamAdapter::Create(server_stream_)), |
- client_identity_(NULL), server_identity_(NULL), |
- delay_(0), mtu_(1460), loss_(0), lose_first_packet_(false), |
- damage_(false), dtls_(dtls), |
- handshake_wait_(5000), identities_set_(false) { |
+ bool dtls, |
+ rtc::KeyType client_key_type = rtc::KT_DEFAULT, |
+ rtc::KeyType server_key_type = rtc::KT_DEFAULT) |
+ : client_buffer_(kFifoBufferSize), |
+ server_buffer_(kFifoBufferSize), |
+ client_stream_( |
+ new SSLDummyStream(this, "c2s", &client_buffer_, &server_buffer_)), |
+ server_stream_( |
+ new SSLDummyStream(this, "s2c", &server_buffer_, &client_buffer_)), |
+ client_ssl_(rtc::SSLStreamAdapter::Create(client_stream_)), |
+ server_ssl_(rtc::SSLStreamAdapter::Create(server_stream_)), |
+ client_identity_(NULL), |
+ server_identity_(NULL), |
+ delay_(0), |
+ mtu_(1460), |
+ loss_(0), |
+ lose_first_packet_(false), |
+ damage_(false), |
+ dtls_(dtls), |
+ handshake_wait_(5000), |
+ identities_set_(false) { |
// Set use of the test RNG to get predictable loss patterns. |
rtc::SetRandomTestMode(true); |
@@ -181,9 +195,9 @@ class SSLStreamAdapterTestBase : public testing::Test, |
client_identity_ = rtc::SSLIdentity::FromPEMStrings( |
client_private_key_pem, client_cert_pem); |
} else { |
- client_identity_ = rtc::SSLIdentity::Generate("client"); |
+ client_identity_ = rtc::SSLIdentity::Generate("client", client_key_type); |
} |
- server_identity_ = rtc::SSLIdentity::Generate("server"); |
+ server_identity_ = rtc::SSLIdentity::Generate("server", server_key_type); |
client_ssl_->SetIdentity(client_identity_); |
server_ssl_->SetIdentity(server_identity_); |
@@ -213,12 +227,14 @@ class SSLStreamAdapterTestBase : public testing::Test, |
client_params.common_name = "client"; |
client_params.not_before = not_before; |
client_params.not_after = not_after; |
+ client_params.key_type = rtc::KT_DEFAULT; |
client_identity_ = rtc::SSLIdentity::GenerateForTest(client_params); |
rtc::SSLIdentityParams server_params; |
server_params.common_name = "server"; |
server_params.not_before = not_before; |
server_params.not_after = not_after; |
+ server_params.key_type = rtc::KT_DEFAULT; |
server_identity_ = rtc::SSLIdentity::GenerateForTest(server_params); |
client_ssl_->SetIdentity(client_identity_); |
@@ -444,11 +460,16 @@ class SSLStreamAdapterTestBase : public testing::Test, |
bool identities_set_; |
}; |
-class SSLStreamAdapterTestTLS : public SSLStreamAdapterTestBase { |
+class SSLStreamAdapterTestTLS |
+ : public SSLStreamAdapterTestBase, |
+ public WithParamInterface<tuple<rtc::KeyType, rtc::KeyType>> { |
public: |
- SSLStreamAdapterTestTLS() : |
- SSLStreamAdapterTestBase("", "", false) { |
- }; |
+ SSLStreamAdapterTestTLS() |
+ : SSLStreamAdapterTestBase("", |
+ "", |
+ false, |
+ ::testing::get<0>(GetParam()), |
+ ::testing::get<1>(GetParam())){}; |
// Test data transfer for TLS |
virtual void TestTransfer(int size) { |
@@ -547,12 +568,19 @@ class SSLStreamAdapterTestTLS : public SSLStreamAdapterTestBase { |
rtc::MemoryStream recv_stream_; |
}; |
-class SSLStreamAdapterTestDTLS : public SSLStreamAdapterTestBase { |
+class SSLStreamAdapterTestDTLS |
+ : public SSLStreamAdapterTestBase, |
+ public WithParamInterface<tuple<rtc::KeyType, rtc::KeyType>> { |
public: |
- SSLStreamAdapterTestDTLS() : |
- SSLStreamAdapterTestBase("", "", true), |
- packet_size_(1000), count_(0), sent_(0) { |
- } |
+ SSLStreamAdapterTestDTLS() |
+ : SSLStreamAdapterTestBase("", |
+ "", |
+ true, |
+ ::testing::get<0>(GetParam()), |
+ ::testing::get<1>(GetParam())), |
+ packet_size_(1000), |
+ count_(0), |
+ sent_(0) {} |
SSLStreamAdapterTestDTLS(const std::string& cert_pem, |
const std::string& private_key_pem) : |
@@ -677,7 +705,7 @@ class SSLStreamAdapterTestDTLSFromPEMStrings : public SSLStreamAdapterTestDTLS { |
// This test only applies to NSS because OpenSSL has passthrough |
// semantics for I/O before the handshake is started. |
#if SSL_USE_NSS |
-TEST_F(SSLStreamAdapterTestTLS, TestNoReadWriteBeforeConnect) { |
+TEST_P(SSLStreamAdapterTestTLS, TestNoReadWriteBeforeConnect) { |
rtc::StreamResult rv; |
char block[kBlockSize]; |
size_t dummy; |
@@ -692,25 +720,25 @@ TEST_F(SSLStreamAdapterTestTLS, TestNoReadWriteBeforeConnect) { |
// Test that we can make a handshake work |
-TEST_F(SSLStreamAdapterTestTLS, TestTLSConnect) { |
+TEST_P(SSLStreamAdapterTestTLS, TestTLSConnect) { |
TestHandshake(); |
}; |
// Test that closing the connection on one side updates the other side. |
-TEST_F(SSLStreamAdapterTestTLS, TestTLSClose) { |
+TEST_P(SSLStreamAdapterTestTLS, TestTLSClose) { |
TestHandshake(); |
client_ssl_->Close(); |
EXPECT_EQ_WAIT(rtc::SS_CLOSED, server_ssl_->GetState(), handshake_wait_); |
}; |
// Test transfer -- trivial |
-TEST_F(SSLStreamAdapterTestTLS, TestTLSTransfer) { |
+TEST_P(SSLStreamAdapterTestTLS, TestTLSTransfer) { |
TestHandshake(); |
TestTransfer(100000); |
}; |
// Test read-write after close. |
-TEST_F(SSLStreamAdapterTestTLS, ReadWriteAfterClose) { |
+TEST_P(SSLStreamAdapterTestTLS, ReadWriteAfterClose) { |
TestHandshake(); |
TestTransfer(100000); |
client_ssl_->Close(); |
@@ -729,7 +757,7 @@ TEST_F(SSLStreamAdapterTestTLS, ReadWriteAfterClose) { |
}; |
// Test a handshake with a bogus peer digest |
-TEST_F(SSLStreamAdapterTestTLS, TestTLSBogusDigest) { |
+TEST_P(SSLStreamAdapterTestTLS, TestTLSBogusDigest) { |
SetPeerIdentitiesByDigest(false); |
TestHandshake(false); |
}; |
@@ -738,7 +766,7 @@ TEST_F(SSLStreamAdapterTestTLS, TestTLSBogusDigest) { |
// Basic tests: DTLS |
// Test that we can make a handshake work |
-TEST_F(SSLStreamAdapterTestDTLS, TestDTLSConnect) { |
+TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnect) { |
MAYBE_SKIP_TEST(HaveDtls); |
TestHandshake(); |
}; |
@@ -746,15 +774,14 @@ TEST_F(SSLStreamAdapterTestDTLS, TestDTLSConnect) { |
// Test that we can make a handshake work if the first packet in |
// each direction is lost. This gives us predictable loss |
// rather than having to tune random |
-TEST_F(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacket) { |
+TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacket) { |
MAYBE_SKIP_TEST(HaveDtls); |
SetLoseFirstPacket(true); |
TestHandshake(); |
}; |
// Test a handshake with loss and delay |
-TEST_F(SSLStreamAdapterTestDTLS, |
- TestDTLSConnectWithLostFirstPacketDelay2s) { |
+TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnectWithLostFirstPacketDelay2s) { |
MAYBE_SKIP_TEST(HaveDtls); |
SetLoseFirstPacket(true); |
SetDelay(2000); |
@@ -764,7 +791,7 @@ TEST_F(SSLStreamAdapterTestDTLS, |
// Test a handshake with small MTU |
// Disabled due to https://code.google.com/p/webrtc/issues/detail?id=3910 |
-TEST_F(SSLStreamAdapterTestDTLS, DISABLED_TestDTLSConnectWithSmallMtu) { |
+TEST_P(SSLStreamAdapterTestDTLS, DISABLED_TestDTLSConnectWithSmallMtu) { |
MAYBE_SKIP_TEST(HaveDtls); |
SetMtu(700); |
SetHandshakeWait(20000); |
@@ -772,20 +799,20 @@ TEST_F(SSLStreamAdapterTestDTLS, DISABLED_TestDTLSConnectWithSmallMtu) { |
}; |
// Test transfer -- trivial |
-TEST_F(SSLStreamAdapterTestDTLS, TestDTLSTransfer) { |
+TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransfer) { |
MAYBE_SKIP_TEST(HaveDtls); |
TestHandshake(); |
TestTransfer(100); |
}; |
-TEST_F(SSLStreamAdapterTestDTLS, TestDTLSTransferWithLoss) { |
+TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransferWithLoss) { |
MAYBE_SKIP_TEST(HaveDtls); |
TestHandshake(); |
SetLoss(10); |
TestTransfer(100); |
}; |
-TEST_F(SSLStreamAdapterTestDTLS, TestDTLSTransferWithDamage) { |
+TEST_P(SSLStreamAdapterTestDTLS, TestDTLSTransferWithDamage) { |
MAYBE_SKIP_TEST(HaveDtls); |
SetDamage(); // Must be called first because first packet |
// write happens at end of handshake. |
@@ -794,7 +821,7 @@ TEST_F(SSLStreamAdapterTestDTLS, TestDTLSTransferWithDamage) { |
}; |
// Test DTLS-SRTP with all high ciphers |
-TEST_F(SSLStreamAdapterTestDTLS, TestDTLSSrtpHigh) { |
+TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHigh) { |
MAYBE_SKIP_TEST(HaveDtlsSrtp); |
std::vector<std::string> high; |
high.push_back(kAES_CM_HMAC_SHA1_80); |
@@ -812,7 +839,7 @@ TEST_F(SSLStreamAdapterTestDTLS, TestDTLSSrtpHigh) { |
}; |
// Test DTLS-SRTP with all low ciphers |
-TEST_F(SSLStreamAdapterTestDTLS, TestDTLSSrtpLow) { |
+TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpLow) { |
MAYBE_SKIP_TEST(HaveDtlsSrtp); |
std::vector<std::string> low; |
low.push_back(kAES_CM_HMAC_SHA1_32); |
@@ -831,7 +858,7 @@ TEST_F(SSLStreamAdapterTestDTLS, TestDTLSSrtpLow) { |
// Test DTLS-SRTP with a mismatch -- should not converge |
-TEST_F(SSLStreamAdapterTestDTLS, TestDTLSSrtpHighLow) { |
+TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpHighLow) { |
MAYBE_SKIP_TEST(HaveDtlsSrtp); |
std::vector<std::string> high; |
high.push_back(kAES_CM_HMAC_SHA1_80); |
@@ -848,7 +875,7 @@ TEST_F(SSLStreamAdapterTestDTLS, TestDTLSSrtpHighLow) { |
}; |
// Test DTLS-SRTP with each side being mixed -- should select high |
-TEST_F(SSLStreamAdapterTestDTLS, TestDTLSSrtpMixed) { |
+TEST_P(SSLStreamAdapterTestDTLS, TestDTLSSrtpMixed) { |
MAYBE_SKIP_TEST(HaveDtlsSrtp); |
std::vector<std::string> mixed; |
mixed.push_back(kAES_CM_HMAC_SHA1_80); |
@@ -867,7 +894,7 @@ TEST_F(SSLStreamAdapterTestDTLS, TestDTLSSrtpMixed) { |
}; |
// Test an exporter |
-TEST_F(SSLStreamAdapterTestDTLS, TestDTLSExporter) { |
+TEST_P(SSLStreamAdapterTestDTLS, TestDTLSExporter) { |
MAYBE_SKIP_TEST(HaveExporter); |
TestHandshake(); |
unsigned char client_out[20]; |
@@ -890,7 +917,7 @@ TEST_F(SSLStreamAdapterTestDTLS, TestDTLSExporter) { |
} |
// Test not yet valid certificates are not rejected. |
-TEST_F(SSLStreamAdapterTestDTLS, TestCertNotYetValid) { |
+TEST_P(SSLStreamAdapterTestDTLS, TestCertNotYetValid) { |
MAYBE_SKIP_TEST(HaveDtls); |
long one_day = 60 * 60 * 24; |
// Make the certificates not valid until one day later. |
@@ -899,7 +926,7 @@ TEST_F(SSLStreamAdapterTestDTLS, TestCertNotYetValid) { |
} |
// Test expired certificates are not rejected. |
-TEST_F(SSLStreamAdapterTestDTLS, TestCertExpired) { |
+TEST_P(SSLStreamAdapterTestDTLS, TestCertExpired) { |
MAYBE_SKIP_TEST(HaveDtls); |
long one_day = 60 * 60 * 24; |
// Make the certificates already expired. |
@@ -908,14 +935,14 @@ TEST_F(SSLStreamAdapterTestDTLS, TestCertExpired) { |
} |
// Test data transfer using certs created from strings. |
-TEST_F(SSLStreamAdapterTestDTLSFromPEMStrings, TestTransfer) { |
+TEST_P(SSLStreamAdapterTestDTLSFromPEMStrings, TestTransfer) { |
MAYBE_SKIP_TEST(HaveDtls); |
TestHandshake(); |
TestTransfer(100); |
} |
// Test getting the remote certificate. |
-TEST_F(SSLStreamAdapterTestDTLSFromPEMStrings, TestDTLSGetPeerCertificate) { |
+TEST_P(SSLStreamAdapterTestDTLSFromPEMStrings, TestDTLSGetPeerCertificate) { |
MAYBE_SKIP_TEST(HaveDtls); |
// Peer certificates haven't been received yet. |
@@ -955,7 +982,7 @@ TEST_F(SSLStreamAdapterTestDTLSFromPEMStrings, TestDTLSGetPeerCertificate) { |
// Test getting the used DTLS ciphers. |
// DTLS 1.2 enabled for neither client nor server -> DTLS 1.0 will be used. |
-TEST_F(SSLStreamAdapterTestDTLS, TestGetSslCipher) { |
+TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipher) { |
MAYBE_SKIP_TEST(HaveDtls); |
SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_10); |
TestHandshake(); |
@@ -966,14 +993,14 @@ TEST_F(SSLStreamAdapterTestDTLS, TestGetSslCipher) { |
ASSERT_TRUE(GetSslCipher(false, &server_cipher)); |
ASSERT_EQ(client_cipher, server_cipher); |
- ASSERT_EQ( |
- rtc::SSLStreamAdapter::GetDefaultSslCipher(rtc::SSL_PROTOCOL_DTLS_10), |
- client_cipher); |
+ ASSERT_EQ(rtc::SSLStreamAdapter::GetDefaultSslCipher( |
+ rtc::SSL_PROTOCOL_DTLS_10, ::testing::get<1>(GetParam())), |
+ server_cipher); |
} |
// Test getting the used DTLS 1.2 ciphers. |
// DTLS 1.2 enabled for client and server -> DTLS 1.2 will be used. |
-TEST_F(SSLStreamAdapterTestDTLS, TestGetSslCipherDtls12Both) { |
+TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherDtls12Both) { |
MAYBE_SKIP_TEST(HaveDtls); |
SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_12); |
TestHandshake(); |
@@ -984,13 +1011,13 @@ TEST_F(SSLStreamAdapterTestDTLS, TestGetSslCipherDtls12Both) { |
ASSERT_TRUE(GetSslCipher(false, &server_cipher)); |
ASSERT_EQ(client_cipher, server_cipher); |
- ASSERT_EQ( |
- rtc::SSLStreamAdapter::GetDefaultSslCipher(rtc::SSL_PROTOCOL_DTLS_12), |
- client_cipher); |
+ ASSERT_EQ(rtc::SSLStreamAdapter::GetDefaultSslCipher( |
+ rtc::SSL_PROTOCOL_DTLS_12, ::testing::get<1>(GetParam())), |
+ server_cipher); |
} |
// DTLS 1.2 enabled for client only -> DTLS 1.0 will be used. |
-TEST_F(SSLStreamAdapterTestDTLS, TestGetSslCipherDtls12Client) { |
+TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherDtls12Client) { |
MAYBE_SKIP_TEST(HaveDtls); |
SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_10, rtc::SSL_PROTOCOL_DTLS_12); |
TestHandshake(); |
@@ -1001,13 +1028,13 @@ TEST_F(SSLStreamAdapterTestDTLS, TestGetSslCipherDtls12Client) { |
ASSERT_TRUE(GetSslCipher(false, &server_cipher)); |
ASSERT_EQ(client_cipher, server_cipher); |
- ASSERT_EQ( |
- rtc::SSLStreamAdapter::GetDefaultSslCipher(rtc::SSL_PROTOCOL_DTLS_10), |
- client_cipher); |
+ ASSERT_EQ(rtc::SSLStreamAdapter::GetDefaultSslCipher( |
+ rtc::SSL_PROTOCOL_DTLS_10, ::testing::get<1>(GetParam())), |
+ server_cipher); |
} |
// DTLS 1.2 enabled for server only -> DTLS 1.0 will be used. |
-TEST_F(SSLStreamAdapterTestDTLS, TestGetSslCipherDtls12Server) { |
+TEST_P(SSLStreamAdapterTestDTLS, TestGetSslCipherDtls12Server) { |
MAYBE_SKIP_TEST(HaveDtls); |
SetupProtocolVersions(rtc::SSL_PROTOCOL_DTLS_12, rtc::SSL_PROTOCOL_DTLS_10); |
TestHandshake(); |
@@ -1018,7 +1045,16 @@ TEST_F(SSLStreamAdapterTestDTLS, TestGetSslCipherDtls12Server) { |
ASSERT_TRUE(GetSslCipher(false, &server_cipher)); |
ASSERT_EQ(client_cipher, server_cipher); |
- ASSERT_EQ( |
- rtc::SSLStreamAdapter::GetDefaultSslCipher(rtc::SSL_PROTOCOL_DTLS_10), |
- client_cipher); |
+ ASSERT_EQ(rtc::SSLStreamAdapter::GetDefaultSslCipher( |
+ rtc::SSL_PROTOCOL_DTLS_10, ::testing::get<1>(GetParam())), |
+ server_cipher); |
} |
+ |
+INSTANTIATE_TEST_CASE_P(SSLStreamAdapterTestsTLS, |
+ SSLStreamAdapterTestTLS, |
+ Combine(Values(rtc::KT_RSA, rtc::KT_ECDSA), |
+ Values(rtc::KT_RSA, rtc::KT_ECDSA))); |
+INSTANTIATE_TEST_CASE_P(SSLStreamAdapterTestsDTLS, |
+ SSLStreamAdapterTestDTLS, |
+ Combine(Values(rtc::KT_RSA, rtc::KT_ECDSA), |
+ Values(rtc::KT_RSA, rtc::KT_ECDSA))); |