Bug 1379265 - Add RsdparsaSdpParser to sdp_unittests; r?bwc draft
authorDan Minor <dminor@mozilla.com>
Tue, 23 Jan 2018 14:24:44 -0500
changeset 756282 8a9530aa7df843bd8dbf9a777b6474a45c4d59ad
parent 756281 16cdbb8eb1bc91304a7495cee25c60f60a486364
push id99458
push userbmo:dminor@mozilla.com
push dateFri, 16 Feb 2018 19:57:29 +0000
reviewersbwc
bugs1379265
milestone60.0a1
Bug 1379265 - Add RsdparsaSdpParser to sdp_unittests; r?bwc This adds a bool parameter that allows the tests to run with either the Sipcc or Rust SDP parsers. The tests were changed as follows: One chunk of SDP ws missing a s= line, which is non-optional as was added. Some of the SDP had a=ice-lite as a media attribute, but it is only supposed to be a session attribute, and so the media attribute was removed. MozReview-Commit-ID: K45ynsVvmnB
media/webrtc/signaling/gtest/sdp_unittests.cpp
--- a/media/webrtc/signaling/gtest/sdp_unittests.cpp
+++ b/media/webrtc/signaling/gtest/sdp_unittests.cpp
@@ -13,30 +13,33 @@
 #include "gtest/gtest.h"
 
 #include "nspr.h"
 #include "nss.h"
 #include "ssl.h"
 
 #include "nsThreadUtils.h"
 
+#include "signaling/src/sdp/RsdparsaSdpParser.h"
 #include "signaling/src/sdp/SipccSdpParser.h"
 #include "signaling/src/sdp/SdpMediaSection.h"
 #include "signaling/src/sdp/SdpAttribute.h"
 
 extern "C" {
 #include "signaling/src/sdp/sipcc/sdp.h"
 #include "signaling/src/sdp/sipcc/sdp_private.h"
 }
 
 #ifdef CRLF
 #undef CRLF
 #endif
 #define CRLF "\r\n"
 
