xref: /aosp_15_r20/external/webrtc/pc/sdp_serializer_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright 2018 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #include "pc/sdp_serializer.h"
12*d9f75844SAndroid Build Coastguard Worker 
13*d9f75844SAndroid Build Coastguard Worker #include <stddef.h>
14*d9f75844SAndroid Build Coastguard Worker 
15*d9f75844SAndroid Build Coastguard Worker #include <map>
16*d9f75844SAndroid Build Coastguard Worker #include <string>
17*d9f75844SAndroid Build Coastguard Worker #include <utility>
18*d9f75844SAndroid Build Coastguard Worker #include <vector>
19*d9f75844SAndroid Build Coastguard Worker 
20*d9f75844SAndroid Build Coastguard Worker #include "test/gtest.h"
21*d9f75844SAndroid Build Coastguard Worker 
22*d9f75844SAndroid Build Coastguard Worker using cricket::RidDescription;
23*d9f75844SAndroid Build Coastguard Worker using cricket::RidDirection;
24*d9f75844SAndroid Build Coastguard Worker using cricket::SimulcastDescription;
25*d9f75844SAndroid Build Coastguard Worker using cricket::SimulcastLayer;
26*d9f75844SAndroid Build Coastguard Worker using cricket::SimulcastLayerList;
27*d9f75844SAndroid Build Coastguard Worker using ::testing::TestWithParam;
28*d9f75844SAndroid Build Coastguard Worker using ::testing::ValuesIn;
29*d9f75844SAndroid Build Coastguard Worker 
30*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
31*d9f75844SAndroid Build Coastguard Worker 
32*d9f75844SAndroid Build Coastguard Worker namespace {
33*d9f75844SAndroid Build Coastguard Worker // Checks that two vectors have the same objects in the same order.
34*d9f75844SAndroid Build Coastguard Worker template <typename TElement>
ExpectEqual(const std::vector<TElement> & expected,const std::vector<TElement> & actual)35*d9f75844SAndroid Build Coastguard Worker void ExpectEqual(const std::vector<TElement>& expected,
36*d9f75844SAndroid Build Coastguard Worker                  const std::vector<TElement>& actual) {
37*d9f75844SAndroid Build Coastguard Worker   ASSERT_EQ(expected.size(), actual.size());
38*d9f75844SAndroid Build Coastguard Worker   for (size_t i = 0; i < expected.size(); i++) {
39*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(expected[i], actual[i]) << "Vectors differ at element " << i;
40*d9f75844SAndroid Build Coastguard Worker   }
41*d9f75844SAndroid Build Coastguard Worker }
42*d9f75844SAndroid Build Coastguard Worker 
43*d9f75844SAndroid Build Coastguard Worker // Template specialization for vectors of SimulcastLayer objects.
44*d9f75844SAndroid Build Coastguard Worker template <>
ExpectEqual(const std::vector<SimulcastLayer> & expected,const std::vector<SimulcastLayer> & actual)45*d9f75844SAndroid Build Coastguard Worker void ExpectEqual(const std::vector<SimulcastLayer>& expected,
46*d9f75844SAndroid Build Coastguard Worker                  const std::vector<SimulcastLayer>& actual) {
47*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(expected.size(), actual.size());
48*d9f75844SAndroid Build Coastguard Worker   for (size_t i = 0; i < expected.size(); i++) {
49*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(expected[i].rid, actual[i].rid);
50*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(expected[i].is_paused, actual[i].is_paused);
51*d9f75844SAndroid Build Coastguard Worker   }
52*d9f75844SAndroid Build Coastguard Worker }
53*d9f75844SAndroid Build Coastguard Worker 
54*d9f75844SAndroid Build Coastguard Worker // Checks that two maps have the same key-value pairs.
55*d9f75844SAndroid Build Coastguard Worker // Even though a map is technically ordered, the order semantics are not
56*d9f75844SAndroid Build Coastguard Worker // tested because having the same key-set in both maps implies that they
57*d9f75844SAndroid Build Coastguard Worker // are ordered the same because the template enforces that they have the
58*d9f75844SAndroid Build Coastguard Worker // same Key-Comparer type.
59*d9f75844SAndroid Build Coastguard Worker template <typename TKey, typename TValue>
ExpectEqual(const std::map<TKey,TValue> & expected,const std::map<TKey,TValue> & actual)60*d9f75844SAndroid Build Coastguard Worker void ExpectEqual(const std::map<TKey, TValue>& expected,
61*d9f75844SAndroid Build Coastguard Worker                  const std::map<TKey, TValue>& actual) {
62*d9f75844SAndroid Build Coastguard Worker   typedef typename std::map<TKey, TValue>::const_iterator const_iterator;
63*d9f75844SAndroid Build Coastguard Worker   ASSERT_EQ(expected.size(), actual.size());
64*d9f75844SAndroid Build Coastguard Worker   // Maps have unique keys, so if size is equal, it is enough to check
65*d9f75844SAndroid Build Coastguard Worker   // that all the keys (and values) from one map exist in the other.
66*d9f75844SAndroid Build Coastguard Worker   for (const std::pair<TKey, TValue>& pair : expected) {
67*d9f75844SAndroid Build Coastguard Worker     const_iterator iter = actual.find(pair.first);
68*d9f75844SAndroid Build Coastguard Worker     EXPECT_NE(iter, actual.end()) << "Key: " << pair.first << " not found";
69*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(pair.second, iter->second);
70*d9f75844SAndroid Build Coastguard Worker   }
71*d9f75844SAndroid Build Coastguard Worker }
72*d9f75844SAndroid Build Coastguard Worker 
73*d9f75844SAndroid Build Coastguard Worker // Checks that the two SimulcastLayerLists are equal.
ExpectEqual(const SimulcastLayerList & expected,const SimulcastLayerList & actual)74*d9f75844SAndroid Build Coastguard Worker void ExpectEqual(const SimulcastLayerList& expected,
75*d9f75844SAndroid Build Coastguard Worker                  const SimulcastLayerList& actual) {
76*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(expected.size(), actual.size());
77*d9f75844SAndroid Build Coastguard Worker   for (size_t i = 0; i < expected.size(); i++) {
78*d9f75844SAndroid Build Coastguard Worker     ExpectEqual(expected[i], actual[i]);
79*d9f75844SAndroid Build Coastguard Worker   }
80*d9f75844SAndroid Build Coastguard Worker }
81*d9f75844SAndroid Build Coastguard Worker 
82*d9f75844SAndroid Build Coastguard Worker // Checks that the two SimulcastDescriptions are equal.
ExpectEqual(const SimulcastDescription & expected,const SimulcastDescription & actual)83*d9f75844SAndroid Build Coastguard Worker void ExpectEqual(const SimulcastDescription& expected,
84*d9f75844SAndroid Build Coastguard Worker                  const SimulcastDescription& actual) {
85*d9f75844SAndroid Build Coastguard Worker   ExpectEqual(expected.send_layers(), actual.send_layers());
86*d9f75844SAndroid Build Coastguard Worker   ExpectEqual(expected.receive_layers(), actual.receive_layers());
87*d9f75844SAndroid Build Coastguard Worker }
88*d9f75844SAndroid Build Coastguard Worker 
89*d9f75844SAndroid Build Coastguard Worker // Checks that the two RidDescriptions are equal.
ExpectEqual(const RidDescription & expected,const RidDescription & actual)90*d9f75844SAndroid Build Coastguard Worker void ExpectEqual(const RidDescription& expected, const RidDescription& actual) {
91*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(expected.rid, actual.rid);
92*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(expected.direction, actual.direction);
93*d9f75844SAndroid Build Coastguard Worker   ExpectEqual(expected.payload_types, actual.payload_types);
94*d9f75844SAndroid Build Coastguard Worker   ExpectEqual(expected.restrictions, actual.restrictions);
95*d9f75844SAndroid Build Coastguard Worker }
96*d9f75844SAndroid Build Coastguard Worker }  // namespace
97*d9f75844SAndroid Build Coastguard Worker 
98*d9f75844SAndroid Build Coastguard Worker class SimulcastSdpSerializerTest : public TestWithParam<const char*> {
99*d9f75844SAndroid Build Coastguard Worker  public:
100*d9f75844SAndroid Build Coastguard Worker   // Runs a test for deserializing Simulcast.
101*d9f75844SAndroid Build Coastguard Worker   // `str` - The serialized Simulcast to parse.
102*d9f75844SAndroid Build Coastguard Worker   // `expected` - The expected output Simulcast to compare to.
TestDeserialization(const std::string & str,const SimulcastDescription & expected) const103*d9f75844SAndroid Build Coastguard Worker   void TestDeserialization(const std::string& str,
104*d9f75844SAndroid Build Coastguard Worker                            const SimulcastDescription& expected) const {
105*d9f75844SAndroid Build Coastguard Worker     SdpSerializer deserializer;
106*d9f75844SAndroid Build Coastguard Worker     auto result = deserializer.DeserializeSimulcastDescription(str);
107*d9f75844SAndroid Build Coastguard Worker     EXPECT_TRUE(result.ok());
108*d9f75844SAndroid Build Coastguard Worker     ExpectEqual(expected, result.value());
109*d9f75844SAndroid Build Coastguard Worker   }
110*d9f75844SAndroid Build Coastguard Worker 
111*d9f75844SAndroid Build Coastguard Worker   // Runs a test for serializing Simulcast.
112*d9f75844SAndroid Build Coastguard Worker   // `simulcast` - The Simulcast to serialize.
113*d9f75844SAndroid Build Coastguard Worker   // `expected` - The expected output string to compare to.
TestSerialization(const SimulcastDescription & simulcast,const std::string & expected) const114*d9f75844SAndroid Build Coastguard Worker   void TestSerialization(const SimulcastDescription& simulcast,
115*d9f75844SAndroid Build Coastguard Worker                          const std::string& expected) const {
116*d9f75844SAndroid Build Coastguard Worker     SdpSerializer serializer;
117*d9f75844SAndroid Build Coastguard Worker     auto result = serializer.SerializeSimulcastDescription(simulcast);
118*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(expected, result);
119*d9f75844SAndroid Build Coastguard Worker   }
120*d9f75844SAndroid Build Coastguard Worker };
121*d9f75844SAndroid Build Coastguard Worker 
122*d9f75844SAndroid Build Coastguard Worker // Test Cases
123*d9f75844SAndroid Build Coastguard Worker 
124*d9f75844SAndroid Build Coastguard Worker // Test simple deserialization with no alternative streams.
TEST_F(SimulcastSdpSerializerTest,Deserialize_SimpleCaseNoAlternatives)125*d9f75844SAndroid Build Coastguard Worker TEST_F(SimulcastSdpSerializerTest, Deserialize_SimpleCaseNoAlternatives) {
126*d9f75844SAndroid Build Coastguard Worker   std::string simulcast_str = "send 1;2 recv 3;4";
127*d9f75844SAndroid Build Coastguard Worker   SimulcastDescription expected;
128*d9f75844SAndroid Build Coastguard Worker   expected.send_layers().AddLayer(SimulcastLayer("1", false));
129*d9f75844SAndroid Build Coastguard Worker   expected.send_layers().AddLayer(SimulcastLayer("2", false));
130*d9f75844SAndroid Build Coastguard Worker   expected.receive_layers().AddLayer(SimulcastLayer("3", false));
131*d9f75844SAndroid Build Coastguard Worker   expected.receive_layers().AddLayer(SimulcastLayer("4", false));
132*d9f75844SAndroid Build Coastguard Worker   TestDeserialization(simulcast_str, expected);
133*d9f75844SAndroid Build Coastguard Worker }
134*d9f75844SAndroid Build Coastguard Worker 
135*d9f75844SAndroid Build Coastguard Worker // Test simulcast deserialization with alternative streams.
TEST_F(SimulcastSdpSerializerTest,Deserialize_SimpleCaseWithAlternatives)136*d9f75844SAndroid Build Coastguard Worker TEST_F(SimulcastSdpSerializerTest, Deserialize_SimpleCaseWithAlternatives) {
137*d9f75844SAndroid Build Coastguard Worker   std::string simulcast_str = "send 1,5;2,6 recv 3,7;4,8";
138*d9f75844SAndroid Build Coastguard Worker   SimulcastDescription expected;
139*d9f75844SAndroid Build Coastguard Worker   expected.send_layers().AddLayerWithAlternatives(
140*d9f75844SAndroid Build Coastguard Worker       {SimulcastLayer("1", false), SimulcastLayer("5", false)});
141*d9f75844SAndroid Build Coastguard Worker   expected.send_layers().AddLayerWithAlternatives(
142*d9f75844SAndroid Build Coastguard Worker       {SimulcastLayer("2", false), SimulcastLayer("6", false)});
143*d9f75844SAndroid Build Coastguard Worker   expected.receive_layers().AddLayerWithAlternatives(
144*d9f75844SAndroid Build Coastguard Worker       {SimulcastLayer("3", false), SimulcastLayer("7", false)});
145*d9f75844SAndroid Build Coastguard Worker   expected.receive_layers().AddLayerWithAlternatives(
146*d9f75844SAndroid Build Coastguard Worker       {SimulcastLayer("4", false), SimulcastLayer("8", false)});
147*d9f75844SAndroid Build Coastguard Worker   TestDeserialization(simulcast_str, expected);
148*d9f75844SAndroid Build Coastguard Worker }
149*d9f75844SAndroid Build Coastguard Worker 
150*d9f75844SAndroid Build Coastguard Worker // Test simulcast deserialization when only some streams have alternatives.
TEST_F(SimulcastSdpSerializerTest,Deserialize_WithSomeAlternatives)151*d9f75844SAndroid Build Coastguard Worker TEST_F(SimulcastSdpSerializerTest, Deserialize_WithSomeAlternatives) {
152*d9f75844SAndroid Build Coastguard Worker   std::string simulcast_str = "send 1;2,6 recv 3,7;4";
153*d9f75844SAndroid Build Coastguard Worker   SimulcastDescription expected;
154*d9f75844SAndroid Build Coastguard Worker   expected.send_layers().AddLayer(SimulcastLayer("1", false));
155*d9f75844SAndroid Build Coastguard Worker   expected.send_layers().AddLayerWithAlternatives(
156*d9f75844SAndroid Build Coastguard Worker       {SimulcastLayer("2", false), SimulcastLayer("6", false)});
157*d9f75844SAndroid Build Coastguard Worker   expected.receive_layers().AddLayerWithAlternatives(
158*d9f75844SAndroid Build Coastguard Worker       {SimulcastLayer("3", false), SimulcastLayer("7", false)});
159*d9f75844SAndroid Build Coastguard Worker   expected.receive_layers().AddLayer(SimulcastLayer("4", false));
160*d9f75844SAndroid Build Coastguard Worker   TestDeserialization(simulcast_str, expected);
161*d9f75844SAndroid Build Coastguard Worker }
162*d9f75844SAndroid Build Coastguard Worker 
163*d9f75844SAndroid Build Coastguard Worker // Test simulcast deserialization when only send streams are specified.
TEST_F(SimulcastSdpSerializerTest,Deserialize_OnlySendStreams)164*d9f75844SAndroid Build Coastguard Worker TEST_F(SimulcastSdpSerializerTest, Deserialize_OnlySendStreams) {
165*d9f75844SAndroid Build Coastguard Worker   std::string simulcast_str = "send 1;2,6;3,7;4";
166*d9f75844SAndroid Build Coastguard Worker   SimulcastDescription expected;
167*d9f75844SAndroid Build Coastguard Worker   expected.send_layers().AddLayer(SimulcastLayer("1", false));
168*d9f75844SAndroid Build Coastguard Worker   expected.send_layers().AddLayerWithAlternatives(
169*d9f75844SAndroid Build Coastguard Worker       {SimulcastLayer("2", false), SimulcastLayer("6", false)});
170*d9f75844SAndroid Build Coastguard Worker   expected.send_layers().AddLayerWithAlternatives(
171*d9f75844SAndroid Build Coastguard Worker       {SimulcastLayer("3", false), SimulcastLayer("7", false)});
172*d9f75844SAndroid Build Coastguard Worker   expected.send_layers().AddLayer(SimulcastLayer("4", false));
173*d9f75844SAndroid Build Coastguard Worker   TestDeserialization(simulcast_str, expected);
174*d9f75844SAndroid Build Coastguard Worker }
175*d9f75844SAndroid Build Coastguard Worker 
176*d9f75844SAndroid Build Coastguard Worker // Test simulcast deserialization when only receive streams are specified.
TEST_F(SimulcastSdpSerializerTest,Deserialize_OnlyReceiveStreams)177*d9f75844SAndroid Build Coastguard Worker TEST_F(SimulcastSdpSerializerTest, Deserialize_OnlyReceiveStreams) {
178*d9f75844SAndroid Build Coastguard Worker   std::string simulcast_str = "recv 1;2,6;3,7;4";
179*d9f75844SAndroid Build Coastguard Worker   SimulcastDescription expected;
180*d9f75844SAndroid Build Coastguard Worker   expected.receive_layers().AddLayer(SimulcastLayer("1", false));
181*d9f75844SAndroid Build Coastguard Worker   expected.receive_layers().AddLayerWithAlternatives(
182*d9f75844SAndroid Build Coastguard Worker       {SimulcastLayer("2", false), SimulcastLayer("6", false)});
183*d9f75844SAndroid Build Coastguard Worker   expected.receive_layers().AddLayerWithAlternatives(
184*d9f75844SAndroid Build Coastguard Worker       {SimulcastLayer("3", false), SimulcastLayer("7", false)});
185*d9f75844SAndroid Build Coastguard Worker   expected.receive_layers().AddLayer(SimulcastLayer("4", false));
186*d9f75844SAndroid Build Coastguard Worker   TestDeserialization(simulcast_str, expected);
187*d9f75844SAndroid Build Coastguard Worker }
188*d9f75844SAndroid Build Coastguard Worker 
189*d9f75844SAndroid Build Coastguard Worker // Test simulcast deserialization with receive streams before send streams.
TEST_F(SimulcastSdpSerializerTest,Deserialize_SendReceiveReversed)190*d9f75844SAndroid Build Coastguard Worker TEST_F(SimulcastSdpSerializerTest, Deserialize_SendReceiveReversed) {
191*d9f75844SAndroid Build Coastguard Worker   std::string simulcast_str = "recv 1;2,6 send 3,7;4";
192*d9f75844SAndroid Build Coastguard Worker   SimulcastDescription expected;
193*d9f75844SAndroid Build Coastguard Worker   expected.receive_layers().AddLayer(SimulcastLayer("1", false));
194*d9f75844SAndroid Build Coastguard Worker   expected.receive_layers().AddLayerWithAlternatives(
195*d9f75844SAndroid Build Coastguard Worker       {SimulcastLayer("2", false), SimulcastLayer("6", false)});
196*d9f75844SAndroid Build Coastguard Worker   expected.send_layers().AddLayerWithAlternatives(
197*d9f75844SAndroid Build Coastguard Worker       {SimulcastLayer("3", false), SimulcastLayer("7", false)});
198*d9f75844SAndroid Build Coastguard Worker   expected.send_layers().AddLayer(SimulcastLayer("4", false));
199*d9f75844SAndroid Build Coastguard Worker   TestDeserialization(simulcast_str, expected);
200*d9f75844SAndroid Build Coastguard Worker }
201*d9f75844SAndroid Build Coastguard Worker 
202*d9f75844SAndroid Build Coastguard Worker // Test simulcast deserialization with some streams set to paused state.
TEST_F(SimulcastSdpSerializerTest,Deserialize_PausedStreams)203*d9f75844SAndroid Build Coastguard Worker TEST_F(SimulcastSdpSerializerTest, Deserialize_PausedStreams) {
204*d9f75844SAndroid Build Coastguard Worker   std::string simulcast_str = "recv 1;~2,6 send 3,7;~4";
205*d9f75844SAndroid Build Coastguard Worker   SimulcastDescription expected;
206*d9f75844SAndroid Build Coastguard Worker   expected.receive_layers().AddLayer(SimulcastLayer("1", false));
207*d9f75844SAndroid Build Coastguard Worker   expected.receive_layers().AddLayerWithAlternatives(
208*d9f75844SAndroid Build Coastguard Worker       {SimulcastLayer("2", true), SimulcastLayer("6", false)});
209*d9f75844SAndroid Build Coastguard Worker   expected.send_layers().AddLayerWithAlternatives(
210*d9f75844SAndroid Build Coastguard Worker       {SimulcastLayer("3", false), SimulcastLayer("7", false)});
211*d9f75844SAndroid Build Coastguard Worker   expected.send_layers().AddLayer(SimulcastLayer("4", true));
212*d9f75844SAndroid Build Coastguard Worker   TestDeserialization(simulcast_str, expected);
213*d9f75844SAndroid Build Coastguard Worker }
214*d9f75844SAndroid Build Coastguard Worker 
215*d9f75844SAndroid Build Coastguard Worker // Parameterized negative test case for deserialization with invalid inputs.
TEST_P(SimulcastSdpSerializerTest,SimulcastDeserializationFailed)216*d9f75844SAndroid Build Coastguard Worker TEST_P(SimulcastSdpSerializerTest, SimulcastDeserializationFailed) {
217*d9f75844SAndroid Build Coastguard Worker   SdpSerializer deserializer;
218*d9f75844SAndroid Build Coastguard Worker   auto result = deserializer.DeserializeSimulcastDescription(GetParam());
219*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(result.ok());
220*d9f75844SAndroid Build Coastguard Worker }
221*d9f75844SAndroid Build Coastguard Worker 
222*d9f75844SAndroid Build Coastguard Worker // The malformed Simulcast inputs to use in the negative test case.
223*d9f75844SAndroid Build Coastguard Worker const char* kSimulcastMalformedStrings[] = {
224*d9f75844SAndroid Build Coastguard Worker     "send ",
225*d9f75844SAndroid Build Coastguard Worker     "recv ",
226*d9f75844SAndroid Build Coastguard Worker     "recv 1 send",
227*d9f75844SAndroid Build Coastguard Worker     "receive 1",
228*d9f75844SAndroid Build Coastguard Worker     "recv 1;~2,6 recv 3,7;~4",
229*d9f75844SAndroid Build Coastguard Worker     "send 1;~2,6 send 3,7;~4",
230*d9f75844SAndroid Build Coastguard Worker     "send ~;~2,6",
231*d9f75844SAndroid Build Coastguard Worker     "send 1; ;~2,6",
232*d9f75844SAndroid Build Coastguard Worker     "send 1,;~2,6",
233*d9f75844SAndroid Build Coastguard Worker     "recv 1 send 2 3",
234*d9f75844SAndroid Build Coastguard Worker     "",
235*d9f75844SAndroid Build Coastguard Worker };
236*d9f75844SAndroid Build Coastguard Worker 
237*d9f75844SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(SimulcastDeserializationErrors,
238*d9f75844SAndroid Build Coastguard Worker                          SimulcastSdpSerializerTest,
239*d9f75844SAndroid Build Coastguard Worker                          ValuesIn(kSimulcastMalformedStrings));
240*d9f75844SAndroid Build Coastguard Worker 
241*d9f75844SAndroid Build Coastguard Worker // Test a simple serialization scenario.
TEST_F(SimulcastSdpSerializerTest,Serialize_SimpleCase)242*d9f75844SAndroid Build Coastguard Worker TEST_F(SimulcastSdpSerializerTest, Serialize_SimpleCase) {
243*d9f75844SAndroid Build Coastguard Worker   SimulcastDescription simulcast;
244*d9f75844SAndroid Build Coastguard Worker   simulcast.send_layers().AddLayer(SimulcastLayer("1", false));
245*d9f75844SAndroid Build Coastguard Worker   simulcast.receive_layers().AddLayer(SimulcastLayer("2", false));
246*d9f75844SAndroid Build Coastguard Worker   TestSerialization(simulcast, "send 1 recv 2");
247*d9f75844SAndroid Build Coastguard Worker }
248*d9f75844SAndroid Build Coastguard Worker 
249*d9f75844SAndroid Build Coastguard Worker // Test serialization with only send streams.
TEST_F(SimulcastSdpSerializerTest,Serialize_OnlySend)250*d9f75844SAndroid Build Coastguard Worker TEST_F(SimulcastSdpSerializerTest, Serialize_OnlySend) {
251*d9f75844SAndroid Build Coastguard Worker   SimulcastDescription simulcast;
252*d9f75844SAndroid Build Coastguard Worker   simulcast.send_layers().AddLayer(SimulcastLayer("1", false));
253*d9f75844SAndroid Build Coastguard Worker   simulcast.send_layers().AddLayer(SimulcastLayer("2", false));
254*d9f75844SAndroid Build Coastguard Worker   TestSerialization(simulcast, "send 1;2");
255*d9f75844SAndroid Build Coastguard Worker }
256*d9f75844SAndroid Build Coastguard Worker 
257*d9f75844SAndroid Build Coastguard Worker // Test serialization with only receive streams
TEST_F(SimulcastSdpSerializerTest,Serialize_OnlyReceive)258*d9f75844SAndroid Build Coastguard Worker TEST_F(SimulcastSdpSerializerTest, Serialize_OnlyReceive) {
259*d9f75844SAndroid Build Coastguard Worker   SimulcastDescription simulcast;
260*d9f75844SAndroid Build Coastguard Worker   simulcast.receive_layers().AddLayer(SimulcastLayer("1", false));
261*d9f75844SAndroid Build Coastguard Worker   simulcast.receive_layers().AddLayer(SimulcastLayer("2", false));
262*d9f75844SAndroid Build Coastguard Worker   TestSerialization(simulcast, "recv 1;2");
263*d9f75844SAndroid Build Coastguard Worker }
264*d9f75844SAndroid Build Coastguard Worker 
265*d9f75844SAndroid Build Coastguard Worker // Test a complex serialization with multiple streams, alternatives and states.
TEST_F(SimulcastSdpSerializerTest,Serialize_ComplexSerialization)266*d9f75844SAndroid Build Coastguard Worker TEST_F(SimulcastSdpSerializerTest, Serialize_ComplexSerialization) {
267*d9f75844SAndroid Build Coastguard Worker   SimulcastDescription simulcast;
268*d9f75844SAndroid Build Coastguard Worker   simulcast.send_layers().AddLayerWithAlternatives(
269*d9f75844SAndroid Build Coastguard Worker       {SimulcastLayer("2", false), SimulcastLayer("1", true)});
270*d9f75844SAndroid Build Coastguard Worker   simulcast.send_layers().AddLayerWithAlternatives(
271*d9f75844SAndroid Build Coastguard Worker       {SimulcastLayer("4", false), SimulcastLayer("3", false)});
272*d9f75844SAndroid Build Coastguard Worker 
273*d9f75844SAndroid Build Coastguard Worker   simulcast.receive_layers().AddLayerWithAlternatives(
274*d9f75844SAndroid Build Coastguard Worker       {SimulcastLayer("6", false), SimulcastLayer("7", false)});
275*d9f75844SAndroid Build Coastguard Worker   simulcast.receive_layers().AddLayer(SimulcastLayer("8", true));
276*d9f75844SAndroid Build Coastguard Worker   simulcast.receive_layers().AddLayerWithAlternatives(
277*d9f75844SAndroid Build Coastguard Worker       {SimulcastLayer("9", false), SimulcastLayer("10", true),
278*d9f75844SAndroid Build Coastguard Worker        SimulcastLayer("11", false)});
279*d9f75844SAndroid Build Coastguard Worker   TestSerialization(simulcast, "send 2,~1;4,3 recv 6,7;~8;9,~10,11");
280*d9f75844SAndroid Build Coastguard Worker }
281*d9f75844SAndroid Build Coastguard Worker 
282*d9f75844SAndroid Build Coastguard Worker class RidDescriptionSdpSerializerTest : public TestWithParam<const char*> {
283*d9f75844SAndroid Build Coastguard Worker  public:
284*d9f75844SAndroid Build Coastguard Worker   // Runs a test for deserializing Rid Descriptions.
285*d9f75844SAndroid Build Coastguard Worker   // `str` - The serialized Rid Description to parse.
286*d9f75844SAndroid Build Coastguard Worker   // `expected` - The expected output RidDescription to compare to.
TestDeserialization(const std::string & str,const RidDescription & expected) const287*d9f75844SAndroid Build Coastguard Worker   void TestDeserialization(const std::string& str,
288*d9f75844SAndroid Build Coastguard Worker                            const RidDescription& expected) const {
289*d9f75844SAndroid Build Coastguard Worker     SdpSerializer deserializer;
290*d9f75844SAndroid Build Coastguard Worker     auto result = deserializer.DeserializeRidDescription(str);
291*d9f75844SAndroid Build Coastguard Worker     EXPECT_TRUE(result.ok());
292*d9f75844SAndroid Build Coastguard Worker     ExpectEqual(expected, result.value());
293*d9f75844SAndroid Build Coastguard Worker   }
294*d9f75844SAndroid Build Coastguard Worker 
295*d9f75844SAndroid Build Coastguard Worker   // Runs a test for serializing RidDescriptions.
296*d9f75844SAndroid Build Coastguard Worker   // `rid_description` - The RidDescription to serialize.
297*d9f75844SAndroid Build Coastguard Worker   // `expected` - The expected output string to compare to.
TestSerialization(const RidDescription & rid_description,const std::string & expected) const298*d9f75844SAndroid Build Coastguard Worker   void TestSerialization(const RidDescription& rid_description,
299*d9f75844SAndroid Build Coastguard Worker                          const std::string& expected) const {
300*d9f75844SAndroid Build Coastguard Worker     SdpSerializer serializer;
301*d9f75844SAndroid Build Coastguard Worker     auto result = serializer.SerializeRidDescription(rid_description);
302*d9f75844SAndroid Build Coastguard Worker     EXPECT_EQ(expected, result);
303*d9f75844SAndroid Build Coastguard Worker   }
304*d9f75844SAndroid Build Coastguard Worker };
305*d9f75844SAndroid Build Coastguard Worker 
306*d9f75844SAndroid Build Coastguard Worker // Test serialization for RidDescription that only specifies send.
TEST_F(RidDescriptionSdpSerializerTest,Serialize_OnlyDirectionSend)307*d9f75844SAndroid Build Coastguard Worker TEST_F(RidDescriptionSdpSerializerTest, Serialize_OnlyDirectionSend) {
308*d9f75844SAndroid Build Coastguard Worker   RidDescription rid_description("1", RidDirection::kSend);
309*d9f75844SAndroid Build Coastguard Worker   TestSerialization(rid_description, "1 send");
310*d9f75844SAndroid Build Coastguard Worker }
311*d9f75844SAndroid Build Coastguard Worker 
312*d9f75844SAndroid Build Coastguard Worker // Test serialization for RidDescription that only specifies receive.
TEST_F(RidDescriptionSdpSerializerTest,Serialize_OnlyDirectionReceive)313*d9f75844SAndroid Build Coastguard Worker TEST_F(RidDescriptionSdpSerializerTest, Serialize_OnlyDirectionReceive) {
314*d9f75844SAndroid Build Coastguard Worker   RidDescription rid_description("2", RidDirection::kReceive);
315*d9f75844SAndroid Build Coastguard Worker   TestSerialization(rid_description, "2 recv");
316*d9f75844SAndroid Build Coastguard Worker }
317*d9f75844SAndroid Build Coastguard Worker 
318*d9f75844SAndroid Build Coastguard Worker // Test serialization for RidDescription with format list.
TEST_F(RidDescriptionSdpSerializerTest,Serialize_FormatList)319*d9f75844SAndroid Build Coastguard Worker TEST_F(RidDescriptionSdpSerializerTest, Serialize_FormatList) {
320*d9f75844SAndroid Build Coastguard Worker   RidDescription rid_description("3", RidDirection::kSend);
321*d9f75844SAndroid Build Coastguard Worker   rid_description.payload_types = {102, 101};
322*d9f75844SAndroid Build Coastguard Worker   TestSerialization(rid_description, "3 send pt=102,101");
323*d9f75844SAndroid Build Coastguard Worker }
324*d9f75844SAndroid Build Coastguard Worker 
325*d9f75844SAndroid Build Coastguard Worker // Test serialization for RidDescription with format list.
TEST_F(RidDescriptionSdpSerializerTest,Serialize_FormatListSingleFormat)326*d9f75844SAndroid Build Coastguard Worker TEST_F(RidDescriptionSdpSerializerTest, Serialize_FormatListSingleFormat) {
327*d9f75844SAndroid Build Coastguard Worker   RidDescription rid_description("4", RidDirection::kReceive);
328*d9f75844SAndroid Build Coastguard Worker   rid_description.payload_types = {100};
329*d9f75844SAndroid Build Coastguard Worker   TestSerialization(rid_description, "4 recv pt=100");
330*d9f75844SAndroid Build Coastguard Worker }
331*d9f75844SAndroid Build Coastguard Worker 
332*d9f75844SAndroid Build Coastguard Worker // Test serialization for RidDescription with restriction list.
333*d9f75844SAndroid Build Coastguard Worker // Note: restriction list will be sorted because it is stored in a map.
TEST_F(RidDescriptionSdpSerializerTest,Serialize_AttributeList)334*d9f75844SAndroid Build Coastguard Worker TEST_F(RidDescriptionSdpSerializerTest, Serialize_AttributeList) {
335*d9f75844SAndroid Build Coastguard Worker   RidDescription rid_description("5", RidDirection::kSend);
336*d9f75844SAndroid Build Coastguard Worker   rid_description.restrictions["max-width"] = "1280";
337*d9f75844SAndroid Build Coastguard Worker   rid_description.restrictions["max-height"] = "720";
338*d9f75844SAndroid Build Coastguard Worker   TestSerialization(rid_description, "5 send max-height=720;max-width=1280");
339*d9f75844SAndroid Build Coastguard Worker }
340*d9f75844SAndroid Build Coastguard Worker 
341*d9f75844SAndroid Build Coastguard Worker // Test serialization for RidDescription with format list and attribute list.
342*d9f75844SAndroid Build Coastguard Worker // Note: restriction list will be sorted because it is stored in a map.
TEST_F(RidDescriptionSdpSerializerTest,Serialize_FormatAndAttributeList)343*d9f75844SAndroid Build Coastguard Worker TEST_F(RidDescriptionSdpSerializerTest, Serialize_FormatAndAttributeList) {
344*d9f75844SAndroid Build Coastguard Worker   RidDescription rid_description("6", RidDirection::kSend);
345*d9f75844SAndroid Build Coastguard Worker   rid_description.payload_types = {103, 104};
346*d9f75844SAndroid Build Coastguard Worker   rid_description.restrictions["max-mbps"] = "108000";
347*d9f75844SAndroid Build Coastguard Worker   rid_description.restrictions["max-br"] = "64000";
348*d9f75844SAndroid Build Coastguard Worker   TestSerialization(rid_description,
349*d9f75844SAndroid Build Coastguard Worker                     "6 send pt=103,104;max-br=64000;max-mbps=108000");
350*d9f75844SAndroid Build Coastguard Worker }
351*d9f75844SAndroid Build Coastguard Worker 
352*d9f75844SAndroid Build Coastguard Worker // Test serialization for attribute list that has key with no value.
353*d9f75844SAndroid Build Coastguard Worker // Note: restriction list will be sorted because it is stored in a map.
TEST_F(RidDescriptionSdpSerializerTest,Serialize_RestrictionWithoutValue)354*d9f75844SAndroid Build Coastguard Worker TEST_F(RidDescriptionSdpSerializerTest, Serialize_RestrictionWithoutValue) {
355*d9f75844SAndroid Build Coastguard Worker   RidDescription rid_description("7", RidDirection::kReceive);
356*d9f75844SAndroid Build Coastguard Worker   rid_description.payload_types = {103};
357*d9f75844SAndroid Build Coastguard Worker   rid_description.restrictions["max-width"] = "1280";
358*d9f75844SAndroid Build Coastguard Worker   rid_description.restrictions["max-height"] = "720";
359*d9f75844SAndroid Build Coastguard Worker   rid_description.restrictions["max-myval"] = "";
360*d9f75844SAndroid Build Coastguard Worker   TestSerialization(rid_description,
361*d9f75844SAndroid Build Coastguard Worker                     "7 recv pt=103;max-height=720;max-myval;max-width=1280");
362*d9f75844SAndroid Build Coastguard Worker }
363*d9f75844SAndroid Build Coastguard Worker 
364*d9f75844SAndroid Build Coastguard Worker // Test simulcast deserialization with simple send stream.
TEST_F(RidDescriptionSdpSerializerTest,Deserialize_SimpleSendCase)365*d9f75844SAndroid Build Coastguard Worker TEST_F(RidDescriptionSdpSerializerTest, Deserialize_SimpleSendCase) {
366*d9f75844SAndroid Build Coastguard Worker   RidDescription rid_description("1", RidDirection::kSend);
367*d9f75844SAndroid Build Coastguard Worker   TestDeserialization("1 send", rid_description);
368*d9f75844SAndroid Build Coastguard Worker }
369*d9f75844SAndroid Build Coastguard Worker 
370*d9f75844SAndroid Build Coastguard Worker // Test simulcast deserialization with simple receive stream.
TEST_F(RidDescriptionSdpSerializerTest,Deserialize_SimpleReceiveCase)371*d9f75844SAndroid Build Coastguard Worker TEST_F(RidDescriptionSdpSerializerTest, Deserialize_SimpleReceiveCase) {
372*d9f75844SAndroid Build Coastguard Worker   RidDescription rid_description("2", RidDirection::kReceive);
373*d9f75844SAndroid Build Coastguard Worker   TestDeserialization("2 recv", rid_description);
374*d9f75844SAndroid Build Coastguard Worker }
375*d9f75844SAndroid Build Coastguard Worker 
376*d9f75844SAndroid Build Coastguard Worker // Test simulcast deserialization with single format.
TEST_F(RidDescriptionSdpSerializerTest,Deserialize_WithFormat)377*d9f75844SAndroid Build Coastguard Worker TEST_F(RidDescriptionSdpSerializerTest, Deserialize_WithFormat) {
378*d9f75844SAndroid Build Coastguard Worker   RidDescription rid_description("3", RidDirection::kSend);
379*d9f75844SAndroid Build Coastguard Worker   rid_description.payload_types = {101};
380*d9f75844SAndroid Build Coastguard Worker   TestDeserialization("3 send pt=101", rid_description);
381*d9f75844SAndroid Build Coastguard Worker }
382*d9f75844SAndroid Build Coastguard Worker 
383*d9f75844SAndroid Build Coastguard Worker // Test simulcast deserialization with multiple formats.
TEST_F(RidDescriptionSdpSerializerTest,Deserialize_WithMultipleFormats)384*d9f75844SAndroid Build Coastguard Worker TEST_F(RidDescriptionSdpSerializerTest, Deserialize_WithMultipleFormats) {
385*d9f75844SAndroid Build Coastguard Worker   RidDescription rid_description("4", RidDirection::kSend);
386*d9f75844SAndroid Build Coastguard Worker   rid_description.payload_types = {103, 104, 101, 102};
387*d9f75844SAndroid Build Coastguard Worker   TestDeserialization("4 send pt=103,104,101,102", rid_description);
388*d9f75844SAndroid Build Coastguard Worker }
389*d9f75844SAndroid Build Coastguard Worker 
390*d9f75844SAndroid Build Coastguard Worker // Test simulcast deserialization with restriction.
TEST_F(RidDescriptionSdpSerializerTest,Deserialize_WithRestriction)391*d9f75844SAndroid Build Coastguard Worker TEST_F(RidDescriptionSdpSerializerTest, Deserialize_WithRestriction) {
392*d9f75844SAndroid Build Coastguard Worker   RidDescription rid_description("5", RidDirection::kReceive);
393*d9f75844SAndroid Build Coastguard Worker   rid_description.restrictions["max-height"] = "720";
394*d9f75844SAndroid Build Coastguard Worker   TestDeserialization("5 recv max-height=720", rid_description);
395*d9f75844SAndroid Build Coastguard Worker }
396*d9f75844SAndroid Build Coastguard Worker 
397*d9f75844SAndroid Build Coastguard Worker // Test simulcast deserialization with multiple restrictions.
TEST_F(RidDescriptionSdpSerializerTest,Deserialize_WithMultipleRestrictions)398*d9f75844SAndroid Build Coastguard Worker TEST_F(RidDescriptionSdpSerializerTest, Deserialize_WithMultipleRestrictions) {
399*d9f75844SAndroid Build Coastguard Worker   RidDescription rid_description("6", RidDirection::kReceive);
400*d9f75844SAndroid Build Coastguard Worker   rid_description.restrictions["max-height"] = "720";
401*d9f75844SAndroid Build Coastguard Worker   rid_description.restrictions["max-width"] = "1920";
402*d9f75844SAndroid Build Coastguard Worker   rid_description.restrictions["max-fr"] = "60";
403*d9f75844SAndroid Build Coastguard Worker   rid_description.restrictions["max-bps"] = "14000";
404*d9f75844SAndroid Build Coastguard Worker   TestDeserialization(
405*d9f75844SAndroid Build Coastguard Worker       "6 recv max-height=720;max-width=1920;max-bps=14000;max-fr=60",
406*d9f75844SAndroid Build Coastguard Worker       rid_description);
407*d9f75844SAndroid Build Coastguard Worker }
408*d9f75844SAndroid Build Coastguard Worker 
409*d9f75844SAndroid Build Coastguard Worker // Test simulcast deserialization with custom (non-standard) restriction.
TEST_F(RidDescriptionSdpSerializerTest,Deserialize_WithCustomRestrictions)410*d9f75844SAndroid Build Coastguard Worker TEST_F(RidDescriptionSdpSerializerTest, Deserialize_WithCustomRestrictions) {
411*d9f75844SAndroid Build Coastguard Worker   RidDescription rid_description("7", RidDirection::kSend);
412*d9f75844SAndroid Build Coastguard Worker   rid_description.restrictions["foo"] = "bar";
413*d9f75844SAndroid Build Coastguard Worker   rid_description.restrictions["max-height"] = "720";
414*d9f75844SAndroid Build Coastguard Worker   TestDeserialization("7 send max-height=720;foo=bar", rid_description);
415*d9f75844SAndroid Build Coastguard Worker }
416*d9f75844SAndroid Build Coastguard Worker 
417*d9f75844SAndroid Build Coastguard Worker // Test simulcast deserialization with multiple formats and restrictions.
TEST_F(RidDescriptionSdpSerializerTest,Deserialize_WithFormatAndRestrictions)418*d9f75844SAndroid Build Coastguard Worker TEST_F(RidDescriptionSdpSerializerTest, Deserialize_WithFormatAndRestrictions) {
419*d9f75844SAndroid Build Coastguard Worker   RidDescription rid_description("8", RidDirection::kSend);
420*d9f75844SAndroid Build Coastguard Worker   rid_description.payload_types = {104, 103};
421*d9f75844SAndroid Build Coastguard Worker   rid_description.restrictions["max-height"] = "720";
422*d9f75844SAndroid Build Coastguard Worker   rid_description.restrictions["max-width"] = "1920";
423*d9f75844SAndroid Build Coastguard Worker   TestDeserialization("8 send pt=104,103;max-height=720;max-width=1920",
424*d9f75844SAndroid Build Coastguard Worker                       rid_description);
425*d9f75844SAndroid Build Coastguard Worker }
426*d9f75844SAndroid Build Coastguard Worker 
427*d9f75844SAndroid Build Coastguard Worker // Test simulcast deserialization with restriction that has no value.
TEST_F(RidDescriptionSdpSerializerTest,Deserialize_RestrictionHasNoValue)428*d9f75844SAndroid Build Coastguard Worker TEST_F(RidDescriptionSdpSerializerTest, Deserialize_RestrictionHasNoValue) {
429*d9f75844SAndroid Build Coastguard Worker   RidDescription rid_description("9", RidDirection::kReceive);
430*d9f75844SAndroid Build Coastguard Worker   rid_description.payload_types = {104};
431*d9f75844SAndroid Build Coastguard Worker   rid_description.restrictions["max-height"];
432*d9f75844SAndroid Build Coastguard Worker   rid_description.restrictions["max-width"] = "1920";
433*d9f75844SAndroid Build Coastguard Worker   TestDeserialization("9 recv pt=104;max-height;max-width=1920",
434*d9f75844SAndroid Build Coastguard Worker                       rid_description);
435*d9f75844SAndroid Build Coastguard Worker }
436*d9f75844SAndroid Build Coastguard Worker 
437*d9f75844SAndroid Build Coastguard Worker // Add this test to explicitly indicate that this is not an error.
438*d9f75844SAndroid Build Coastguard Worker // The following string "1 send recv" looks malformed because it specifies
439*d9f75844SAndroid Build Coastguard Worker // two directions, but in fact, the recv can be interpreted as a parameter
440*d9f75844SAndroid Build Coastguard Worker // without a value. While such a use case is dubious, the input string is
441*d9f75844SAndroid Build Coastguard Worker // not malformed.
TEST_F(RidDescriptionSdpSerializerTest,Deserialize_AmbiguousCase)442*d9f75844SAndroid Build Coastguard Worker TEST_F(RidDescriptionSdpSerializerTest, Deserialize_AmbiguousCase) {
443*d9f75844SAndroid Build Coastguard Worker   RidDescription rid_description("1", RidDirection::kSend);
444*d9f75844SAndroid Build Coastguard Worker   rid_description.restrictions["recv"];  // No value.
445*d9f75844SAndroid Build Coastguard Worker   TestDeserialization("1 send recv", rid_description);
446*d9f75844SAndroid Build Coastguard Worker }
447*d9f75844SAndroid Build Coastguard Worker 
448*d9f75844SAndroid Build Coastguard Worker // Parameterized negative test case for deserialization with invalid inputs.
TEST_P(RidDescriptionSdpSerializerTest,RidDescriptionDeserializationFailed)449*d9f75844SAndroid Build Coastguard Worker TEST_P(RidDescriptionSdpSerializerTest, RidDescriptionDeserializationFailed) {
450*d9f75844SAndroid Build Coastguard Worker   SdpSerializer deserializer;
451*d9f75844SAndroid Build Coastguard Worker   auto result = deserializer.DeserializeRidDescription(GetParam());
452*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(result.ok());
453*d9f75844SAndroid Build Coastguard Worker }
454*d9f75844SAndroid Build Coastguard Worker 
455*d9f75844SAndroid Build Coastguard Worker // The malformed Rid Description inputs to use in the negative test case.
456*d9f75844SAndroid Build Coastguard Worker const char* kRidDescriptionMalformedStrings[] = {
457*d9f75844SAndroid Build Coastguard Worker     "1",
458*d9f75844SAndroid Build Coastguard Worker     "recv",
459*d9f75844SAndroid Build Coastguard Worker     "send",
460*d9f75844SAndroid Build Coastguard Worker     "recv 1",
461*d9f75844SAndroid Build Coastguard Worker     "send 1",
462*d9f75844SAndroid Build Coastguard Worker     "1 receive",
463*d9f75844SAndroid Build Coastguard Worker     "one direction",
464*d9f75844SAndroid Build Coastguard Worker     "1 send pt=1 max-width=720",  // The ' ' should be ';' in restriction list.
465*d9f75844SAndroid Build Coastguard Worker     "1 recv ;",
466*d9f75844SAndroid Build Coastguard Worker     "1 recv =",
467*d9f75844SAndroid Build Coastguard Worker     "1 recv a=b=c",
468*d9f75844SAndroid Build Coastguard Worker     "1 send max-width=720;pt=101",  // pt= should appear first.
469*d9f75844SAndroid Build Coastguard Worker     "1 send pt=101;pt=102",
470*d9f75844SAndroid Build Coastguard Worker     "1 send pt=101,101",
471*d9f75844SAndroid Build Coastguard Worker     "1 recv max-width=720;max-width=720",
472*d9f75844SAndroid Build Coastguard Worker     "1 send pt=",
473*d9f75844SAndroid Build Coastguard Worker     "1 send pt=abc",
474*d9f75844SAndroid Build Coastguard Worker     "1 recv ;;",
475*d9f75844SAndroid Build Coastguard Worker     "~1 recv",
476*d9f75844SAndroid Build Coastguard Worker     "1$2 send",
477*d9f75844SAndroid Build Coastguard Worker     "1=2 send",
478*d9f75844SAndroid Build Coastguard Worker     "1* send",
479*d9f75844SAndroid Build Coastguard Worker };
480*d9f75844SAndroid Build Coastguard Worker 
481*d9f75844SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(RidDescriptionDeserializationErrors,
482*d9f75844SAndroid Build Coastguard Worker                          RidDescriptionSdpSerializerTest,
483*d9f75844SAndroid Build Coastguard Worker                          ValuesIn(kRidDescriptionMalformedStrings));
484*d9f75844SAndroid Build Coastguard Worker 
485*d9f75844SAndroid Build Coastguard Worker }  // namespace webrtc
486