From 71182f4ded60f292678ad1c2ed4bb14d7db1f2ce Mon Sep 17 00:00:00 2001 From: Steve Anton Date: Fri, 19 Jan 2018 14:59:54 -0800 Subject: [PATCH] Parameterize PeerConnection crypto tests for Unified Plan Bug: webrtc:8765 Change-Id: I7ece0ecb38f033d31428bde0ff592000f8934024 Reviewed-on: https://webrtc-review.googlesource.com/40502 Commit-Queue: Steve Anton Reviewed-by: Taylor Brandstetter Cr-Commit-Position: refs/heads/master@{#21703} --- pc/peerconnection_crypto_unittest.cc | 106 +++++++++++++++------------ 1 file changed, 61 insertions(+), 45 deletions(-) diff --git a/pc/peerconnection_crypto_unittest.cc b/pc/peerconnection_crypto_unittest.cc index eb447d68b1..c6cfb90204 100644 --- a/pc/peerconnection_crypto_unittest.cc +++ b/pc/peerconnection_crypto_unittest.cc @@ -32,12 +32,14 @@ using ::testing::Combine; constexpr int kGenerateCertTimeout = 1000; -class PeerConnectionCryptoUnitTest : public ::testing::Test { +class PeerConnectionCryptoBaseTest : public ::testing::Test { protected: typedef std::unique_ptr WrapperPtr; - PeerConnectionCryptoUnitTest() - : vss_(new rtc::VirtualSocketServer()), main_(vss_.get()) { + explicit PeerConnectionCryptoBaseTest(SdpSemantics sdp_semantics) + : vss_(new rtc::VirtualSocketServer()), + main_(vss_.get()), + sdp_semantics_(sdp_semantics) { #ifdef WEBRTC_ANDROID InitializeAndroidObjects(); #endif @@ -61,8 +63,10 @@ class PeerConnectionCryptoUnitTest : public ::testing::Test { auto fake_port_allocator = rtc::MakeUnique( rtc::Thread::Current(), nullptr); auto observer = rtc::MakeUnique(); + RTCConfiguration modified_config = config; + modified_config.sdp_semantics = sdp_semantics_; auto pc = pc_factory_->CreatePeerConnection( - config, std::move(fake_port_allocator), std::move(cert_gen), + modified_config, std::move(fake_port_allocator), std::move(cert_gen), observer.get()); if (!pc) { return nullptr; @@ -107,6 +111,7 @@ class PeerConnectionCryptoUnitTest : public ::testing::Test { std::unique_ptr vss_; rtc::AutoSocketServerThread main_; rtc::scoped_refptr pc_factory_; + const SdpSemantics sdp_semantics_; }; SdpContentPredicate HaveDtlsFingerprint() { @@ -143,6 +148,13 @@ SdpContentPredicate HaveSdesGcmCryptos(size_t num_crypto_suites) { }; } +class PeerConnectionCryptoTest + : public PeerConnectionCryptoBaseTest, + public ::testing::WithParamInterface { + protected: + PeerConnectionCryptoTest() : PeerConnectionCryptoBaseTest(GetParam()) {} +}; + SdpContentMutator RemoveSdesCryptos() { return [](cricket::ContentInfo* content, cricket::TransportInfo* transport) { content->media_description()->set_cryptos({}); @@ -157,7 +169,7 @@ SdpContentMutator RemoveDtlsFingerprint() { // When DTLS is enabled, the SDP offer/answer should have a DTLS fingerprint and // no SDES cryptos. -TEST_F(PeerConnectionCryptoUnitTest, CorrectCryptoInOfferWhenDtlsEnabled) { +TEST_P(PeerConnectionCryptoTest, CorrectCryptoInOfferWhenDtlsEnabled) { RTCConfiguration config; config.enable_dtls_srtp.emplace(true); auto caller = CreatePeerConnectionWithAudioVideo(config); @@ -171,7 +183,7 @@ TEST_F(PeerConnectionCryptoUnitTest, CorrectCryptoInOfferWhenDtlsEnabled) { EXPECT_TRUE(SdpContentsAll(HaveProtocol(cricket::kMediaProtocolDtlsSavpf), offer->description())); } -TEST_F(PeerConnectionCryptoUnitTest, CorrectCryptoInAnswerWhenDtlsEnabled) { +TEST_P(PeerConnectionCryptoTest, CorrectCryptoInAnswerWhenDtlsEnabled) { RTCConfiguration config; config.enable_dtls_srtp.emplace(true); auto caller = CreatePeerConnectionWithAudioVideo(config); @@ -190,7 +202,7 @@ TEST_F(PeerConnectionCryptoUnitTest, CorrectCryptoInAnswerWhenDtlsEnabled) { // When DTLS is disabled, the SDP offer/answer should include SDES cryptos and // should not have a DTLS fingerprint. -TEST_F(PeerConnectionCryptoUnitTest, CorrectCryptoInOfferWhenDtlsDisabled) { +TEST_P(PeerConnectionCryptoTest, CorrectCryptoInOfferWhenDtlsDisabled) { RTCConfiguration config; config.enable_dtls_srtp.emplace(false); auto caller = CreatePeerConnectionWithAudioVideo(config); @@ -204,7 +216,7 @@ TEST_F(PeerConnectionCryptoUnitTest, CorrectCryptoInOfferWhenDtlsDisabled) { EXPECT_TRUE(SdpContentsAll(HaveProtocol(cricket::kMediaProtocolSavpf), offer->description())); } -TEST_F(PeerConnectionCryptoUnitTest, CorrectCryptoInAnswerWhenDtlsDisabled) { +TEST_P(PeerConnectionCryptoTest, CorrectCryptoInAnswerWhenDtlsDisabled) { RTCConfiguration config; config.enable_dtls_srtp.emplace(false); auto caller = CreatePeerConnectionWithAudioVideo(config); @@ -223,8 +235,7 @@ TEST_F(PeerConnectionCryptoUnitTest, CorrectCryptoInAnswerWhenDtlsDisabled) { // When encryption is disabled, the SDP offer/answer should have neither a DTLS // fingerprint nor any SDES crypto options. -TEST_F(PeerConnectionCryptoUnitTest, - CorrectCryptoInOfferWhenEncryptionDisabled) { +TEST_P(PeerConnectionCryptoTest, CorrectCryptoInOfferWhenEncryptionDisabled) { PeerConnectionFactoryInterface::Options options; options.disable_encryption = true; pc_factory_->SetOptions(options); @@ -242,8 +253,7 @@ TEST_F(PeerConnectionCryptoUnitTest, EXPECT_TRUE(SdpContentsAll(HaveProtocol(cricket::kMediaProtocolAvpf), offer->description())); } -TEST_F(PeerConnectionCryptoUnitTest, - CorrectCryptoInAnswerWhenEncryptionDisabled) { +TEST_P(PeerConnectionCryptoTest, CorrectCryptoInAnswerWhenEncryptionDisabled) { PeerConnectionFactoryInterface::Options options; options.disable_encryption = true; pc_factory_->SetOptions(options); @@ -268,7 +278,7 @@ TEST_F(PeerConnectionCryptoUnitTest, // should have the correct ciphers in the SDES crypto options. // With GCM cipher suites enabled, there will be 3 cryptos in the offer and 1 // in the answer. -TEST_F(PeerConnectionCryptoUnitTest, CorrectCryptoInOfferWithSdesAndGcm) { +TEST_P(PeerConnectionCryptoTest, CorrectCryptoInOfferWithSdesAndGcm) { PeerConnectionFactoryInterface::Options options; options.crypto_options.enable_gcm_crypto_suites = true; pc_factory_->SetOptions(options); @@ -283,7 +293,7 @@ TEST_F(PeerConnectionCryptoUnitTest, CorrectCryptoInOfferWithSdesAndGcm) { ASSERT_FALSE(offer->description()->contents().empty()); EXPECT_TRUE(SdpContentsAll(HaveSdesGcmCryptos(3), offer->description())); } -TEST_F(PeerConnectionCryptoUnitTest, CorrectCryptoInAnswerWithSdesAndGcm) { +TEST_P(PeerConnectionCryptoTest, CorrectCryptoInAnswerWithSdesAndGcm) { PeerConnectionFactoryInterface::Options options; options.crypto_options.enable_gcm_crypto_suites = true; pc_factory_->SetOptions(options); @@ -301,7 +311,7 @@ TEST_F(PeerConnectionCryptoUnitTest, CorrectCryptoInAnswerWithSdesAndGcm) { EXPECT_TRUE(SdpContentsAll(HaveSdesGcmCryptos(1), answer->description())); } -TEST_F(PeerConnectionCryptoUnitTest, CanSetSdesGcmRemoteOfferAndLocalAnswer) { +TEST_P(PeerConnectionCryptoTest, CanSetSdesGcmRemoteOfferAndLocalAnswer) { PeerConnectionFactoryInterface::Options options; options.crypto_options.enable_gcm_crypto_suites = true; pc_factory_->SetOptions(options); @@ -323,7 +333,7 @@ TEST_F(PeerConnectionCryptoUnitTest, CanSetSdesGcmRemoteOfferAndLocalAnswer) { // The following group tests that two PeerConnections can successfully exchange // an offer/answer when DTLS is off and that they will refuse any offer/answer // applied locally/remotely if it does not include SDES cryptos. -TEST_F(PeerConnectionCryptoUnitTest, ExchangeOfferAnswerWhenSdesOn) { +TEST_P(PeerConnectionCryptoTest, ExchangeOfferAnswerWhenSdesOn) { RTCConfiguration config; config.enable_dtls_srtp.emplace(false); auto caller = CreatePeerConnectionWithAudioVideo(config); @@ -337,8 +347,7 @@ TEST_F(PeerConnectionCryptoUnitTest, ExchangeOfferAnswerWhenSdesOn) { ASSERT_TRUE(answer); ASSERT_TRUE(caller->SetRemoteDescription(std::move(answer))); } -TEST_F(PeerConnectionCryptoUnitTest, - FailToSetLocalOfferWithNoCryptosWhenSdesOn) { +TEST_P(PeerConnectionCryptoTest, FailToSetLocalOfferWithNoCryptosWhenSdesOn) { RTCConfiguration config; config.enable_dtls_srtp.emplace(false); auto caller = CreatePeerConnectionWithAudioVideo(config); @@ -348,8 +357,7 @@ TEST_F(PeerConnectionCryptoUnitTest, EXPECT_FALSE(caller->SetLocalDescription(std::move(offer))); } -TEST_F(PeerConnectionCryptoUnitTest, - FailToSetRemoteOfferWithNoCryptosWhenSdesOn) { +TEST_P(PeerConnectionCryptoTest, FailToSetRemoteOfferWithNoCryptosWhenSdesOn) { RTCConfiguration config; config.enable_dtls_srtp.emplace(false); auto caller = CreatePeerConnectionWithAudioVideo(config); @@ -360,8 +368,7 @@ TEST_F(PeerConnectionCryptoUnitTest, EXPECT_FALSE(callee->SetRemoteDescription(std::move(offer))); } -TEST_F(PeerConnectionCryptoUnitTest, - FailToSetLocalAnswerWithNoCryptosWhenSdesOn) { +TEST_P(PeerConnectionCryptoTest, FailToSetLocalAnswerWithNoCryptosWhenSdesOn) { RTCConfiguration config; config.enable_dtls_srtp.emplace(false); auto caller = CreatePeerConnectionWithAudioVideo(config); @@ -373,8 +380,7 @@ TEST_F(PeerConnectionCryptoUnitTest, EXPECT_FALSE(callee->SetLocalDescription(std::move(answer))); } -TEST_F(PeerConnectionCryptoUnitTest, - FailToSetRemoteAnswerWithNoCryptosWhenSdesOn) { +TEST_P(PeerConnectionCryptoTest, FailToSetRemoteAnswerWithNoCryptosWhenSdesOn) { RTCConfiguration config; config.enable_dtls_srtp.emplace(false); auto caller = CreatePeerConnectionWithAudioVideo(config); @@ -390,7 +396,7 @@ TEST_F(PeerConnectionCryptoUnitTest, // The following group tests that two PeerConnections can successfully exchange // an offer/answer when DTLS is on and that they will refuse any offer/answer // applied locally/remotely if it does not include a DTLS fingerprint. -TEST_F(PeerConnectionCryptoUnitTest, ExchangeOfferAnswerWhenDtlsOn) { +TEST_P(PeerConnectionCryptoTest, ExchangeOfferAnswerWhenDtlsOn) { RTCConfiguration config; config.enable_dtls_srtp.emplace(true); auto caller = CreatePeerConnectionWithAudioVideo(config); @@ -404,7 +410,7 @@ TEST_F(PeerConnectionCryptoUnitTest, ExchangeOfferAnswerWhenDtlsOn) { ASSERT_TRUE(answer); ASSERT_TRUE(caller->SetRemoteDescription(std::move(answer))); } -TEST_F(PeerConnectionCryptoUnitTest, +TEST_P(PeerConnectionCryptoTest, FailToSetLocalOfferWithNoFingerprintWhenDtlsOn) { RTCConfiguration config; config.enable_dtls_srtp.emplace(true); @@ -415,7 +421,7 @@ TEST_F(PeerConnectionCryptoUnitTest, EXPECT_FALSE(caller->SetLocalDescription(std::move(offer))); } -TEST_F(PeerConnectionCryptoUnitTest, +TEST_P(PeerConnectionCryptoTest, FailToSetRemoteOfferWithNoFingerprintWhenDtlsOn) { RTCConfiguration config; config.enable_dtls_srtp.emplace(true); @@ -427,7 +433,7 @@ TEST_F(PeerConnectionCryptoUnitTest, EXPECT_FALSE(callee->SetRemoteDescription(std::move(offer))); } -TEST_F(PeerConnectionCryptoUnitTest, +TEST_P(PeerConnectionCryptoTest, FailToSetLocalAnswerWithNoFingerprintWhenDtlsOn) { RTCConfiguration config; config.enable_dtls_srtp.emplace(true); @@ -438,7 +444,7 @@ TEST_F(PeerConnectionCryptoUnitTest, auto answer = callee->CreateAnswer(); SdpContentsForEach(RemoveDtlsFingerprint(), answer->description()); } -TEST_F(PeerConnectionCryptoUnitTest, +TEST_P(PeerConnectionCryptoTest, FailToSetRemoteAnswerWithNoFingerprintWhenDtlsOn) { RTCConfiguration config; config.enable_dtls_srtp.emplace(true); @@ -453,7 +459,7 @@ TEST_F(PeerConnectionCryptoUnitTest, } // Test that an offer/answer can be exchanged when encryption is disabled. -TEST_F(PeerConnectionCryptoUnitTest, ExchangeOfferAnswerWhenNoEncryption) { +TEST_P(PeerConnectionCryptoTest, ExchangeOfferAnswerWhenNoEncryption) { PeerConnectionFactoryInterface::Options options; options.disable_encryption = true; pc_factory_->SetOptions(options); @@ -474,7 +480,7 @@ TEST_F(PeerConnectionCryptoUnitTest, ExchangeOfferAnswerWhenNoEncryption) { // Tests that a DTLS call can be established when the certificate is specified // in the PeerConnection config and no certificate generator is specified. -TEST_F(PeerConnectionCryptoUnitTest, +TEST_P(PeerConnectionCryptoTest, ExchangeOfferAnswerWhenDtlsCertificateInConfig) { RTCConfiguration caller_config; caller_config.enable_dtls_srtp.emplace(true); @@ -530,16 +536,20 @@ std::ostream& operator<<(std::ostream& out, CertGenResult value) { } } -class PeerConnectionCryptoDtlsCertGenUnitTest - : public PeerConnectionCryptoUnitTest, - public ::testing::WithParamInterface< - ::testing::tuple> { +class PeerConnectionCryptoDtlsCertGenTest + : public PeerConnectionCryptoBaseTest, + public ::testing::WithParamInterface> { protected: - PeerConnectionCryptoDtlsCertGenUnitTest() { - sdp_type_ = ::testing::get<0>(GetParam()); - cert_gen_time_ = ::testing::get<1>(GetParam()); - cert_gen_result_ = ::testing::get<2>(GetParam()); - concurrent_calls_ = ::testing::get<3>(GetParam()); + PeerConnectionCryptoDtlsCertGenTest() + : PeerConnectionCryptoBaseTest(std::get<0>(GetParam())) { + sdp_type_ = std::get<1>(GetParam()); + cert_gen_time_ = std::get<2>(GetParam()); + cert_gen_result_ = std::get<3>(GetParam()); + concurrent_calls_ = std::get<4>(GetParam()); } SdpType sdp_type_; @@ -548,7 +558,7 @@ class PeerConnectionCryptoDtlsCertGenUnitTest size_t concurrent_calls_; }; -TEST_P(PeerConnectionCryptoDtlsCertGenUnitTest, TestCertificateGeneration) { +TEST_P(PeerConnectionCryptoDtlsCertGenTest, TestCertificateGeneration) { RTCConfiguration config; config.enable_dtls_srtp.emplace(true); auto owned_fake_certificate_generator = @@ -600,9 +610,10 @@ TEST_P(PeerConnectionCryptoDtlsCertGenUnitTest, TestCertificateGeneration) { } INSTANTIATE_TEST_CASE_P( - PeerConnectionCryptoUnitTest, - PeerConnectionCryptoDtlsCertGenUnitTest, - Combine(Values(SdpType::kOffer, SdpType::kAnswer), + PeerConnectionCryptoTest, + PeerConnectionCryptoDtlsCertGenTest, + Combine(Values(SdpSemantics::kPlanB, SdpSemantics::kUnifiedPlan), + Values(SdpType::kOffer, SdpType::kAnswer), Values(CertGenTime::kBefore, CertGenTime::kDuring), Values(CertGenResult::kSucceed, CertGenResult::kFail), Values(1, 3))); @@ -610,7 +621,7 @@ INSTANTIATE_TEST_CASE_P( // Test that we can create and set an answer correctly when different // SSL roles have been negotiated for different transports. // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=4525 -TEST_F(PeerConnectionCryptoUnitTest, CreateAnswerWithDifferentSslRoles) { +TEST_P(PeerConnectionCryptoTest, CreateAnswerWithDifferentSslRoles) { auto caller = CreatePeerConnectionWithAudioVideo(); auto callee = CreatePeerConnectionWithAudioVideo(); @@ -661,4 +672,9 @@ TEST_F(PeerConnectionCryptoUnitTest, CreateAnswerWithDifferentSslRoles) { ASSERT_TRUE(callee->SetRemoteDescription(std::move(answer))); } +INSTANTIATE_TEST_CASE_P(PeerConnectionCryptoTest, + PeerConnectionCryptoTest, + Values(SdpSemantics::kPlanB, + SdpSemantics::kUnifiedPlan)); + } // namespace webrtc