+#define SKIP_TEST_WITH_RUST_PARSER if (!::testing::get<1>(GetParam())) {return;}
+
 using namespace mozilla;
 
 namespace test {
 
 class SdpTest : public ::testing::Test {
   public:
     SdpTest() : sdp_ptr_(nullptr) {
     }
@@ -1495,66 +1498,75 @@ TEST_F(SdpTest, parseIceLite) {
         "t=0 0\r\n"
         "a=ice-lite\r\n";
   ParseSdp(sdp);
   ASSERT_TRUE(sdp_attr_is_present(sdp_ptr_, SDP_ATTR_ICE_LITE,
                                   SDP_SESSION_LEVEL, 0));
 }
 
 class NewSdpTest : public ::testing::Test,
-                   public ::testing::WithParamInterface<bool> {
+                   public ::testing::WithParamInterface<
+                     ::testing::tuple<bool, bool> > {
   public:
     NewSdpTest() {}
 
     void ParseSdp(const std::string &sdp, bool expectSuccess = true) {
-      mSdp = mozilla::Move(mParser.Parse(sdp));
+      if (::testing::get<1>(GetParam())) {
+        mSdpErrorHolder = &mSipccParser;
+        mSdp = mozilla::Move(mSipccParser.Parse(sdp));
+      } else {
+        mSdpErrorHolder = &mRustParser;
+        mSdp = mozilla::Move(mRustParser.Parse(sdp));
+      }
 
       // Are we configured to do a parse and serialize before actually
       // running the test?
-      if (GetParam()) {
+      if (::testing::get<0>(GetParam())) {
         std::stringstream os;
 
         if (expectSuccess) {
           ASSERT_TRUE(!!mSdp) << "Parse failed on first pass: "
                               << GetParseErrors();
         }
 
         if (mSdp) {
           // Serialize and re-parse
           mSdp->Serialize(os);
-          mSdp = mozilla::Move(mParser.Parse(os.str()));
+          if (::testing::get<1>(GetParam())) {
+            mSdp = mozilla::Move(mSipccParser.Parse(os.str()));
+          } else {
+            mSdp = mozilla::Move(mRustParser.Parse(os.str()));
+          }
 
           // Whether we expected the parse to work or not, it should
           // succeed the second time if it succeeded the first.
           ASSERT_TRUE(!!mSdp) << "Parse failed on second pass, SDP was: "
             << std::endl << os.str() <<  std::endl
             << "Errors were: " << GetParseErrors();
 
           // Serialize again and compare
           std::stringstream os2;
           mSdp->Serialize(os2);
           ASSERT_EQ(os.str(), os2.str());
         }
       }
 
       if (expectSuccess) {
         ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
-        ASSERT_EQ(0U, mParser.GetParseErrors().size())
+        ASSERT_EQ(0U, mSdpErrorHolder->GetParseErrors().size())
                   << "Got unexpected parse errors/warnings: "
                   << GetParseErrors();
       }
     }
 
     // For streaming parse errors
     std::string GetParseErrors() const {
       std::stringstream output;
-      for (auto e = mParser.GetParseErrors().begin();
-           e != mParser.GetParseErrors().end();
-           ++e) {
-        output << e->first << ": " << e->second << std::endl;
+      for (auto e: mSdpErrorHolder->GetParseErrors()) {
+        output << e.first << ": " << e.second << std::endl;
       }
       return output.str();
     }
 
     void CheckRtpmap(const std::string& expected_pt,
                      SdpRtpmapAttributeList::CodecType codec,
                      const std::string& name,
                      uint32_t clock,
@@ -1612,54 +1624,56 @@ class NewSdpTest : public ::testing::Tes
 
     void CheckSerialize(const std::string& expected,
                         const SdpAttribute& attr) const {
       std::stringstream str;
       attr.Serialize(str);
       ASSERT_EQ(expected, str.str());
     }
 
-    SipccSdpParser mParser;
+    SdpErrorHolder* mSdpErrorHolder;
+    SipccSdpParser mSipccParser;
+    RsdparsaSdpParser mRustParser;
     mozilla::UniquePtr<Sdp> mSdp;
 }; // class NewSdpTest
 
 TEST_P(NewSdpTest, CreateDestroy) {
 }
 
 TEST_P(NewSdpTest, ParseEmpty) {
   ParseSdp("", false);
   ASSERT_FALSE(mSdp);
-  ASSERT_NE(0U, mParser.GetParseErrors().size())
+  ASSERT_NE(0U, mSdpErrorHolder->GetParseErrors().size())
     << "Expected at least one parse error.";
 }
 
 const std::string kBadSdp = "This is SDPARTA!!!!";
 
 TEST_P(NewSdpTest, ParseGarbage) {
   ParseSdp(kBadSdp, false);
   ASSERT_FALSE(mSdp);
-  ASSERT_NE(0U, mParser.GetParseErrors().size())
+  ASSERT_NE(0U, mSdpErrorHolder->GetParseErrors().size())
     << "Expected at least one parse error.";
 }
 
 TEST_P(NewSdpTest, ParseGarbageTwice) {
   ParseSdp(kBadSdp, false);
   ASSERT_FALSE(mSdp);
-  size_t errorCount = mParser.GetParseErrors().size();
+  size_t errorCount = mSdpErrorHolder->GetParseErrors().size();
   ASSERT_NE(0U, errorCount)
     << "Expected at least one parse error.";
   ParseSdp(kBadSdp, false);
   ASSERT_FALSE(mSdp);
-  ASSERT_EQ(errorCount, mParser.GetParseErrors().size())
+  ASSERT_EQ(errorCount, mSdpErrorHolder->GetParseErrors().size())
     << "Expected same error count for same SDP.";
 }
 
 TEST_P(NewSdpTest, ParseMinimal) {
   ParseSdp(kVideoSdp);
-  ASSERT_EQ(0U, mParser.GetParseErrors().size()) <<
+  ASSERT_EQ(0U, mSdpErrorHolder->GetParseErrors().size()) <<
     "Got parse errors: " << GetParseErrors();
 }
 
 TEST_P(NewSdpTest, CheckOriginGetUsername) {
   ParseSdp(kVideoSdp);
   ASSERT_EQ("-", mSdp->GetOrigin().GetUsername())
     << "Wrong username in origin";
 }
@@ -1766,16 +1780,17 @@ TEST_P(NewSdpTest, CheckMediaSectionGetM
   ParseSdp(kVideoSdp);
   ASSERT_EQ(0U, mSdp->GetMediaSection(0).GetBandwidth("CT"))
     << "Wrong bandwidth in media section";
 }
 
 TEST_P(NewSdpTest, CheckMediaSectionGetBandwidth) {
   ParseSdp("v=0\r\n"
            "o=- 4294967296 2 IN IP4 127.0.0.1\r\n"
+           "s=SIP Call\r\n"
            "c=IN IP4 198.51.100.7\r\n"
            "t=0 0\r\n"
            "m=video 56436 RTP/SAVPF 120\r\n"
            "b=CT:1000\r\n"
            "a=rtpmap:120 VP8/90000\r\n");
   ASSERT_EQ(1000U, mSdp->GetMediaSection(0).GetBandwidth("CT"))
     << "Wrong bandwidth in media section";
 }
@@ -1875,26 +1890,26 @@ const std::string kBasicAudioVideoOffer 
 "a=ssrc:1111 foo:bar" CRLF
 "a=imageattr:120 send * recv *" CRLF
 "a=imageattr:121 send [x=640,y=480] recv [x=640,y=480]" CRLF
 "a=simulcast:recv pt=120;121" CRLF
 "a=rid:bar recv pt=96;max-width=800;max-height=600" CRLF
 "m=audio 9 RTP/SAVPF 0" CRLF
 "a=mid:third" CRLF
 "a=rtpmap:0 PCMU/8000" CRLF
-"a=ice-lite" CRLF
 "a=ice-options:foo bar" CRLF
 "a=msid:noappdata" CRLF
 "a=bundle-only" CRLF;
 
 TEST_P(NewSdpTest, BasicAudioVideoSdpParse) {
   ParseSdp(kBasicAudioVideoOffer);
 }
 
 TEST_P(NewSdpTest, CheckRemoveFmtp) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432918
   ParseSdp(kBasicAudioVideoOffer);
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_EQ(3U, mSdp->GetMediaSectionCount())
     << "Wrong number of media sections";
 
   SdpAttributeList& audioAttrList = mSdp->GetMediaSection(0).GetAttributeList();
 
   ASSERT_TRUE(audioAttrList.HasAttribute(SdpAttribute::kFmtpAttribute));
@@ -2037,16 +2052,17 @@ TEST_P(NewSdpTest, CheckIdentity) {
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_TRUE(mSdp->GetAttributeList().HasAttribute(
         SdpAttribute::kIdentityAttribute));
   auto identity = mSdp->GetAttributeList().GetIdentity();
   ASSERT_EQ(LONG_IDENTITY, identity) << "Wrong identity assertion";
 }
 
 TEST_P(NewSdpTest, CheckDtlsMessage) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432920
   ParseSdp(kBasicAudioVideoOffer);
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_TRUE(mSdp->GetAttributeList().HasAttribute(
         SdpAttribute::kDtlsMessageAttribute));
   auto dtls_message = mSdp->GetAttributeList().GetDtlsMessage();
   ASSERT_EQ(SdpDtlsMessageAttribute::kClient, dtls_message.mRole)
     << "Wrong dtls-message role";
   ASSERT_EQ(BASE64_DTLS_HELLO, dtls_message.mValue)
@@ -2237,16 +2253,17 @@ static const std::string kAudioWithTelep
   "a=ptime:20" CRLF
   "a=maxptime:20" CRLF
   "a=rtpmap:9 G722/8000" CRLF
   "a=rtpmap:0 PCMU/8000" CRLF
   "a=rtpmap:8 PCMA/8000" CRLF
   "a=rtpmap:101 telephone-event/8000" CRLF;
 
 TEST_P(NewSdpTest, CheckTelephoneEventNoFmtp) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432918
   ParseSdp(kAudioWithTelephoneEvent);
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_EQ(1U, mSdp->GetMediaSectionCount())
     << "Wrong number of media sections";
 
   ASSERT_TRUE(mSdp->GetMediaSection(0).GetAttributeList().HasAttribute(
               SdpAttribute::kFmtpAttribute));
   auto audio_format_params =
@@ -2255,108 +2272,118 @@ TEST_P(NewSdpTest, CheckTelephoneEventNo
 
   // make sure we don't get a fmtp for codec 101
   for (size_t i = 0; i < audio_format_params.size(); ++i) {
     ASSERT_NE("101", audio_format_params[i].format);
   }
 }
 
 TEST_P(NewSdpTest, CheckTelephoneEventWithDefaultEvents) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432918
   ParseSdp(kAudioWithTelephoneEvent
            + "a=fmtp:101 0-15" CRLF);
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_EQ(1U, mSdp->GetMediaSectionCount())
     << "Wrong number of media sections";
 
   CheckDtmfFmtp("0-15");
 }
 
 TEST_P(NewSdpTest, CheckTelephoneEventWithBadCharacter) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432918
   ParseSdp(kAudioWithTelephoneEvent
            + "a=fmtp:101 0-5." CRLF);
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_EQ(1U, mSdp->GetMediaSectionCount())
     << "Wrong number of media sections";
 
   CheckDtmfFmtp("0-15");
 }
 
 TEST_P(NewSdpTest, CheckTelephoneEventIncludingCommas) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432918
   ParseSdp(kAudioWithTelephoneEvent
            + "a=fmtp:101 0-15,66,67" CRLF);
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_EQ(1U, mSdp->GetMediaSectionCount())
     << "Wrong number of media sections";
 
   CheckDtmfFmtp("0-15,66,67");
 }
 
 TEST_P(NewSdpTest, CheckTelephoneEventComplexEvents) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432918
   ParseSdp(kAudioWithTelephoneEvent
            + "a=fmtp:101 0,1,2-4,5-15,66,67" CRLF);
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_EQ(1U, mSdp->GetMediaSectionCount())
     << "Wrong number of media sections";
 
   CheckDtmfFmtp("0,1,2-4,5-15,66,67");
 }
 
 TEST_P(NewSdpTest, CheckTelephoneEventNoHyphen) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432918
   ParseSdp(kAudioWithTelephoneEvent
            + "a=fmtp:101 5,6,7" CRLF);
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_EQ(1U, mSdp->GetMediaSectionCount())
     << "Wrong number of media sections";
 
   CheckDtmfFmtp("5,6,7");
 }
 
 TEST_P(NewSdpTest, CheckTelephoneEventOnlyZero) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432918
   ParseSdp(kAudioWithTelephoneEvent
            + "a=fmtp:101 0" CRLF);
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_EQ(1U, mSdp->GetMediaSectionCount())
     << "Wrong number of media sections";
 
   CheckDtmfFmtp("0");
 }
 
 TEST_P(NewSdpTest, CheckTelephoneEventOnlyOne) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432918
   ParseSdp(kAudioWithTelephoneEvent
            + "a=fmtp:101 1" CRLF);
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_EQ(1U, mSdp->GetMediaSectionCount())
     << "Wrong number of media sections";
 
   CheckDtmfFmtp("1");
 }
 
 TEST_P(NewSdpTest, CheckTelephoneEventBadThreeDigit) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432918
   ParseSdp(kAudioWithTelephoneEvent
            + "a=fmtp:101 123" CRLF);
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_EQ(1U, mSdp->GetMediaSectionCount())
     << "Wrong number of media sections";
 
   // check for the default dtmf tones
   CheckDtmfFmtp("0-15");
 }
 
 TEST_P(NewSdpTest, CheckTelephoneEventBadThreeDigitWithHyphen) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432918
   ParseSdp(kAudioWithTelephoneEvent
            + "a=fmtp:101 0-123" CRLF);
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_EQ(1U, mSdp->GetMediaSectionCount())
     << "Wrong number of media sections";
 
   // check for the default dtmf tones
   CheckDtmfFmtp("0-15");
 }
 
 TEST_P(NewSdpTest, CheckTelephoneEventBadLeadingHyphen) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432918
   ParseSdp(kAudioWithTelephoneEvent
            + "a=fmtp:101 -12" CRLF);
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_EQ(1U, mSdp->GetMediaSectionCount())
     << "Wrong number of media sections";
 
   // check for the default dtmf tones
   CheckDtmfFmtp("0-15");
