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 <steveanton@webrtc.org>
Reviewed-by: Taylor Brandstetter <deadbeef@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#21703}
diff --git a/pc/peerconnection_crypto_unittest.cc b/pc/peerconnection_crypto_unittest.cc
index eb447d6..c6cfb90 100644
--- a/pc/peerconnection_crypto_unittest.cc
+++ b/pc/peerconnection_crypto_unittest.cc
@@ -32,12 +32,14 @@
 
 constexpr int kGenerateCertTimeout = 1000;
 
-class PeerConnectionCryptoUnitTest : public ::testing::Test {
+class PeerConnectionCryptoBaseTest : public ::testing::Test {
  protected:
   typedef std::unique_ptr<PeerConnectionWrapper> 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 @@
     auto fake_port_allocator = rtc::MakeUnique<cricket::FakePortAllocator>(
         rtc::Thread::Current(), nullptr);
     auto observer = rtc::MakeUnique<MockPeerConnectionObserver>();
+    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 @@
   std::unique_ptr<rtc::VirtualSocketServer> vss_;
   rtc::AutoSocketServerThread main_;
   rtc::scoped_refptr<PeerConnectionFactoryInterface> pc_factory_;
+  const SdpSemantics sdp_semantics_;
 };
 
 SdpContentPredicate HaveDtlsFingerprint() {
@@ -143,6 +148,13 @@
   };
 }
 
+class PeerConnectionCryptoTest
+    : public PeerConnectionCryptoBaseTest,
+      public ::testing::WithParamInterface<SdpSemantics> {
+ protected:
+  PeerConnectionCryptoTest() : PeerConnectionCryptoBaseTest(GetParam()) {}
+};
+
 SdpContentMutator RemoveSdesCryptos() {
   return [](cricket::ContentInfo* content, cricket::TransportInfo* transport) {
     content->media_description()->set_cryptos({});
@@ -157,7 +169,7 @@
 
 // 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 @@
   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 @@
 
 // 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 @@
   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 @@
 
 // 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 @@
   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 @@
 // 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 @@
   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 @@
   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 @@
 // 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 @@
   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 @@
 
   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 @@
 
   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 @@
 
   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 @@
 // 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 @@
   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 @@
 
   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 @@
 
   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 @@
   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 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 @@
 
 // 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 @@
   }
 }
 
-class PeerConnectionCryptoDtlsCertGenUnitTest
-    : public PeerConnectionCryptoUnitTest,
-      public ::testing::WithParamInterface<
-          ::testing::tuple<SdpType, CertGenTime, CertGenResult, size_t>> {
+class PeerConnectionCryptoDtlsCertGenTest
+    : public PeerConnectionCryptoBaseTest,
+      public ::testing::WithParamInterface<std::tuple<SdpSemantics,
+                                                      SdpType,
+                                                      CertGenTime,
+                                                      CertGenResult,
+                                                      size_t>> {
  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 @@
   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 @@
 }
 
 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 @@
 // 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 @@
   ASSERT_TRUE(callee->SetRemoteDescription(std::move(answer)));
 }
 
+INSTANTIATE_TEST_CASE_P(PeerConnectionCryptoTest,
+                        PeerConnectionCryptoTest,
+                        Values(SdpSemantics::kPlanB,
+                               SdpSemantics::kUnifiedPlan));
+
 }  // namespace webrtc