2 * Copyright (C) 2012 Wim Taymans <wim.taymans@gmail.com>
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
17 * Boston, MA 02110-1301, USA.
20 #include <gst/check/gstcheck.h>
22 #include <rtsp-client.h>
25 static guint expected_session_timeout = 60;
28 test_response_200 (GstRTSPClient * client, GstRTSPMessage * response,
29 gboolean close, gpointer user_data)
31 GstRTSPStatusCode code;
33 GstRTSPVersion version;
35 fail_unless (gst_rtsp_message_get_type (response) ==
36 GST_RTSP_MESSAGE_RESPONSE);
38 fail_unless (gst_rtsp_message_parse_response (response, &code, &reason,
41 fail_unless (code == GST_RTSP_STS_OK);
42 fail_unless (g_str_equal (reason, "OK"));
43 fail_unless (version == GST_RTSP_VERSION_1_0);
49 test_response_400 (GstRTSPClient * client, GstRTSPMessage * response,
50 gboolean close, gpointer user_data)
52 GstRTSPStatusCode code;
54 GstRTSPVersion version;
56 fail_unless (gst_rtsp_message_get_type (response) ==
57 GST_RTSP_MESSAGE_RESPONSE);
59 fail_unless (gst_rtsp_message_parse_response (response, &code, &reason,
62 fail_unless (code == GST_RTSP_STS_BAD_REQUEST);
63 fail_unless (g_str_equal (reason, "Bad Request"));
64 fail_unless (version == GST_RTSP_VERSION_1_0);
70 test_response_404 (GstRTSPClient * client, GstRTSPMessage * response,
71 gboolean close, gpointer user_data)
73 GstRTSPStatusCode code;
75 GstRTSPVersion version;
77 fail_unless (gst_rtsp_message_get_type (response) ==
78 GST_RTSP_MESSAGE_RESPONSE);
80 fail_unless (gst_rtsp_message_parse_response (response, &code, &reason,
83 fail_unless (code == GST_RTSP_STS_NOT_FOUND);
84 fail_unless (g_str_equal (reason, "Not Found"));
85 fail_unless (version == GST_RTSP_VERSION_1_0);
91 test_response_454 (GstRTSPClient * client, GstRTSPMessage * response,
92 gboolean close, gpointer user_data)
94 GstRTSPStatusCode code;
96 GstRTSPVersion version;
98 fail_unless (gst_rtsp_message_get_type (response) ==
99 GST_RTSP_MESSAGE_RESPONSE);
101 fail_unless (gst_rtsp_message_parse_response (response, &code, &reason,
104 fail_unless (code == GST_RTSP_STS_SESSION_NOT_FOUND);
105 fail_unless (g_str_equal (reason, "Session Not Found"));
106 fail_unless (version == GST_RTSP_VERSION_1_0);
111 static GstRTSPClient *
112 setup_client (const gchar * launch_line)
114 GstRTSPClient *client;
115 GstRTSPSessionPool *session_pool;
116 GstRTSPMountPoints *mount_points;
117 GstRTSPMediaFactory *factory;
118 GstRTSPThreadPool *thread_pool;
120 client = gst_rtsp_client_new ();
122 session_pool = gst_rtsp_session_pool_new ();
123 gst_rtsp_client_set_session_pool (client, session_pool);
125 mount_points = gst_rtsp_mount_points_new ();
126 factory = gst_rtsp_media_factory_new ();
127 if (launch_line == NULL)
128 gst_rtsp_media_factory_set_launch (factory,
129 "videotestsrc ! video/x-raw,width=352,height=288 ! rtpgstpay name=pay0 pt=96");
131 gst_rtsp_media_factory_set_launch (factory, launch_line);
133 gst_rtsp_mount_points_add_factory (mount_points, "/test", factory);
134 gst_rtsp_client_set_mount_points (client, mount_points);
136 thread_pool = gst_rtsp_thread_pool_new ();
137 gst_rtsp_client_set_thread_pool (client, thread_pool);
139 g_object_unref (mount_points);
140 g_object_unref (session_pool);
141 g_object_unref (thread_pool);
147 teardown_client (GstRTSPClient *client)
149 gst_rtsp_client_set_thread_pool (client, NULL);
150 g_object_unref (client);
153 GST_START_TEST (test_request)
155 GstRTSPClient *client;
156 GstRTSPMessage request = { 0, };
159 client = gst_rtsp_client_new ();
161 /* OPTIONS with invalid url */
162 fail_unless (gst_rtsp_message_init_request (&request, GST_RTSP_OPTIONS,
163 "foopy://padoop/") == GST_RTSP_OK);
164 str = g_strdup_printf ("%d", cseq);
165 gst_rtsp_message_add_header (&request, GST_RTSP_HDR_CSEQ, str);
168 gst_rtsp_client_set_send_func (client, test_response_400, NULL, NULL);
169 fail_unless (gst_rtsp_client_handle_message (client,
170 &request) == GST_RTSP_OK);
172 gst_rtsp_message_unset (&request);
174 /* OPTIONS with unknown session id */
175 fail_unless (gst_rtsp_message_init_request (&request, GST_RTSP_OPTIONS,
176 "rtsp://localhost/test") == GST_RTSP_OK);
177 str = g_strdup_printf ("%d", cseq);
178 gst_rtsp_message_add_header (&request, GST_RTSP_HDR_CSEQ, str);
180 gst_rtsp_message_add_header (&request, GST_RTSP_HDR_SESSION, "foobar");
182 gst_rtsp_client_set_send_func (client, test_response_454, NULL, NULL);
183 fail_unless (gst_rtsp_client_handle_message (client,
184 &request) == GST_RTSP_OK);
186 gst_rtsp_message_unset (&request);
188 g_object_unref (client);
194 test_option_response_200 (GstRTSPClient * client, GstRTSPMessage * response,
195 gboolean close, gpointer user_data)
197 GstRTSPStatusCode code;
199 GstRTSPVersion version;
201 GstRTSPMethod methods;
203 fail_unless (gst_rtsp_message_get_type (response) ==
204 GST_RTSP_MESSAGE_RESPONSE);
206 fail_unless (gst_rtsp_message_parse_response (response, &code, &reason,
209 fail_unless (code == GST_RTSP_STS_OK);
210 fail_unless (g_str_equal (reason, "OK"));
211 fail_unless (version == GST_RTSP_VERSION_1_0);
213 fail_unless (gst_rtsp_message_get_header (response, GST_RTSP_HDR_CSEQ, &str,
215 fail_unless (atoi (str) == cseq++);
217 fail_unless (gst_rtsp_message_get_header (response, GST_RTSP_HDR_PUBLIC, &str,
220 methods = gst_rtsp_options_from_text (str);
221 fail_if (methods == 0);
222 fail_unless (methods == (GST_RTSP_DESCRIBE |
227 GST_RTSP_GET_PARAMETER | GST_RTSP_SET_PARAMETER | GST_RTSP_TEARDOWN));
232 GST_START_TEST (test_options)
234 GstRTSPClient *client;
235 GstRTSPMessage request = { 0, };
238 client = gst_rtsp_client_new ();
241 fail_unless (gst_rtsp_message_init_request (&request, GST_RTSP_OPTIONS,
242 "rtsp://localhost/test") == GST_RTSP_OK);
243 str = g_strdup_printf ("%d", cseq);
244 gst_rtsp_message_add_header (&request, GST_RTSP_HDR_CSEQ, str);
247 gst_rtsp_client_set_send_func (client, test_option_response_200, NULL, NULL);
248 fail_unless (gst_rtsp_client_handle_message (client,
249 &request) == GST_RTSP_OK);
250 gst_rtsp_message_unset (&request);
252 g_object_unref (client);
257 GST_START_TEST (test_describe)
259 GstRTSPClient *client;
260 GstRTSPMessage request = { 0, };
263 client = gst_rtsp_client_new ();
265 /* simple DESCRIBE for non-existing url */
266 fail_unless (gst_rtsp_message_init_request (&request, GST_RTSP_DESCRIBE,
267 "rtsp://localhost/test") == GST_RTSP_OK);
268 str = g_strdup_printf ("%d", cseq);
269 gst_rtsp_message_add_header (&request, GST_RTSP_HDR_CSEQ, str);
272 gst_rtsp_client_set_send_func (client, test_response_404, NULL, NULL);
273 fail_unless (gst_rtsp_client_handle_message (client,
274 &request) == GST_RTSP_OK);
275 gst_rtsp_message_unset (&request);
277 g_object_unref (client);
279 /* simple DESCRIBE for an existing url */
280 client = setup_client (NULL);
281 fail_unless (gst_rtsp_message_init_request (&request, GST_RTSP_DESCRIBE,
282 "rtsp://localhost/test") == GST_RTSP_OK);
283 str = g_strdup_printf ("%d", cseq);
284 gst_rtsp_message_add_header (&request, GST_RTSP_HDR_CSEQ, str);
287 gst_rtsp_client_set_send_func (client, test_response_200, NULL, NULL);
288 fail_unless (gst_rtsp_client_handle_message (client,
289 &request) == GST_RTSP_OK);
290 gst_rtsp_message_unset (&request);
292 teardown_client (client);
297 gchar *expected_transport = NULL;;
300 test_setup_response_200_multicast (GstRTSPClient * client,
301 GstRTSPMessage * response, gboolean close, gpointer user_data)
303 GstRTSPStatusCode code;
305 GstRTSPVersion version;
307 GstRTSPSessionPool *session_pool;
308 GstRTSPSession *session;
309 gchar **session_hdr_params;
311 fail_unless (expected_transport != NULL);
313 fail_unless (gst_rtsp_message_get_type (response) ==
314 GST_RTSP_MESSAGE_RESPONSE);
316 fail_unless (gst_rtsp_message_parse_response (response, &code, &reason,
319 fail_unless (code == GST_RTSP_STS_OK);
320 fail_unless (g_str_equal (reason, "OK"));
321 fail_unless (version == GST_RTSP_VERSION_1_0);
323 fail_unless (gst_rtsp_message_get_header (response, GST_RTSP_HDR_CSEQ, &str,
325 fail_unless (atoi (str) == cseq++);
327 fail_unless (gst_rtsp_message_get_header (response, GST_RTSP_HDR_TRANSPORT,
328 &str, 0) == GST_RTSP_OK);
330 fail_unless (!strcmp (str, expected_transport));
332 fail_unless (gst_rtsp_message_get_header (response, GST_RTSP_HDR_SESSION,
333 &str, 0) == GST_RTSP_OK);
334 session_hdr_params = g_strsplit (str, ";", -1);
336 /* session-id value */
337 fail_unless (session_hdr_params[0] != NULL);
339 if (expected_session_timeout != 60) {
340 /* session timeout param */
341 gchar *timeout_str = g_strdup_printf ("timeout=%u",
342 expected_session_timeout);
344 fail_unless (session_hdr_params[1] != NULL);
345 g_strstrip (session_hdr_params[1]);
346 fail_unless (g_strcmp0 (session_hdr_params[1], timeout_str) == 0);
347 g_free (timeout_str);
350 session_pool = gst_rtsp_client_get_session_pool (client);
351 fail_unless (session_pool != NULL);
353 fail_unless (gst_rtsp_session_pool_get_n_sessions (session_pool) == 1);
354 session = gst_rtsp_session_pool_find (session_pool, session_hdr_params[0]);
355 g_strfreev (session_hdr_params);
357 fail_unless (session != NULL);
358 g_object_unref (session);
360 g_object_unref (session_pool);
366 static GstRTSPClient *
367 setup_multicast_client (void)
369 GstRTSPClient *client;
370 GstRTSPSessionPool *session_pool;
371 GstRTSPMountPoints *mount_points;
372 GstRTSPMediaFactory *factory;
373 GstRTSPAddressPool *address_pool;
374 GstRTSPThreadPool *thread_pool;
376 client = gst_rtsp_client_new ();
378 session_pool = gst_rtsp_session_pool_new ();
379 gst_rtsp_client_set_session_pool (client, session_pool);
381 mount_points = gst_rtsp_mount_points_new ();
382 factory = gst_rtsp_media_factory_new ();
383 gst_rtsp_media_factory_set_launch (factory,
384 "audiotestsrc ! audio/x-raw,rate=44100 ! audioconvert ! rtpL16pay name=pay0");
385 address_pool = gst_rtsp_address_pool_new ();
386 fail_unless (gst_rtsp_address_pool_add_range (address_pool,
387 "233.252.0.1", "233.252.0.1", 5000, 5010, 1));
388 gst_rtsp_media_factory_set_address_pool (factory, address_pool);
389 gst_rtsp_media_factory_add_role (factory, "user",
390 "media.factory.access", G_TYPE_BOOLEAN, TRUE,
391 "media.factory.construct", G_TYPE_BOOLEAN, TRUE, NULL);
392 gst_rtsp_mount_points_add_factory (mount_points, "/test", factory);
393 gst_rtsp_client_set_mount_points (client, mount_points);
395 thread_pool = gst_rtsp_thread_pool_new ();
396 gst_rtsp_client_set_thread_pool (client, thread_pool);
398 g_object_unref (mount_points);
399 g_object_unref (session_pool);
400 g_object_unref (address_pool);
401 g_object_unref (thread_pool);
406 GST_START_TEST (test_client_multicast_transport_404)
408 GstRTSPClient *client;
409 GstRTSPMessage request = { 0, };
412 client = setup_multicast_client ();
414 /* simple SETUP for non-existing url */
415 fail_unless (gst_rtsp_message_init_request (&request, GST_RTSP_SETUP,
416 "rtsp://localhost/test2/stream=0") == GST_RTSP_OK);
417 str = g_strdup_printf ("%d", cseq);
418 gst_rtsp_message_take_header (&request, GST_RTSP_HDR_CSEQ, str);
419 gst_rtsp_message_add_header (&request, GST_RTSP_HDR_TRANSPORT,
420 "RTP/AVP;multicast");
422 gst_rtsp_client_set_send_func (client, test_response_404, NULL, NULL);
423 fail_unless (gst_rtsp_client_handle_message (client,
424 &request) == GST_RTSP_OK);
425 gst_rtsp_message_unset (&request);
427 teardown_client (client);
433 new_session_cb (GObject * client, GstRTSPSession * session, gpointer user_data)
435 GST_DEBUG ("%p: new session %p", client, session);
436 gst_rtsp_session_set_timeout (session, expected_session_timeout);
439 GST_START_TEST (test_client_multicast_transport)
441 GstRTSPClient *client;
442 GstRTSPMessage request = { 0, };
445 client = setup_multicast_client ();
447 expected_session_timeout = 20;
448 g_signal_connect (G_OBJECT (client), "new-session",
449 G_CALLBACK (new_session_cb), NULL);
451 /* simple SETUP with a valid URI and multicast */
452 fail_unless (gst_rtsp_message_init_request (&request, GST_RTSP_SETUP,
453 "rtsp://localhost/test/stream=0") == GST_RTSP_OK);
454 str = g_strdup_printf ("%d", cseq);
455 gst_rtsp_message_take_header (&request, GST_RTSP_HDR_CSEQ, str);
456 gst_rtsp_message_add_header (&request, GST_RTSP_HDR_TRANSPORT,
457 "RTP/AVP;multicast");
459 expected_transport = "RTP/AVP;multicast;destination=233.252.0.1;"
460 "ttl=1;port=5000-5001;mode=\"PLAY\"";
461 gst_rtsp_client_set_send_func (client, test_setup_response_200_multicast,
463 fail_unless (gst_rtsp_client_handle_message (client,
464 &request) == GST_RTSP_OK);
465 gst_rtsp_message_unset (&request);
466 expected_transport = NULL;
467 expected_session_timeout = 60;
468 teardown_client (client);
473 GST_START_TEST (test_client_multicast_ignore_transport_specific)
475 GstRTSPClient *client;
476 GstRTSPMessage request = { 0, };
479 client = setup_multicast_client ();
481 /* simple SETUP with a valid URI and multicast and a specific dest,
483 fail_unless (gst_rtsp_message_init_request (&request, GST_RTSP_SETUP,
484 "rtsp://localhost/test/stream=0") == GST_RTSP_OK);
485 str = g_strdup_printf ("%d", cseq);
486 gst_rtsp_message_take_header (&request, GST_RTSP_HDR_CSEQ, str);
487 gst_rtsp_message_add_header (&request, GST_RTSP_HDR_TRANSPORT,
488 "RTP/AVP;multicast;destination=233.252.0.2;ttl=2;port=5001-5006;");
490 expected_transport = "RTP/AVP;multicast;destination=233.252.0.1;"
491 "ttl=1;port=5000-5001;mode=\"PLAY\"";
492 gst_rtsp_client_set_send_func (client, test_setup_response_200_multicast,
494 fail_unless (gst_rtsp_client_handle_message (client,
495 &request) == GST_RTSP_OK);
496 gst_rtsp_message_unset (&request);
497 expected_transport = NULL;
499 teardown_client (client);
505 test_setup_response_461 (GstRTSPClient * client,
506 GstRTSPMessage * response, gboolean close, gpointer user_data)
508 GstRTSPStatusCode code;
510 GstRTSPVersion version;
513 fail_unless (expected_transport == NULL);
515 fail_unless (gst_rtsp_message_get_type (response) ==
516 GST_RTSP_MESSAGE_RESPONSE);
518 fail_unless (gst_rtsp_message_parse_response (response, &code, &reason,
521 fail_unless (code == GST_RTSP_STS_UNSUPPORTED_TRANSPORT);
522 fail_unless (g_str_equal (reason, "Unsupported transport"));
523 fail_unless (version == GST_RTSP_VERSION_1_0);
525 fail_unless (gst_rtsp_message_get_header (response, GST_RTSP_HDR_CSEQ, &str,
527 fail_unless (atoi (str) == cseq++);
533 GST_START_TEST (test_client_multicast_invalid_transport_specific)
535 GstRTSPClient *client;
536 GstRTSPMessage request = { 0, };
538 GstRTSPSessionPool *session_pool;
539 GstRTSPContext ctx = { NULL };
541 client = setup_multicast_client ();
544 ctx.auth = gst_rtsp_auth_new ();
546 gst_rtsp_token_new (GST_RTSP_TOKEN_TRANSPORT_CLIENT_SETTINGS,
547 G_TYPE_BOOLEAN, TRUE, GST_RTSP_TOKEN_MEDIA_FACTORY_ROLE, G_TYPE_STRING,
549 gst_rtsp_context_push_current (&ctx);
551 /* simple SETUP with a valid URI and multicast, but an invalid ip */
552 fail_unless (gst_rtsp_message_init_request (&request, GST_RTSP_SETUP,
553 "rtsp://localhost/test/stream=0") == GST_RTSP_OK);
554 str = g_strdup_printf ("%d", cseq);
555 gst_rtsp_message_take_header (&request, GST_RTSP_HDR_CSEQ, str);
556 gst_rtsp_message_add_header (&request, GST_RTSP_HDR_TRANSPORT,
557 "RTP/AVP;multicast;destination=233.252.0.2;ttl=1;port=5000-5001;");
559 gst_rtsp_client_set_send_func (client, test_setup_response_461, NULL, NULL);
560 fail_unless (gst_rtsp_client_handle_message (client,
561 &request) == GST_RTSP_OK);
562 gst_rtsp_message_unset (&request);
564 session_pool = gst_rtsp_client_get_session_pool (client);
565 fail_unless (session_pool != NULL);
566 /* FIXME: There seems to be a leak of a session here ! */
567 /* fail_unless (gst_rtsp_session_pool_get_n_sessions (session_pool) == 0); */
568 g_object_unref (session_pool);
572 /* simple SETUP with a valid URI and multicast, but an invalid prt */
573 fail_unless (gst_rtsp_message_init_request (&request, GST_RTSP_SETUP,
574 "rtsp://localhost/test/stream=0") == GST_RTSP_OK);
575 str = g_strdup_printf ("%d", cseq);
576 gst_rtsp_message_take_header (&request, GST_RTSP_HDR_CSEQ, str);
577 gst_rtsp_message_add_header (&request, GST_RTSP_HDR_TRANSPORT,
578 "RTP/AVP;multicast;destination=233.252.0.1;ttl=1;port=6000-6001;");
580 gst_rtsp_client_set_send_func (client, test_setup_response_461, NULL, NULL);
581 fail_unless (gst_rtsp_client_handle_message (client,
582 &request) == GST_RTSP_OK);
583 gst_rtsp_message_unset (&request);
585 session_pool = gst_rtsp_client_get_session_pool (client);
586 fail_unless (session_pool != NULL);
587 /* FIXME: There seems to be a leak of a session here ! */
588 /* fail_unless (gst_rtsp_session_pool_get_n_sessions (session_pool) == 0); */
589 g_object_unref (session_pool);
593 /* simple SETUP with a valid URI and multicast, but an invalid ttl */
594 fail_unless (gst_rtsp_message_init_request (&request, GST_RTSP_SETUP,
595 "rtsp://localhost/test/stream=0") == GST_RTSP_OK);
596 str = g_strdup_printf ("%d", cseq);
597 gst_rtsp_message_take_header (&request, GST_RTSP_HDR_CSEQ, str);
598 gst_rtsp_message_add_header (&request, GST_RTSP_HDR_TRANSPORT,
599 "RTP/AVP;multicast;destination=233.252.0.1;ttl=2;port=5000-5001;");
601 gst_rtsp_client_set_send_func (client, test_setup_response_461, NULL, NULL);
602 fail_unless (gst_rtsp_client_handle_message (client,
603 &request) == GST_RTSP_OK);
604 gst_rtsp_message_unset (&request);
606 session_pool = gst_rtsp_client_get_session_pool (client);
607 fail_unless (session_pool != NULL);
608 /* FIXME: There seems to be a leak of a session here ! */
609 /* fail_unless (gst_rtsp_session_pool_get_n_sessions (session_pool) == 0); */
610 g_object_unref (session_pool);
613 teardown_client (client);
614 g_object_unref (ctx.auth);
615 gst_rtsp_token_unref (ctx.token);
616 gst_rtsp_context_pop_current (&ctx);
621 GST_START_TEST (test_client_multicast_transport_specific)
623 GstRTSPClient *client;
624 GstRTSPMessage request = { 0, };
626 GstRTSPSessionPool *session_pool;
627 GstRTSPContext ctx = { NULL };
629 client = setup_multicast_client ();
632 ctx.auth = gst_rtsp_auth_new ();
634 gst_rtsp_token_new (GST_RTSP_TOKEN_TRANSPORT_CLIENT_SETTINGS,
635 G_TYPE_BOOLEAN, TRUE, GST_RTSP_TOKEN_MEDIA_FACTORY_ROLE, G_TYPE_STRING,
637 gst_rtsp_context_push_current (&ctx);
639 expected_transport = "RTP/AVP;multicast;destination=233.252.0.1;"
640 "ttl=1;port=5000-5001;mode=\"PLAY\"";
642 /* simple SETUP with a valid URI and multicast, but an invalid ip */
643 fail_unless (gst_rtsp_message_init_request (&request, GST_RTSP_SETUP,
644 "rtsp://localhost/test/stream=0") == GST_RTSP_OK);
645 str = g_strdup_printf ("%d", cseq);
646 gst_rtsp_message_take_header (&request, GST_RTSP_HDR_CSEQ, str);
647 gst_rtsp_message_add_header (&request, GST_RTSP_HDR_TRANSPORT,
650 gst_rtsp_client_set_send_func (client, test_setup_response_200_multicast,
652 fail_unless (gst_rtsp_client_handle_message (client,
653 &request) == GST_RTSP_OK);
654 gst_rtsp_message_unset (&request);
655 expected_transport = NULL;
657 gst_rtsp_client_set_send_func (client, test_setup_response_200_multicast,
659 session_pool = gst_rtsp_client_get_session_pool (client);
660 fail_unless (session_pool != NULL);
661 fail_unless (gst_rtsp_session_pool_get_n_sessions (session_pool) == 1);
662 g_object_unref (session_pool);
664 teardown_client (client);
665 g_object_unref (ctx.auth);
666 gst_rtsp_token_unref (ctx.token);
667 gst_rtsp_context_pop_current (&ctx);
673 test_response_sdp (GstRTSPClient * client, GstRTSPMessage * response,
674 gboolean close, gpointer user_data)
678 GstSDPMessage *sdp_msg;
679 const GstSDPMedia *sdp_media;
680 const GstSDPBandwidth *bw;
681 gint bandwidth_val = GPOINTER_TO_INT (user_data);
683 fail_unless (gst_rtsp_message_get_body (response, &data, &size)
685 gst_sdp_message_new (&sdp_msg);
686 fail_unless (gst_sdp_message_parse_buffer (data, size, sdp_msg)
689 /* session description */
691 fail_unless (gst_sdp_message_get_version (sdp_msg) != NULL);
693 fail_unless (gst_sdp_message_get_origin (sdp_msg) != NULL);
695 fail_unless (gst_sdp_message_get_session_name (sdp_msg) != NULL);
697 fail_unless (gst_sdp_message_times_len (sdp_msg) == 0);
699 /* verify number of medias */
700 fail_unless (gst_sdp_message_medias_len (sdp_msg) == 1);
702 /* media description */
703 sdp_media = gst_sdp_message_get_media (sdp_msg, 0);
704 fail_unless (sdp_media != NULL);
707 fail_unless (gst_sdp_media_get_media (sdp_media) != NULL);
709 /* media bandwidth */
711 fail_unless (gst_sdp_media_bandwidths_len (sdp_media) == 1);
712 bw = gst_sdp_media_get_bandwidth (sdp_media, 0);
713 fail_unless (bw != NULL);
714 fail_unless (g_strcmp0 (bw->bwtype, "AS") == 0);
715 fail_unless (bw->bandwidth == bandwidth_val);
717 fail_unless (gst_sdp_media_bandwidths_len (sdp_media) == 0);
720 gst_sdp_message_free (sdp_msg);
726 test_client_sdp (const gchar * launch_line, guint * bandwidth_val)
728 GstRTSPClient *client;
729 GstRTSPMessage request = { 0, };
732 /* simple DESCRIBE for an existing url */
733 client = setup_client (launch_line);
734 fail_unless (gst_rtsp_message_init_request (&request, GST_RTSP_DESCRIBE,
735 "rtsp://localhost/test") == GST_RTSP_OK);
736 str = g_strdup_printf ("%d", cseq);
737 gst_rtsp_message_add_header (&request, GST_RTSP_HDR_CSEQ, str);
740 gst_rtsp_client_set_send_func (client, test_response_sdp,
741 (gpointer) bandwidth_val, NULL);
742 fail_unless (gst_rtsp_client_handle_message (client,
743 &request) == GST_RTSP_OK);
744 gst_rtsp_message_unset (&request);
746 teardown_client (client);
749 GST_START_TEST (test_client_sdp_with_max_bitrate_tag)
751 test_client_sdp ("videotestsrc "
752 "! taginject tags=\"maximum-bitrate=(uint)50000000\" "
753 "! video/x-raw,width=352,height=288 ! rtpgstpay name=pay0 pt=96",
754 GUINT_TO_POINTER (50000));
757 /* max-bitrate=0: no bandwidth line */
758 test_client_sdp ("videotestsrc "
759 "! taginject tags=\"maximum-bitrate=(uint)0\" "
760 "! video/x-raw,width=352,height=288 ! rtpgstpay name=pay0 pt=96",
761 GUINT_TO_POINTER (0));
766 GST_START_TEST (test_client_sdp_with_bitrate_tag)
768 test_client_sdp ("videotestsrc "
769 "! taginject tags=\"bitrate=(uint)7000000\" "
770 "! video/x-raw,width=352,height=288 ! rtpgstpay name=pay0 pt=96",
771 GUINT_TO_POINTER (7000));
773 /* bitrate=0: no bandwdith line */
774 test_client_sdp ("videotestsrc "
775 "! taginject tags=\"bitrate=(uint)0\" "
776 "! video/x-raw,width=352,height=288 ! rtpgstpay name=pay0 pt=96",
777 GUINT_TO_POINTER (0));
782 GST_START_TEST (test_client_sdp_with_max_bitrate_and_bitrate_tags)
784 test_client_sdp ("videotestsrc "
785 "! taginject tags=\"bitrate=(uint)7000000,maximum-bitrate=(uint)50000000\" "
786 "! video/x-raw,width=352,height=288 ! rtpgstpay name=pay0 pt=96",
787 GUINT_TO_POINTER (50000));
789 /* max-bitrate is zero: fallback to bitrate */
790 test_client_sdp ("videotestsrc "
791 "! taginject tags=\"bitrate=(uint)7000000,maximum-bitrate=(uint)0\" "
792 "! video/x-raw,width=352,height=288 ! rtpgstpay name=pay0 pt=96",
793 GUINT_TO_POINTER (7000));
795 /* max-bitrate=bitrate=0o: no bandwidth line */
796 test_client_sdp ("videotestsrc "
797 "! taginject tags=\"bitrate=(uint)0,maximum-bitrate=(uint)0\" "
798 "! video/x-raw,width=352,height=288 ! rtpgstpay name=pay0 pt=96",
799 GUINT_TO_POINTER (0));
804 GST_START_TEST (test_client_sdp_with_no_bitrate_tags)
806 test_client_sdp ("videotestsrc "
807 "! video/x-raw,width=352,height=288 ! rtpgstpay name=pay0 pt=96", NULL);
813 rtspclient_suite (void)
815 Suite *s = suite_create ("rtspclient");
816 TCase *tc = tcase_create ("general");
818 suite_add_tcase (s, tc);
819 tcase_set_timeout (tc, 20);
820 tcase_add_test (tc, test_request);
821 tcase_add_test (tc, test_options);
822 tcase_add_test (tc, test_describe);
823 tcase_add_test (tc, test_client_multicast_transport_404);
824 tcase_add_test (tc, test_client_multicast_transport);
825 tcase_add_test (tc, test_client_multicast_ignore_transport_specific);
826 tcase_add_test (tc, test_client_multicast_invalid_transport_specific);
827 tcase_add_test (tc, test_client_multicast_transport_specific);
828 tcase_add_test (tc, test_client_sdp_with_max_bitrate_tag);
829 tcase_add_test (tc, test_client_sdp_with_bitrate_tag);
830 tcase_add_test (tc, test_client_sdp_with_max_bitrate_and_bitrate_tags);
831 tcase_add_test (tc, test_client_sdp_with_no_bitrate_tags);
836 GST_CHECK_MAIN (rtspclient);