@@ -2368,82 +2395,89 @@ TEST_P(NewSdpTest, CheckTelephoneEventBa
 }
 
 TEST_P(NewSdpTest, CheckTelephoneEventBadTrailingHyphenInMiddle) {
   ParseSdp(kAudioWithTelephoneEvent
            + "a=fmtp:101 1,12-,4" CRLF, false);
 }
 
 TEST_P(NewSdpTest, CheckTelephoneEventBadLeadingComma) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432918
   ParseSdp(kAudioWithTelephoneEvent
            + "a=fmtp:101 ,2,3" CRLF);
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_EQ(1U, mSdp->GetMediaSectionCount())
     << "Wrong number of media sections";
 
   // check for the default dtmf tones
   CheckDtmfFmtp("0-15");
 }
 
 TEST_P(NewSdpTest, CheckTelephoneEventBadMultipleLeadingComma) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432918
   ParseSdp(kAudioWithTelephoneEvent
            + "a=fmtp:101 ,,,2,3" CRLF);
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_EQ(1U, mSdp->GetMediaSectionCount())
     << "Wrong number of media sections";
 
   // check for the default dtmf tones
   CheckDtmfFmtp("0-15");
 }
 
 TEST_P(NewSdpTest, CheckTelephoneEventBadConsecutiveCommas) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432918
   ParseSdp(kAudioWithTelephoneEvent
            + "a=fmtp:101 1,,,,,,,,3" CRLF);
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_EQ(1U, mSdp->GetMediaSectionCount())
     << "Wrong number of media sections";
 
   // check for the default dtmf tones
   CheckDtmfFmtp("0-15");
 }
 
 TEST_P(NewSdpTest, CheckTelephoneEventBadTrailingComma) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432918
   ParseSdp(kAudioWithTelephoneEvent
            + "a=fmtp:101 1,2,3," CRLF);
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_EQ(1U, mSdp->GetMediaSectionCount())
     << "Wrong number of media sections";
 
   // check for the default dtmf tones
   CheckDtmfFmtp("0-15");
 }
 
 TEST_P(NewSdpTest, CheckTelephoneEventBadTwoHyphens) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432918
   ParseSdp(kAudioWithTelephoneEvent
            + "a=fmtp:101 1-2-3" CRLF);
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_EQ(1U, mSdp->GetMediaSectionCount())
     << "Wrong number of media sections";
 
   // check for the default dtmf tones
   CheckDtmfFmtp("0-15");
 }
 
 TEST_P(NewSdpTest, CheckTelephoneEventBadSixDigit) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432918
   ParseSdp(kAudioWithTelephoneEvent
            + "a=fmtp:101 112233" CRLF);
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_EQ(1U, mSdp->GetMediaSectionCount())
     << "Wrong number of media sections";
 
   // check for the default dtmf tones
   CheckDtmfFmtp("0-15");
 }
 
 TEST_P(NewSdpTest, CheckTelephoneEventBadRangeReversed) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432918
   ParseSdp(kAudioWithTelephoneEvent
            + "a=fmtp:101 33-2" CRLF);
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_EQ(1U, mSdp->GetMediaSectionCount())
     << "Wrong number of media sections";
 
   // check for the default dtmf tones
   CheckDtmfFmtp("0-15");
