1 /* GStreamer unit tests for the SDP support library
2  *
3  * Copyright (C) 2013 Jose Antonio Santos Cadenas <santoscadenas@gmail.com>
4  * Copyright (C) 2013 Kurento
5  * Contact: Miguel París Díaz <mparisdiaz@gmail.com>
6  * Contact: José Antonio Santos Cadenas <santoscadenas@kurento.com>
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Library General Public
10  * License as published by the Free Software Foundation; either
11  * version 2 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16  * Library General Public License for more details.
17  *
18  * You should have received a copy of the GNU Library General Public
19  * License along with this library; if not, write to the
20  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21  * Boston, MA 02111-1307, USA.
22  */
23 
24 #ifdef HAVE_CONFIG_H
25 #include "config.h"
26 #endif
27 
28 #include <gst/check/gstcheck.h>
29 #include <gst/sdp/gstsdpmessage.h>
30 
31 /* *INDENT-OFF* */
32 static const gchar *sdp = "v=0\r\n"
33     "o=- 123456 0 IN IP4 127.0.0.1\r\n"
34     "s=TestSessionToCopy\r\n"
35     "c=IN IP4 127.0.0.1\r\n"
36     "t=0 0\r\n"
37     "a=sendrecv\r\n"
38     "m=video 3434 RTP/AVP 96 97 99\r\n"
39     "a=rtpmap:96 MP4V-ES/90000\r\n"
40     "a=rtpmap:97 H263-1998/90000\r\n"
41     "a=rtpmap:99 H263/90000\r\n"
42     "a=sendrecv\r\n"
43     "m=video 6565 RTP/AVP 98\r\n"
44     "a=rtpmap:98 VP8/90000\r\n"
45     "a=sendrecv\r\n"
46     "m=audio 4545 RTP/AVP 14\r\n"
47     "a=sendrecv\r\n"
48     "m=audio 1010 TCP 14\r\n";
49 
50 static const gchar caps_video_string1[] =
51     "application/x-unknown, media=(string)video, payload=(int)96, "
52     "clock-rate=(int)90000, encoding-name=(string)MP4V-ES";
53 
54 static const gchar caps_video_string2[] =
55     "application/x-unknown, media=(string)video, payload=(int)97, "
56     "clock-rate=(int)90000, encoding-name=(string)H263-1998";
57 
58 static const gchar caps_audio_string[] =
59     "application/x-unknown, media=(string)audio, payload=(int)14, "
60     "clock-rate=(int)90000";
61 
62 static const gchar * sdp_rtcp_fb = "v=0\r\n"
63     "o=- 123456 2 IN IP4 127.0.0.1 \r\n"
64     "s=-\r\n"
65     "t=0 0\r\n"
66     "a=maxptime:60\r\n"
67     "a=sendrecv\r\n"
68     "m=video 1 UDP/TLS/RTP/SAVPF 100 101 102\r\n"
69     "c=IN IP4 1.1.1.1\r\n"
70     "a=rtpmap:100 VP8/90000\r\n"
71     "a=rtcp-fb:100 nack\r\n"
72     "a=rtcp-fb:100 nack pli\r\n"
73     "a=rtcp-fb:100 ccm fir\r\n"
74     "a=rtpmap:101 VP9/90000\r\n"
75     "a=rtcp-fb:101 nack pli\r\n"
76     "a=rtpmap:102 H264/90000\r\n"
77     "a=rtcp-fb:102    ccm fir\r\n"; /* incorrect spacing */
78 
79 static const gchar caps_video_rtcp_fb_pt_100[] =
80     "application/x-unknown, media=(string)video, payload=(int)100, "
81     "clock-rate=(int)90000, encoding-name=(string)VP8, "
82     "rtcp-fb-ccm-fir=(boolean)true, rtcp-fb-nack=(boolean)true, "
83     "rtcp-fb-nack-pli=(boolean)true";
84 
85 static const gchar caps_video_rtcp_fb_pt_101[] =
86     "application/x-unknown, media=(string)video, payload=(int)101, "
87     "clock-rate=(int)90000, encoding-name=(string)VP9, "
88     "rtcp-fb-nack-pli=(boolean)true";
89 
90 static const gchar caps_video_rtcp_fb_pt_102[] =
91     "application/x-unknown, media=(string)video, payload=(int)102, "
92     "clock-rate=(int)90000, encoding-name=(string)H264, "
93     "rtcp-fb-ccm-fir=(boolean)true";
94 
95 static const gchar *sdp_rtcp_fb_all = "v=0\r\n"
96     "o=- 123456 2 IN IP4 127.0.0.1 \r\n"
97     "s=-\r\n"
98     "t=0 0\r\n"
99     "a=maxptime:60\r\n"
100     "a=sendrecv\r\n"
101     "m=video 1 UDP/TLS/RTP/SAVPF 100 101 102\r\n"
102     "c=IN IP4 1.1.1.1\r\n"
103     "a=rtpmap:100 VP8/90000\r\n"
104     "a=rtcp-fb:* nack\r\n"
105     "a=rtcp-fb:* nack pli\r\n"
106     "a=rtcp-fb:100 ccm fir\r\n"
107     "a=rtpmap:101 VP9/90000\r\n"
108     "a=rtcp-fb:101 ccm fir\r\n"
109     "a=rtpmap:102 H264/90000\r\n";
110 
111 static const gchar caps_video_rtcp_fb_all_pt_100[] =
112     "application/x-unknown, media=(string)video, payload=(int)100, "
113     "clock-rate=(int)90000, encoding-name=(string)VP8, "
114     "rtcp-fb-ccm-fir=(boolean)true, rtcp-fb-nack=(boolean)true, "
115     "rtcp-fb-nack-pli=(boolean)true";
116 
117 static const gchar caps_video_rtcp_fb_all_pt_101[] =
118     "application/x-unknown, media=(string)video, payload=(int)101, "
119     "clock-rate=(int)90000, encoding-name=(string)VP9, "
120     "rtcp-fb-ccm-fir=(boolean)true, rtcp-fb-nack=(boolean)true, "
121     "rtcp-fb-nack-pli=(boolean)true";
122 
123 static const gchar caps_video_rtcp_fb_all_pt_102[] =
124     "application/x-unknown, media=(string)video, payload=(int)102, "
125     "clock-rate=(int)90000, encoding-name=(string)H264, "
126     "rtcp-fb-nack=(boolean)true, rtcp-fb-nack-pli=(boolean)true";
127 
128 /* *INDENT-ON* */
129 
GST_START_TEST(boxed)130 GST_START_TEST (boxed)
131 {
132   GValue value = G_VALUE_INIT;
133   GValue value_copy = G_VALUE_INIT;
134   GstSDPMessage *message, *copy;
135   gchar *message1_str, *message2_str, *copy_str;
136   const gchar *repeat1[] = { "789", "012", NULL };
137 
138   gst_sdp_message_new (&message);
139   gst_sdp_message_parse_buffer ((guint8 *) sdp, -1, message);
140 
141   gst_sdp_message_add_time (message, "123", "456", repeat1);
142 
143   g_value_init (&value, GST_TYPE_SDP_MESSAGE);
144   g_value_init (&value_copy, GST_TYPE_SDP_MESSAGE);
145 
146   g_value_set_boxed (&value, message);
147   message1_str = gst_sdp_message_as_text (message);
148   GST_DEBUG ("message1:\n%s", message1_str);
149   gst_sdp_message_free (message);
150 
151   message = g_value_get_boxed (&value);
152   message2_str = gst_sdp_message_as_text (message);
153   GST_DEBUG ("message2:\n%s", message2_str);
154 
155   fail_if (g_strcmp0 (message1_str, message2_str) != 0);
156 
157   g_value_copy (&value, &value_copy);
158   g_value_reset (&value);
159 
160   copy = g_value_dup_boxed (&value_copy);
161   g_value_reset (&value_copy);
162 
163   copy_str = gst_sdp_message_as_text (copy);
164   gst_sdp_message_free (copy);
165   GST_DEBUG ("copy:\n%s", copy_str);
166 
167   fail_if (g_strcmp0 (message1_str, copy_str));
168 
169   g_free (message1_str);
170   g_free (message2_str);
171   g_free (copy_str);
172 }
173 
174 GST_END_TEST
GST_START_TEST(copy)175 GST_START_TEST (copy)
176 {
177   GstSDPMessage *message, *copy;
178   glong length = -1;
179   gchar *message_str, *copy_str;
180   const gchar *repeat1[] = { "789", "012", NULL };
181   const gchar *repeat2[] = { "987", "210", NULL };
182 
183   gst_sdp_message_new (&message);
184   gst_sdp_message_parse_buffer ((guint8 *) sdp, length, message);
185 
186   gst_sdp_message_add_time (message, "123", "456", repeat1);
187   gst_sdp_message_add_time (message, "321", "654", repeat2);
188 
189   gst_sdp_message_copy (message, &copy);
190 
191   message_str = gst_sdp_message_as_text (message);
192   GST_DEBUG ("Original:\n%s", message_str);
193   gst_sdp_message_free (message);
194   copy_str = gst_sdp_message_as_text (copy);
195   gst_sdp_message_free (copy);
196   GST_DEBUG ("Copy:\n%s", copy_str);
197 
198   fail_if (g_strcmp0 (copy_str, message_str) != 0);
199   g_free (copy_str);
200   g_free (message_str);
201 }
202 
203 GST_END_TEST
GST_START_TEST(modify)204 GST_START_TEST (modify)
205 {
206   GstSDPMessage *message;
207   glong length = -1;
208   const GstSDPMedia *media;
209   const gchar *old_val;
210   const gchar *result;
211   GstSDPAttribute attr;
212 
213   gst_sdp_message_new (&message);
214   gst_sdp_message_parse_buffer ((guint8 *) sdp, length, message);
215 
216   /* modify session attribute */
217   fail_unless (gst_sdp_message_add_attribute (message,
218           "test_attr_session", "param1=val1") == GST_SDP_OK);
219 
220   old_val = gst_sdp_message_get_attribute_val (message, "test_attr_session");
221 
222   fail_unless (old_val != NULL);
223   attr.key = g_strdup ("test_attr_session");
224   attr.value = g_strdup_printf ("%s;param2=val2", old_val);
225 
226   fail_unless (gst_sdp_message_replace_attribute (message, 0,
227           &attr) == GST_SDP_OK);
228 
229   result = gst_sdp_message_get_attribute_val (message, "test_attr_session");
230   fail_unless (result != NULL);
231   fail_unless (g_strcmp0 (result, "param1=val1;param2=val2") == 0);
232 
233 
234   /* modify media attribute */
235   media = gst_sdp_message_get_media (message, 0);
236   fail_unless (media != NULL);
237 
238   fail_unless (gst_sdp_media_add_attribute ((GstSDPMedia *) media,
239           "test_attr_media", "param3=val3") == GST_SDP_OK);
240 
241   old_val =
242       gst_sdp_media_get_attribute_val ((GstSDPMedia *) media,
243       "test_attr_media");
244 
245   fail_unless (old_val != NULL);
246   attr.key = g_strdup ("test_attr_media");
247   attr.value = g_strdup ("myparam=myval");
248 
249   fail_unless (gst_sdp_media_replace_attribute ((GstSDPMedia *) media,
250           0, &attr) == GST_SDP_OK);
251 
252   result =
253       gst_sdp_media_get_attribute_val ((GstSDPMedia *) media,
254       "test_attr_media");
255   fail_unless (result != NULL);
256   fail_unless (g_strcmp0 (result, "myparam=myval") == 0);
257 
258   gst_sdp_message_free (message);
259 }
260 
261 GST_END_TEST
GST_START_TEST(null)262 GST_START_TEST (null)
263 {
264   GstSDPMessage *message;
265   const GstSDPMedia *media;
266   glong length = -1;
267   const gchar *val;
268 
269   gst_sdp_message_new (&message);
270   gst_sdp_message_parse_buffer ((guint8 *) sdp, length, message);
271 
272   fail_unless (gst_sdp_message_add_attribute (message,
273           "test_attr_session", NULL) == GST_SDP_OK);
274 
275   val = gst_sdp_message_get_attribute_val (message, "test_attr_session");
276   fail_unless (val == NULL);
277 
278   media = gst_sdp_message_get_media (message, 0);
279 
280   fail_unless (gst_sdp_media_add_attribute ((GstSDPMedia *) media,
281           "test_attr_media", NULL) == GST_SDP_OK);
282 
283   val = gst_sdp_media_get_attribute_val (media, "test_attr_media");
284   fail_unless (val == NULL);
285 
286   gst_sdp_message_free (message);
287 }
288 
289 GST_END_TEST
GST_START_TEST(caps_from_media)290 GST_START_TEST (caps_from_media)
291 {
292   GstSDPMessage *message;
293   glong length = -1;
294   const GstSDPMedia *media1, *media2, *media3;
295   GstCaps *caps_video1, *caps_video2, *caps_audio;
296   GstCaps *result_video1, *result_video2, *result_audio;
297 
298   gst_sdp_message_new (&message);
299   gst_sdp_message_parse_buffer ((guint8 *) sdp, length, message);
300 
301   media1 = gst_sdp_message_get_media (message, 0);
302   fail_unless (media1 != NULL);
303 
304   media2 = gst_sdp_message_get_media (message, 1);
305   fail_unless (media2 != NULL);
306 
307   media3 = gst_sdp_message_get_media (message, 2);
308   fail_unless (media2 != NULL);
309 
310   caps_video1 = gst_sdp_media_get_caps_from_media (media1, 96);
311   caps_video2 = gst_sdp_media_get_caps_from_media (media1, 97);
312   caps_audio = gst_sdp_media_get_caps_from_media (media3, 14);
313 
314   result_video1 = gst_caps_from_string (caps_video_string1);
315   fail_unless (gst_caps_is_strictly_equal (caps_video1, result_video1));
316   gst_caps_unref (result_video1);
317   gst_caps_unref (caps_video1);
318 
319   result_video2 = gst_caps_from_string (caps_video_string2);
320   fail_unless (gst_caps_is_strictly_equal (caps_video2, result_video2));
321   gst_caps_unref (result_video2);
322   gst_caps_unref (caps_video2);
323 
324   result_audio = gst_caps_from_string (caps_audio_string);
325   fail_unless (gst_caps_is_strictly_equal (caps_audio, result_audio));
326   gst_caps_unref (result_audio);
327   gst_caps_unref (caps_audio);
328 
329   gst_sdp_message_free (message);
330 }
331 
332 GST_END_TEST
GST_START_TEST(media_from_caps)333 GST_START_TEST (media_from_caps)
334 {
335   GstSDPResult ret = GST_SDP_OK;
336   GstSDPMessage *message;
337   glong length = -1;
338   GstSDPMedia *media_video, *media_audio;
339   const GstSDPMedia *result_video, *result_audio;
340   GstCaps *caps_video, *caps_audio;
341   const gchar *media1_text, *media2_text, *media3_text, *media4_text;
342 
343   caps_video = gst_caps_from_string (caps_video_string1);
344   caps_audio = gst_caps_from_string (caps_audio_string);
345 
346   gst_sdp_media_new (&media_video);
347   fail_unless (media_video != NULL);
348   gst_sdp_media_new (&media_audio);
349   fail_unless (media_audio != NULL);
350 
351   ret = gst_sdp_media_set_media_from_caps (caps_video, media_video);
352   fail_unless (ret == GST_SDP_OK);
353   gst_caps_unref (caps_video);
354   ret = gst_sdp_media_set_media_from_caps (caps_audio, media_audio);
355   fail_unless (ret == GST_SDP_OK);
356   gst_caps_unref (caps_audio);
357 
358   gst_sdp_message_new (&message);
359   gst_sdp_message_parse_buffer ((guint8 *) sdp, length, message);
360 
361   result_video = gst_sdp_message_get_media (message, 0);
362   fail_unless (result_video != NULL);
363 
364   result_audio = gst_sdp_message_get_media (message, 2);
365   fail_unless (result_audio != NULL);
366 
367   media1_text = gst_sdp_media_get_attribute_val (media_video, "rtpmap");
368   media2_text = gst_sdp_media_get_attribute_val (result_video, "rtpmap");
369   media3_text = gst_sdp_media_get_format (media_audio, 0);
370   media4_text = gst_sdp_media_get_format (result_audio, 0);
371 
372   fail_if (g_strcmp0 (media1_text, media2_text) != 0);
373   fail_if (g_strcmp0 (media3_text, media4_text) != 0);
374 
375   gst_sdp_media_free (media_video);
376   gst_sdp_media_free (media_audio);
377   gst_sdp_message_free (message);
378 }
379 
380 GST_END_TEST
GST_START_TEST(caps_from_media_rtcp_fb)381 GST_START_TEST (caps_from_media_rtcp_fb)
382 {
383   GstSDPMessage *message;
384   glong length = -1;
385   const GstSDPMedia *media1;
386   GstCaps *caps1, *caps2, *caps3;
387   GstCaps *result1, *result2, *result3;
388 
389   gst_sdp_message_new (&message);
390   gst_sdp_message_parse_buffer ((guint8 *) sdp_rtcp_fb, length, message);
391 
392   media1 = gst_sdp_message_get_media (message, 0);
393   fail_unless (media1 != NULL);
394 
395   caps1 = gst_sdp_media_get_caps_from_media (media1, 100);
396   result1 = gst_caps_from_string (caps_video_rtcp_fb_pt_100);
397   fail_unless (gst_caps_is_strictly_equal (caps1, result1));
398 
399   gst_caps_unref (result1);
400   gst_caps_unref (caps1);
401 
402   caps2 = gst_sdp_media_get_caps_from_media (media1, 101);
403   result2 = gst_caps_from_string (caps_video_rtcp_fb_pt_101);
404   fail_unless (gst_caps_is_strictly_equal (caps2, result2));
405 
406   gst_caps_unref (result2);
407   gst_caps_unref (caps2);
408 
409   caps3 = gst_sdp_media_get_caps_from_media (media1, 102);
410   result3 = gst_caps_from_string (caps_video_rtcp_fb_pt_102);
411 
412   fail_unless (gst_caps_is_strictly_equal (caps3, result3));
413 
414   gst_caps_unref (result3);
415   gst_caps_unref (caps3);
416 
417   gst_sdp_message_free (message);
418 }
419 
420 GST_END_TEST
GST_START_TEST(caps_from_media_rtcp_fb_all)421 GST_START_TEST (caps_from_media_rtcp_fb_all)
422 {
423   GstSDPMessage *message;
424   glong length = -1;
425   const GstSDPMedia *media1;
426   GstCaps *caps1, *caps2, *caps3;
427   GstCaps *result1, *result2, *result3;
428 
429   gst_sdp_message_new (&message);
430   gst_sdp_message_parse_buffer ((guint8 *) sdp_rtcp_fb_all, length, message);
431 
432   media1 = gst_sdp_message_get_media (message, 0);
433   fail_unless (media1 != NULL);
434 
435   caps1 = gst_sdp_media_get_caps_from_media (media1, 100);
436   result1 = gst_caps_from_string (caps_video_rtcp_fb_all_pt_100);
437   fail_unless (gst_caps_is_strictly_equal (caps1, result1));
438 
439   gst_caps_unref (result1);
440   gst_caps_unref (caps1);
441 
442   caps2 = gst_sdp_media_get_caps_from_media (media1, 101);
443   result2 = gst_caps_from_string (caps_video_rtcp_fb_all_pt_101);
444   fail_unless (gst_caps_is_strictly_equal (caps2, result2));
445 
446   gst_caps_unref (result2);
447   gst_caps_unref (caps2);
448 
449   caps3 = gst_sdp_media_get_caps_from_media (media1, 102);
450   result3 = gst_caps_from_string (caps_video_rtcp_fb_all_pt_102);
451 
452   fail_unless (gst_caps_is_strictly_equal (caps3, result3));
453 
454   gst_caps_unref (result3);
455   gst_caps_unref (caps3);
456 
457   gst_sdp_message_free (message);
458 }
459 
460 GST_END_TEST
GST_START_TEST(media_from_caps_rtcp_fb_pt_100)461 GST_START_TEST (media_from_caps_rtcp_fb_pt_100)
462 {
463   GstSDPResult ret = GST_SDP_OK;
464   GstSDPMessage *message;
465   glong length = -1;
466   GstSDPMedia *media_caps;
467   const GstSDPMedia *media_sdp;
468   GstCaps *caps;
469   const gchar *attr_val_caps1, *attr_val_caps2, *attr_val_caps3;
470   const gchar *attr_val_sdp1, *attr_val_sdp2, *attr_val_sdp3;
471 
472   caps = gst_caps_from_string (caps_video_rtcp_fb_pt_100);
473 
474   gst_sdp_media_new (&media_caps);
475   fail_unless (media_caps != NULL);
476 
477   ret = gst_sdp_media_set_media_from_caps (caps, media_caps);
478   fail_unless (ret == GST_SDP_OK);
479   gst_caps_unref (caps);
480 
481   gst_sdp_message_new (&message);
482   gst_sdp_message_parse_buffer ((guint8 *) sdp_rtcp_fb, length, message);
483 
484   media_sdp = gst_sdp_message_get_media (message, 0);
485   fail_unless (media_sdp != NULL);
486 
487   attr_val_caps1 = gst_sdp_media_get_attribute_val_n (media_caps, "rtcp-fb", 0);
488   attr_val_caps2 = gst_sdp_media_get_attribute_val_n (media_caps, "rtcp-fb", 1);
489   attr_val_caps3 = gst_sdp_media_get_attribute_val_n (media_caps, "rtcp-fb", 2);
490 
491   attr_val_sdp1 = gst_sdp_media_get_attribute_val_n (media_sdp, "rtcp-fb", 0);
492   attr_val_sdp2 = gst_sdp_media_get_attribute_val_n (media_sdp, "rtcp-fb", 1);
493   attr_val_sdp3 = gst_sdp_media_get_attribute_val_n (media_sdp, "rtcp-fb", 2);
494 
495   fail_if (g_strcmp0 (attr_val_caps1, attr_val_sdp1) != 0);
496   fail_if (g_strcmp0 (attr_val_caps2, attr_val_sdp2) != 0);
497   fail_if (g_strcmp0 (attr_val_caps3, attr_val_sdp3) != 0);
498 
499   gst_sdp_media_free (media_caps);
500   gst_sdp_message_free (message);
501 }
502 
503 GST_END_TEST
GST_START_TEST(media_from_caps_rtcp_fb_pt_101)504 GST_START_TEST (media_from_caps_rtcp_fb_pt_101)
505 {
506   GstSDPResult ret = GST_SDP_OK;
507   GstSDPMessage *message;
508   glong length = -1;
509   GstSDPMedia *media_caps;
510   const GstSDPMedia *media_sdp;
511   GstCaps *caps;
512   const gchar *attr_val_caps1, *attr_val_sdp1;
513 
514   caps = gst_caps_from_string (caps_video_rtcp_fb_pt_101);
515 
516   gst_sdp_media_new (&media_caps);
517   fail_unless (media_caps != NULL);
518 
519   ret = gst_sdp_media_set_media_from_caps (caps, media_caps);
520   fail_unless (ret == GST_SDP_OK);
521   gst_caps_unref (caps);
522 
523   gst_sdp_message_new (&message);
524   gst_sdp_message_parse_buffer ((guint8 *) sdp_rtcp_fb, length, message);
525 
526   media_sdp = gst_sdp_message_get_media (message, 0);
527   fail_unless (media_sdp != NULL);
528 
529   attr_val_caps1 = gst_sdp_media_get_attribute_val (media_caps, "rtcp-fb");
530   attr_val_sdp1 = gst_sdp_media_get_attribute_val_n (media_sdp, "rtcp-fb", 3);
531 
532   fail_if (g_strcmp0 (attr_val_caps1, attr_val_sdp1) != 0);
533 
534   gst_sdp_media_free (media_caps);
535   gst_sdp_message_free (message);
536 }
537 
538 GST_END_TEST
GST_START_TEST(caps_from_media_really_const)539 GST_START_TEST (caps_from_media_really_const)
540 {
541   GstSDPMessage *message;
542   glong length = -1;
543   const GstSDPMedia *media1;
544   gchar *serialized;
545   GstCaps *caps;
546 
547   /* BUG: gst_sdp_media_get_caps_from_media() used to modify the media passed
548    * thus violating the const tag */
549 
550   gst_sdp_message_new (&message);
551   gst_sdp_message_parse_buffer ((guint8 *) sdp, length, message);
552 
553   serialized = gst_sdp_message_as_text (message);
554   fail_unless (g_strcmp0 (serialized, sdp) == 0);
555   g_free (serialized);
556 
557   media1 = gst_sdp_message_get_media (message, 0);
558   fail_unless (media1 != NULL);
559 
560   caps = gst_sdp_media_get_caps_from_media (media1, 96);
561 
562   serialized = gst_sdp_message_as_text (message);
563   fail_unless (g_strcmp0 (serialized, sdp) == 0);
564   g_free (serialized);
565 
566   gst_caps_unref (caps);
567 
568   gst_sdp_message_free (message);
569 }
570 
571 GST_END_TEST
572 /*
573  * End of test cases
574  */
575 static Suite *
sdp_suite(void)576 sdp_suite (void)
577 {
578   Suite *s = suite_create ("sdp");
579   TCase *tc_chain = tcase_create ("sdp");
580 
581   suite_add_tcase (s, tc_chain);
582   tcase_add_test (tc_chain, copy);
583   tcase_add_test (tc_chain, boxed);
584   tcase_add_test (tc_chain, modify);
585   tcase_add_test (tc_chain, null);
586   tcase_add_test (tc_chain, caps_from_media);
587   tcase_add_test (tc_chain, caps_from_media_really_const);
588   tcase_add_test (tc_chain, media_from_caps);
589   tcase_add_test (tc_chain, caps_from_media_rtcp_fb);
590   tcase_add_test (tc_chain, caps_from_media_rtcp_fb_all);
591   tcase_add_test (tc_chain, media_from_caps_rtcp_fb_pt_100);
592   tcase_add_test (tc_chain, media_from_caps_rtcp_fb_pt_101);
593 
594   return s;
595 }
596 
597 GST_CHECK_MAIN (sdp);
598