@@ -2463,16 +2497,17 @@ static const std::string kVideoWithRedAn
   "a=rtpmap:120 VP8/90000" CRLF
   "a=fmtp:120 max-fs=3600;max-fr=30" CRLF
   "a=rtpmap:121 VP9/90000" CRLF
   "a=fmtp:121 max-fs=3600;max-fr=30" CRLF
   "a=rtpmap:122 red/90000" CRLF
   "a=rtpmap:123 ulpfec/90000" CRLF;
 
 TEST_P(NewSdpTest, CheckRedNoFmtp) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432918
   ParseSdp(kVideoWithRedAndUlpfecSdp);
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_EQ(1U, mSdp->GetMediaSectionCount())
     << "Wrong number of media sections";
 
   ASSERT_TRUE(mSdp->GetMediaSection(0).GetAttributeList().HasAttribute(
               SdpAttribute::kFmtpAttribute));
   auto video_format_params =
@@ -2481,18 +2516,19 @@ TEST_P(NewSdpTest, CheckRedNoFmtp) {
 
   // make sure we don't get a fmtp for codec 122
   for (size_t i = 0; i < video_format_params.size(); ++i) {
     ASSERT_NE("122", video_format_params[i].format);
   }
 }
 
 TEST_P(NewSdpTest, CheckRedEmptyFmtp) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432918
   // if serializing and re-parsing, we expect errors
-  if (GetParam()) {
+  if (::testing::get<0>(GetParam())) {
     ParseSdp(kVideoWithRedAndUlpfecSdp + "a=fmtp:122" CRLF);
   } else {
     ParseSdp(kVideoWithRedAndUlpfecSdp + "a=fmtp:122" CRLF, false);
     ASSERT_NE(0U, GetParseErrors().size());
   }
 
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_EQ(1U, mSdp->GetMediaSectionCount())
@@ -2506,16 +2542,17 @@ TEST_P(NewSdpTest, CheckRedEmptyFmtp) {
 
   // make sure we don't get a fmtp for codec 122
   for (size_t i = 0; i < video_format_params.size(); ++i) {
     ASSERT_NE("122", video_format_params[i].format);
   }
 }
 
 TEST_P(NewSdpTest, CheckRedFmtpWith2Codecs) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432918
   ParseSdp(kVideoWithRedAndUlpfecSdp + "a=fmtp:122 120/121" CRLF);
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_EQ(1U, mSdp->GetMediaSectionCount())
     << "Wrong number of media sections";
 
   ASSERT_TRUE(mSdp->GetMediaSection(0).GetAttributeList().HasAttribute(
               SdpAttribute::kFmtpAttribute));
   auto video_format_params =
@@ -2530,16 +2567,17 @@ TEST_P(NewSdpTest, CheckRedFmtpWith2Code
       static_cast<SdpFmtpAttributeList::RedParameters*>(
         video_format_params[3].parameters.get()));
   ASSERT_EQ(2U, red_parameters->encodings.size());
   ASSERT_EQ(120U, red_parameters->encodings[0]);
   ASSERT_EQ(121U, red_parameters->encodings[1]);
 }
 
 TEST_P(NewSdpTest, CheckRedFmtpWith3Codecs) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432918
   ParseSdp(kVideoWithRedAndUlpfecSdp + "a=fmtp:122 120/121/123" CRLF);
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_EQ(1U, mSdp->GetMediaSectionCount())
     << "Wrong number of media sections";
 
   ASSERT_TRUE(mSdp->GetMediaSection(0).GetAttributeList().HasAttribute(
               SdpAttribute::kFmtpAttribute));
   auto video_format_params =
@@ -2620,20 +2658,20 @@ const std::string kH264AudioVideoOffer =
 "a=candidate:6 2 UDP 16515070 162.222.183.171 64941 typ relay raddr 162.222.183.171 rport 64941" CRLF
 "a=candidate:6 1 UDP 16515071 162.222.183.171 64800 typ relay raddr 162.222.183.171 rport 64800" CRLF
 "a=candidate:2 1 UDP 1694236671 24.6.134.204 59530 typ srflx raddr 10.0.0.36 rport 59530" CRLF
 "a=candidate:3 1 UDP 100401151 162.222.183.171 62935 typ relay raddr 162.222.183.171 rport 62935" CRLF
 "a=candidate:3 2 UDP 100401150 162.222.183.171 61026 typ relay raddr 162.222.183.171 rport 61026" CRLF
 "m=audio 9 RTP/SAVPF 0" CRLF
 "a=mid:third" CRLF
 "a=rtpmap:0 PCMU/8000" CRLF
-"a=ice-lite" CRLF
 "a=msid:noappdata" CRLF;
 
 TEST_P(NewSdpTest, CheckFormatParameters) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432918
   ParseSdp(kH264AudioVideoOffer);
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_EQ(3U, mSdp->GetMediaSectionCount())
     << "Wrong number of media sections";
 
   ASSERT_TRUE(mSdp->GetMediaSection(0).GetAttributeList().HasAttribute(
       SdpAttribute::kFmtpAttribute));
   auto audio_format_params =
@@ -2776,16 +2814,17 @@ TEST_P(NewSdpTest, CheckDirections) {
             mSdp->GetMediaSection(0).GetAttributeList().GetDirection());
   ASSERT_EQ(SdpDirectionAttribute::kRecvonly,
             mSdp->GetMediaSection(1).GetAttributeList().GetDirection());
   ASSERT_EQ(SdpDirectionAttribute::kSendrecv,
             mSdp->GetMediaSection(2).GetAttributeList().GetDirection());
 }
 
 TEST_P(NewSdpTest, CheckCandidates) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432920
   ParseSdp(kBasicAudioVideoOffer);
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_EQ(3U, mSdp->GetMediaSectionCount()) << "Wrong number of media sections";
 
   ASSERT_TRUE(mSdp->GetMediaSection(0).GetAttributeList().HasAttribute(
       SdpAttribute::kCandidateAttribute));
   auto audio_candidates =
       mSdp->GetMediaSection(0).GetAttributeList().GetCandidate();
@@ -3003,22 +3042,24 @@ const std::string kBasicAudioVideoDataOf
 "a=setup:actpass" CRLF
 "a=rtcp-mux" CRLF
 "m=application 9 DTLS/SCTP 5000" CRLF
 "c=IN IP4 0.0.0.0" CRLF
 "a=sctpmap:5000 webrtc-datachannel 16" CRLF
 "a=setup:actpass" CRLF;
 
 TEST_P(NewSdpTest, BasicAudioVideoDataSdpParse) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432922
   ParseSdp(kBasicAudioVideoDataOffer);
-  ASSERT_EQ(0U, mParser.GetParseErrors().size()) <<
+  ASSERT_EQ(0U, mSdpErrorHolder->GetParseErrors().size()) <<
     "Got parse errors: " << GetParseErrors();
 }
 
 TEST_P(NewSdpTest, CheckApplicationParameters) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432922
   ParseSdp(kBasicAudioVideoDataOffer);
   ASSERT_TRUE(!!mSdp);
   ASSERT_EQ(3U, mSdp->GetMediaSectionCount()) << "Wrong number of media sections";
   ASSERT_EQ(SdpMediaSection::kAudio, mSdp->GetMediaSection(0).GetMediaType())
     << "Wrong type for first media section";
   ASSERT_EQ(SdpMediaSection::kVideo, mSdp->GetMediaSection(1).GetMediaType())
     << "Wrong type for second media section";
   ASSERT_EQ(SdpMediaSection::kApplication, mSdp->GetMediaSection(2).GetMediaType())
@@ -3039,16 +3080,17 @@ TEST_P(NewSdpTest, CheckApplicationParam
 
   ASSERT_TRUE(mSdp->GetMediaSection(2).GetAttributeList().HasAttribute(
       SdpAttribute::kSetupAttribute));
   ASSERT_EQ(SdpSetupAttribute::kActpass,
       mSdp->GetMediaSection(2).GetAttributeList().GetSetup().mRole);
 }
 
 TEST_P(NewSdpTest, CheckExtmap) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432922
   ParseSdp(kBasicAudioVideoDataOffer);
   ASSERT_TRUE(!!mSdp);
   ASSERT_EQ(3U, mSdp->GetMediaSectionCount()) << "Wrong number of media sections";
 
   ASSERT_TRUE(mSdp->GetMediaSection(0).GetAttributeList().HasAttribute(
         SdpAttribute::kExtmapAttribute));
 
   auto extmaps =
@@ -3074,16 +3116,17 @@ TEST_P(NewSdpTest, CheckExtmap) {
   ASSERT_FALSE(extmaps[2].direction_specified);
   ASSERT_EQ("some_other_extension",
       extmaps[2].extensionname);
   ASSERT_EQ("some_params some more params",
       extmaps[2].extensionattributes);
 }
 
 TEST_P(NewSdpTest, CheckRtcpFb) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432922
   ParseSdp(kBasicAudioVideoDataOffer);
   ASSERT_TRUE(!!mSdp);
   ASSERT_EQ(3U, mSdp->GetMediaSectionCount()) << "Wrong number of media sections";
 
   auto& video_attrs = mSdp->GetMediaSection(1).GetAttributeList();
   ASSERT_TRUE(video_attrs.HasAttribute(SdpAttribute::kRtcpFbAttribute));
   auto& rtcpfbs = video_attrs.GetRtcpFb().mFeedbacks;
   ASSERT_EQ(20U, rtcpfbs.size());
@@ -3175,16 +3218,17 @@ TEST_P(NewSdpTest, CheckImageattr)
   ASSERT_EQ(1U, imageattr_1.recvSets[0].xRange.discreteValues.size());
   ASSERT_EQ(640U, imageattr_1.recvSets[0].xRange.discreteValues.front());
   ASSERT_EQ(1U, imageattr_1.recvSets[0].yRange.discreteValues.size());
   ASSERT_EQ(480U, imageattr_1.recvSets[0].yRange.discreteValues.front());
 }
 
 TEST_P(NewSdpTest, CheckSimulcast)
 {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432920
   ParseSdp(kBasicAudioVideoOffer);
   ASSERT_TRUE(!!mSdp);
   ASSERT_EQ(3U, mSdp->GetMediaSectionCount()) << "Wrong number of media sections";
 
   ASSERT_FALSE(mSdp->GetAttributeList().HasAttribute(
         SdpAttribute::kSimulcastAttribute));
   ASSERT_FALSE(mSdp->GetMediaSection(0).GetAttributeList().HasAttribute(
         SdpAttribute::kSimulcastAttribute));
@@ -3202,16 +3246,17 @@ TEST_P(NewSdpTest, CheckSimulcast)
   ASSERT_EQ("120", simulcast.recvVersions[0].choices[0]);
   ASSERT_EQ(1U, simulcast.recvVersions[1].choices.size());
   ASSERT_EQ("121", simulcast.recvVersions[1].choices[0]);
   ASSERT_EQ(SdpSimulcastAttribute::Versions::kPt,
             simulcast.recvVersions.type);
 }
 
 TEST_P(NewSdpTest, CheckSctpmap) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432922
   ParseSdp(kBasicAudioVideoDataOffer);
   ASSERT_TRUE(!!mSdp) << "Parse failed: " << GetParseErrors();
   ASSERT_EQ(3U, mSdp->GetMediaSectionCount())
     << "Wrong number of media sections";
 
   const SdpMediaSection& appsec = mSdp->GetMediaSection(2);
   ASSERT_TRUE(
       appsec.GetAttributeList().HasAttribute(SdpAttribute::kSctpmapAttribute));
@@ -3245,17 +3290,18 @@ const std::string kNewSctpportOfferDraft
 "a=setup:actpass" CRLF;
 
 TEST_P(NewSdpTest, NewSctpportSdpParse) {
   ParseSdp(kNewSctpportOfferDraft21, false);
 }
 
 INSTANTIATE_TEST_CASE_P(RoundTripSerialize,
                         NewSdpTest,
-                        ::testing::Values(false, true));
+                        ::testing::Combine(::testing::Bool(),
+                                           ::testing::Bool()));
 
 const std::string kCandidateInSessionSDP =
 "v=0" CRLF
 "o=Mozilla-SIPUA-35.0a1 5184 0 IN IP4 0.0.0.0" CRLF
 "s=SIP Call" CRLF
 "c=IN IP4 224.0.0.1/100/12" CRLF
 "t=0 0" CRLF
 "a=candidate:0 1 UDP 2130379007 10.0.0.36 62453 typ host" CRLF
@@ -3696,86 +3742,92 @@ const std::string kMalformedImageattr =
 "t=0 0" CRLF
 "m=video 9 RTP/SAVPF 120" CRLF
 "c=IN IP4 0.0.0.0" CRLF
 "a=rtpmap:120 VP8/90000" CRLF
 "a=imageattr:flob" CRLF;
 
 TEST_P(NewSdpTest, CheckMalformedImageattr)
 {
-  if (GetParam()) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432930
+  if (::testing::get<0>(GetParam())) {
     // Don't do a parse/serialize before running this test
     return;
   }
 
   ParseSdp(kMalformedImageattr, false);
   ASSERT_NE("", GetParseErrors());
 }
 
 TEST_P(NewSdpTest, ParseInvalidSimulcastNoSuchSendRid) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432931
   ParseSdp("v=0" CRLF
            "o=- 4294967296 2 IN IP4 127.0.0.1" CRLF
            "s=SIP Call" CRLF
            "c=IN IP4 198.51.100.7" CRLF
            "b=CT:5000" CRLF
            "t=0 0" CRLF
            "m=video 56436 RTP/SAVPF 120" CRLF
            "a=rtpmap:120 VP8/90000" CRLF
            "a=sendrecv" CRLF
            "a=simulcast: send rid=9" CRLF,
            false);
   ASSERT_NE("", GetParseErrors());
 }
 
 TEST_P(NewSdpTest, ParseInvalidSimulcastNoSuchRecvRid) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432932
   ParseSdp("v=0" CRLF
            "o=- 4294967296 2 IN IP4 127.0.0.1" CRLF
            "s=SIP Call" CRLF
            "c=IN IP4 198.51.100.7" CRLF
            "b=CT:5000" CRLF
            "t=0 0" CRLF
            "m=video 56436 RTP/SAVPF 120" CRLF
            "a=rtpmap:120 VP8/90000" CRLF
            "a=sendrecv" CRLF
            "a=simulcast: recv rid=9" CRLF,
            false);
   ASSERT_NE("", GetParseErrors());
 }
 
 TEST_P(NewSdpTest, ParseInvalidSimulcastNoSuchPt) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432933
   ParseSdp("v=0" CRLF
            "o=- 4294967296 2 IN IP4 127.0.0.1" CRLF
            "s=SIP Call" CRLF
            "c=IN IP4 198.51.100.7" CRLF
            "b=CT:5000" CRLF
            "t=0 0" CRLF
            "m=video 56436 RTP/SAVPF 120" CRLF
            "a=rtpmap:120 VP8/90000" CRLF
            "a=sendrecv" CRLF
            "a=simulcast: send pt=9" CRLF,
            false);
   ASSERT_NE("", GetParseErrors());
 }
 
 TEST_P(NewSdpTest, ParseInvalidSimulcastNotSending) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432934
   ParseSdp("v=0" CRLF
            "o=- 4294967296 2 IN IP4 127.0.0.1" CRLF
            "s=SIP Call" CRLF
            "c=IN IP4 198.51.100.7" CRLF
            "b=CT:5000" CRLF
            "t=0 0" CRLF
            "m=video 56436 RTP/SAVPF 120" CRLF
            "a=rtpmap:120 VP8/90000" CRLF
            "a=recvonly" CRLF
            "a=simulcast: send pt=120" CRLF,
            false);
   ASSERT_NE("", GetParseErrors());
 }
 
 TEST_P(NewSdpTest, ParseInvalidSimulcastNotReceiving) {
+  SKIP_TEST_WITH_RUST_PARSER; // See Bug 1432936
   ParseSdp("v=0" CRLF
            "o=- 4294967296 2 IN IP4 127.0.0.1" CRLF
            "s=SIP Call" CRLF
            "c=IN IP4 198.51.100.7" CRLF
            "b=CT:5000" CRLF
            "t=0 0" CRLF
            "m=video 56436 RTP/SAVPF 120" CRLF
            "a=rtpmap:120 VP8/90000" CRLF