1 /* GStreamer unit test for GstRTSPServer
2 * Copyright (C) 2012 Axis Communications <dev-gstreamer at axis dot com>
3 * @author David Svensson Fors <davidsf at axis dot com>
4 * Copyright (C) 2015 Centricular Ltd
5 * @author Tim-Philipp Müller <tim@centricular.com>
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Library General Public
9 * License as published by the Free Software Foundation; either
10 * version 2 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Library General Public License for more details.
17 * You should have received a copy of the GNU Library General Public
18 * License along with this library; if not, write to the
19 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
20 * Boston, MA 02110-1301, USA.
23 #include <gst/check/gstcheck.h>
24 #include <gst/sdp/gstsdpmessage.h>
25 #include <gst/rtp/gstrtpbuffer.h>
26 #include <gst/rtp/gstrtcpbuffer.h>
29 #include <netinet/in.h>
31 #include "rtsp-server.h"
33 #define VIDEO_PIPELINE "videotestsrc ! " \
34 "video/x-raw,width=352,height=288 ! " \
35 "rtpgstpay name=pay0 pt=96"
36 #define AUDIO_PIPELINE "audiotestsrc ! " \
37 "audio/x-raw,rate=8000 ! " \
38 "rtpgstpay name=pay1 pt=97"
40 #define TEST_MOUNT_POINT "/test"
41 #define TEST_PROTO "RTP/AVP"
42 #define TEST_PROTO_TCP "RTP/AVP/TCP"
43 #define TEST_ENCODING "X-GST"
44 #define TEST_CLOCK_RATE "90000"
46 /* tested rtsp server */
47 static GstRTSPServer *server = NULL;
49 /* tcp port that the test server listens for rtsp requests on */
50 static gint test_port = 0;
52 /* id of the server's source within the GMainContext */
53 static guint source_id;
55 /* iterate the default main loop until there are no events to dispatch */
59 while (g_main_context_iteration (NULL, FALSE)) {
60 GST_DEBUG ("iteration");
65 get_client_ports_full (GstRTSPRange * range, GSocket ** rtp_socket,
66 GSocket ** rtcp_socket)
72 GInetAddress *anyaddr = g_inet_address_new_any (G_SOCKET_FAMILY_IPV4);
73 GSocketAddress *sockaddr;
80 rtp = g_socket_new (G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_DATAGRAM,
81 G_SOCKET_PROTOCOL_UDP, NULL);
82 fail_unless (rtp != NULL);
84 sockaddr = g_inet_socket_address_new (anyaddr, rtp_port);
85 fail_unless (sockaddr != NULL);
86 bound = g_socket_bind (rtp, sockaddr, FALSE, NULL);
87 g_object_unref (sockaddr);
93 sockaddr = g_socket_get_local_address (rtp, NULL);
94 fail_unless (sockaddr != NULL && G_IS_INET_SOCKET_ADDRESS (sockaddr));
96 g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (sockaddr));
97 g_object_unref (sockaddr);
99 if (rtp_port % 2 != 0) {
101 g_object_unref (rtp);
105 rtcp_port = rtp_port + 1;
107 rtcp = g_socket_new (G_SOCKET_FAMILY_IPV4, G_SOCKET_TYPE_DATAGRAM,
108 G_SOCKET_PROTOCOL_UDP, NULL);
109 fail_unless (rtcp != NULL);
111 sockaddr = g_inet_socket_address_new (anyaddr, rtcp_port);
112 fail_unless (sockaddr != NULL);
113 bound = g_socket_bind (rtcp, sockaddr, FALSE, NULL);
114 g_object_unref (sockaddr);
116 g_object_unref (rtp);
117 g_object_unref (rtcp);
121 sockaddr = g_socket_get_local_address (rtcp, NULL);
122 fail_unless (sockaddr != NULL && G_IS_INET_SOCKET_ADDRESS (sockaddr));
123 fail_unless (rtcp_port ==
124 g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (sockaddr)));
125 g_object_unref (sockaddr);
130 range->min = rtp_port;
131 range->max = rtcp_port;
135 g_object_unref (rtp);
139 g_object_unref (rtcp);
140 GST_DEBUG ("client_port=%d-%d", range->min, range->max);
141 g_object_unref (anyaddr);
144 /* get a free rtp/rtcp client port pair */
146 get_client_ports (GstRTSPRange * range)
148 get_client_ports_full (range, NULL, NULL);
151 /* start the tested rtsp server */
155 GstRTSPMountPoints *mounts;
157 GstRTSPMediaFactory *factory;
159 mounts = gst_rtsp_server_get_mount_points (server);
161 factory = gst_rtsp_media_factory_new ();
163 gst_rtsp_media_factory_set_launch (factory,
164 "( " VIDEO_PIPELINE " " AUDIO_PIPELINE " )");
165 gst_rtsp_mount_points_add_factory (mounts, TEST_MOUNT_POINT, factory);
166 g_object_unref (mounts);
168 /* set port to any */
169 gst_rtsp_server_set_service (server, "0");
171 /* attach to default main context */
172 source_id = gst_rtsp_server_attach (server, NULL);
173 fail_if (source_id == 0);
176 service = gst_rtsp_server_get_service (server);
177 test_port = atoi (service);
178 fail_unless (test_port != 0);
181 GST_DEBUG ("rtsp server listening on port %d", test_port);
184 /* start the testing rtsp server for RECORD mode */
185 static GstRTSPMediaFactory *
186 start_record_server (const gchar * launch_line)
188 GstRTSPMediaFactory *factory;
189 GstRTSPMountPoints *mounts;
192 mounts = gst_rtsp_server_get_mount_points (server);
194 factory = gst_rtsp_media_factory_new ();
196 gst_rtsp_media_factory_set_transport_mode (factory,
197 GST_RTSP_TRANSPORT_MODE_RECORD);
198 gst_rtsp_media_factory_set_launch (factory, launch_line);
199 gst_rtsp_mount_points_add_factory (mounts, TEST_MOUNT_POINT, factory);
200 g_object_unref (mounts);
202 /* set port to any */
203 gst_rtsp_server_set_service (server, "0");
205 /* attach to default main context */
206 source_id = gst_rtsp_server_attach (server, NULL);
207 fail_if (source_id == 0);
210 service = gst_rtsp_server_get_service (server);
211 test_port = atoi (service);
212 fail_unless (test_port != 0);
215 GST_DEBUG ("rtsp server listening on port %d", test_port);
219 /* stop the tested rtsp server */
223 g_source_remove (source_id);
226 GST_DEBUG ("rtsp server stopped");
229 /* create an rtsp connection to the server on test_port */
230 static GstRTSPConnection *
231 connect_to_server (gint port, const gchar * mount_point)
233 GstRTSPConnection *conn = NULL;
236 GstRTSPUrl *url = NULL;
238 address = gst_rtsp_server_get_address (server);
239 uri_string = g_strdup_printf ("rtsp://%s:%d%s", address, port, mount_point);
241 fail_unless (gst_rtsp_url_parse (uri_string, &url) == GST_RTSP_OK);
244 fail_unless (gst_rtsp_connection_create (url, &conn) == GST_RTSP_OK);
245 gst_rtsp_url_free (url);
247 fail_unless (gst_rtsp_connection_connect (conn, NULL) == GST_RTSP_OK);
252 /* create an rtsp request */
253 static GstRTSPMessage *
254 create_request (GstRTSPConnection * conn, GstRTSPMethod method,
255 const gchar * control)
257 GstRTSPMessage *request = NULL;
261 base_uri = gst_rtsp_url_get_request_uri (gst_rtsp_connection_get_url (conn));
262 full_uri = g_strdup_printf ("%s/%s", base_uri, control ? control : "");
264 if (gst_rtsp_message_new_request (&request, method, full_uri) != GST_RTSP_OK) {
265 GST_DEBUG ("failed to create request object");
273 /* send an rtsp request */
275 send_request (GstRTSPConnection * conn, GstRTSPMessage * request)
277 if (gst_rtsp_connection_send (conn, request, NULL) != GST_RTSP_OK) {
278 GST_DEBUG ("failed to send request");
284 /* read rtsp response. response must be freed by the caller */
285 static GstRTSPMessage *
286 read_response (GstRTSPConnection * conn)
288 GstRTSPMessage *response = NULL;
290 if (gst_rtsp_message_new (&response) != GST_RTSP_OK) {
291 GST_DEBUG ("failed to create response object");
294 if (gst_rtsp_connection_receive (conn, response, NULL) != GST_RTSP_OK) {
295 GST_DEBUG ("failed to read response");
296 gst_rtsp_message_free (response);
299 fail_unless (gst_rtsp_message_get_type (response) ==
300 GST_RTSP_MESSAGE_RESPONSE);
304 /* send an rtsp request and receive response. gchar** parameters are out
305 * parameters that have to be freed by the caller */
306 static GstRTSPStatusCode
307 do_request_full (GstRTSPConnection * conn, GstRTSPMethod method,
308 const gchar * control, const gchar * session_in, const gchar * transport_in,
309 const gchar * range_in, const gchar * require_in,
310 gchar ** content_type, gchar ** content_base, gchar ** body,
311 gchar ** session_out, gchar ** transport_out, gchar ** range_out,
312 gchar ** unsupported_out)
314 GstRTSPMessage *request;
315 GstRTSPMessage *response;
316 GstRTSPStatusCode code;
320 request = create_request (conn, method, control);
324 gst_rtsp_message_add_header (request, GST_RTSP_HDR_SESSION, session_in);
327 gst_rtsp_message_add_header (request, GST_RTSP_HDR_TRANSPORT, transport_in);
330 gst_rtsp_message_add_header (request, GST_RTSP_HDR_RANGE, range_in);
333 gst_rtsp_message_add_header (request, GST_RTSP_HDR_REQUIRE, require_in);
337 fail_unless (send_request (conn, request));
338 gst_rtsp_message_free (request);
343 response = read_response (conn);
345 /* check status line */
346 gst_rtsp_message_parse_response (response, &code, NULL, NULL);
347 if (code != GST_RTSP_STS_OK) {
348 if (unsupported_out != NULL && code == GST_RTSP_STS_OPTION_NOT_SUPPORTED) {
349 gst_rtsp_message_get_header (response, GST_RTSP_HDR_UNSUPPORTED,
351 *unsupported_out = g_strdup (value);
353 gst_rtsp_message_free (response);
357 /* get information from response */
359 gst_rtsp_message_get_header (response, GST_RTSP_HDR_CONTENT_TYPE,
361 *content_type = g_strdup (value);
364 gst_rtsp_message_get_header (response, GST_RTSP_HDR_CONTENT_BASE,
366 *content_base = g_strdup (value);
369 *body = g_malloc (response->body_size + 1);
370 strncpy (*body, (gchar *) response->body, response->body_size);
373 gst_rtsp_message_get_header (response, GST_RTSP_HDR_SESSION, &value, 0);
375 value = g_strdup (value);
377 /* Remove the timeout */
379 char *pos = strchr (value, ';');
384 /* check that we got the same session back */
385 fail_unless (!g_strcmp0 (value, session_in));
387 *session_out = value;
390 gst_rtsp_message_get_header (response, GST_RTSP_HDR_TRANSPORT, &value, 0);
391 *transport_out = g_strdup (value);
394 gst_rtsp_message_get_header (response, GST_RTSP_HDR_RANGE, &value, 0);
395 *range_out = g_strdup (value);
398 gst_rtsp_message_free (response);
402 /* send an rtsp request and receive response. gchar** parameters are out
403 * parameters that have to be freed by the caller */
404 static GstRTSPStatusCode
405 do_request (GstRTSPConnection * conn, GstRTSPMethod method,
406 const gchar * control, const gchar * session_in,
407 const gchar * transport_in, const gchar * range_in,
408 gchar ** content_type, gchar ** content_base, gchar ** body,
409 gchar ** session_out, gchar ** transport_out, gchar ** range_out)
411 return do_request_full (conn, method, control, session_in, transport_in,
412 range_in, NULL, content_type, content_base, body, session_out,
413 transport_out, range_out, NULL);
416 /* send an rtsp request with a method and a session, and receive response */
417 static GstRTSPStatusCode
418 do_simple_request (GstRTSPConnection * conn, GstRTSPMethod method,
419 const gchar * session)
421 return do_request (conn, method, NULL, session, NULL, NULL, NULL,
422 NULL, NULL, NULL, NULL, NULL);
425 /* send a DESCRIBE request and receive response. returns a received
426 * GstSDPMessage that must be freed by the caller */
427 static GstSDPMessage *
428 do_describe (GstRTSPConnection * conn, const gchar * mount_point)
430 GstSDPMessage *sdp_message;
435 gchar *expected_content_base;
437 /* send DESCRIBE request */
438 fail_unless (do_request (conn, GST_RTSP_DESCRIBE, NULL, NULL, NULL, NULL,
439 &content_type, &content_base, &body, NULL, NULL, NULL) ==
442 /* check response values */
443 fail_unless (!g_strcmp0 (content_type, "application/sdp"));
444 address = gst_rtsp_server_get_address (server);
445 expected_content_base =
446 g_strdup_printf ("rtsp://%s:%d%s/", address, test_port, mount_point);
447 fail_unless (!g_strcmp0 (content_base, expected_content_base));
449 /* create sdp message */
450 fail_unless (gst_sdp_message_new (&sdp_message) == GST_SDP_OK);
451 fail_unless (gst_sdp_message_parse_buffer ((guint8 *) body,
452 strlen (body), sdp_message) == GST_SDP_OK);
455 g_free (content_type);
456 g_free (content_base);
459 g_free (expected_content_base);
464 /* send a SETUP request and receive response. if *session is not NULL,
465 * it is used in the request. otherwise, *session is set to a returned
466 * session string that must be freed by the caller. the returned
467 * transport must be freed by the caller. */
468 static GstRTSPStatusCode
469 do_setup_full (GstRTSPConnection * conn, const gchar * control,
470 gboolean use_tcp_transport, const GstRTSPRange * client_ports,
471 const gchar * require, gchar ** session, GstRTSPTransport ** transport,
472 gchar ** unsupported)
474 GstRTSPStatusCode code;
475 gchar *session_in = NULL;
476 gchar *transport_string_in = NULL;
477 gchar **session_out = NULL;
478 gchar *transport_string_out = NULL;
480 /* prepare and send SETUP request */
483 session_in = *session;
485 session_out = session;
489 if (use_tcp_transport) {
490 transport_string_in = g_strdup_printf (TEST_PROTO_TCP ";unicast");
492 transport_string_in =
493 g_strdup_printf (TEST_PROTO ";unicast;client_port=%d-%d",
494 client_ports->min, client_ports->max);
497 do_request_full (conn, GST_RTSP_SETUP, control, session_in,
498 transport_string_in, NULL, require, NULL, NULL, NULL, session_out,
499 &transport_string_out, NULL, unsupported);
500 g_free (transport_string_in);
502 if (transport_string_out) {
503 /* create transport */
504 fail_unless (gst_rtsp_transport_new (transport) == GST_RTSP_OK);
505 fail_unless (gst_rtsp_transport_parse (transport_string_out,
506 *transport) == GST_RTSP_OK);
507 g_free (transport_string_out);
509 GST_INFO ("code=%d", code);
513 /* send a SETUP request and receive response. if *session is not NULL,
514 * it is used in the request. otherwise, *session is set to a returned
515 * session string that must be freed by the caller. the returned
516 * transport must be freed by the caller. */
517 static GstRTSPStatusCode
518 do_setup (GstRTSPConnection * conn, const gchar * control,
519 const GstRTSPRange * client_ports, gchar ** session,
520 GstRTSPTransport ** transport)
522 return do_setup_full (conn, control, FALSE, client_ports, NULL, session,
526 /* send a SETUP request and receive response. if *session is not NULL,
527 * it is used in the request. otherwise, *session is set to a returned
528 * session string that must be freed by the caller. the returned
529 * transport must be freed by the caller. */
530 static GstRTSPStatusCode
531 do_setup_tcp (GstRTSPConnection * conn, const gchar * control,
532 gchar ** session, GstRTSPTransport ** transport)
534 return do_setup_full (conn, control, TRUE, NULL, NULL, session, transport,
538 /* fixture setup function */
542 server = gst_rtsp_server_new ();
545 /* fixture clean-up function */
550 g_object_unref (server);
556 GST_START_TEST (test_connect)
558 GstRTSPConnection *conn;
562 /* connect to server */
563 conn = connect_to_server (test_port, TEST_MOUNT_POINT);
566 gst_rtsp_connection_free (conn);
569 /* iterate so the clean-up can finish */
575 GST_START_TEST (test_describe)
577 GstRTSPConnection *conn;
578 GstSDPMessage *sdp_message = NULL;
579 const GstSDPMedia *sdp_media;
581 gchar *expected_rtpmap;
583 const gchar *control_video;
584 const gchar *control_audio;
588 conn = connect_to_server (test_port, TEST_MOUNT_POINT);
590 /* send DESCRIBE request */
591 sdp_message = do_describe (conn, TEST_MOUNT_POINT);
593 fail_unless (gst_sdp_message_medias_len (sdp_message) == 2);
595 /* check video sdp */
596 sdp_media = gst_sdp_message_get_media (sdp_message, 0);
597 fail_unless (!g_strcmp0 (gst_sdp_media_get_proto (sdp_media), TEST_PROTO));
598 fail_unless (gst_sdp_media_formats_len (sdp_media) == 1);
599 sscanf (gst_sdp_media_get_format (sdp_media, 0), "%" G_GINT32_FORMAT,
602 g_strdup_printf ("%d " TEST_ENCODING "/" TEST_CLOCK_RATE, format);
603 rtpmap = gst_sdp_media_get_attribute_val (sdp_media, "rtpmap");
604 fail_unless (!g_strcmp0 (rtpmap, expected_rtpmap));
605 g_free (expected_rtpmap);
606 control_video = gst_sdp_media_get_attribute_val (sdp_media, "control");
607 fail_unless (!g_strcmp0 (control_video, "stream=0"));
609 /* check audio sdp */
610 sdp_media = gst_sdp_message_get_media (sdp_message, 1);
611 fail_unless (!g_strcmp0 (gst_sdp_media_get_proto (sdp_media), TEST_PROTO));
612 fail_unless (gst_sdp_media_formats_len (sdp_media) == 1);
613 sscanf (gst_sdp_media_get_format (sdp_media, 0), "%" G_GINT32_FORMAT,
616 g_strdup_printf ("%d " TEST_ENCODING "/" TEST_CLOCK_RATE, format);
617 rtpmap = gst_sdp_media_get_attribute_val (sdp_media, "rtpmap");
618 fail_unless (!g_strcmp0 (rtpmap, expected_rtpmap));
619 g_free (expected_rtpmap);
620 control_audio = gst_sdp_media_get_attribute_val (sdp_media, "control");
621 fail_unless (!g_strcmp0 (control_audio, "stream=1"));
623 /* clean up and iterate so the clean-up can finish */
624 gst_sdp_message_free (sdp_message);
625 gst_rtsp_connection_free (conn);
632 GST_START_TEST (test_describe_record_media)
634 GstRTSPConnection *conn;
636 start_record_server ("( fakesink name=depay0 )");
638 conn = connect_to_server (test_port, TEST_MOUNT_POINT);
640 /* send DESCRIBE request */
641 fail_unless_equals_int (do_request (conn, GST_RTSP_DESCRIBE, NULL, NULL, NULL,
642 NULL, NULL, NULL, NULL, NULL, NULL, NULL),
643 GST_RTSP_STS_METHOD_NOT_ALLOWED);
645 /* clean up and iterate so the clean-up can finish */
646 gst_rtsp_connection_free (conn);
653 GST_START_TEST (test_describe_non_existing_mount_point)
655 GstRTSPConnection *conn;
659 /* send DESCRIBE request for a non-existing mount point
660 * and check that we get a 404 Not Found */
661 conn = connect_to_server (test_port, "/non-existing");
662 fail_unless (do_simple_request (conn, GST_RTSP_DESCRIBE, NULL)
663 == GST_RTSP_STS_NOT_FOUND);
665 /* clean up and iterate so the clean-up can finish */
666 gst_rtsp_connection_free (conn);
673 GST_START_TEST (test_setup)
675 GstRTSPConnection *conn;
676 GstSDPMessage *sdp_message = NULL;
677 const GstSDPMedia *sdp_media;
678 const gchar *video_control;
679 const gchar *audio_control;
680 GstRTSPRange client_ports;
681 gchar *session = NULL;
682 GstRTSPTransport *video_transport = NULL;
683 GstRTSPTransport *audio_transport = NULL;
687 conn = connect_to_server (test_port, TEST_MOUNT_POINT);
689 sdp_message = do_describe (conn, TEST_MOUNT_POINT);
691 /* get control strings from DESCRIBE response */
692 fail_unless (gst_sdp_message_medias_len (sdp_message) == 2);
693 sdp_media = gst_sdp_message_get_media (sdp_message, 0);
694 video_control = gst_sdp_media_get_attribute_val (sdp_media, "control");
695 sdp_media = gst_sdp_message_get_media (sdp_message, 1);
696 audio_control = gst_sdp_media_get_attribute_val (sdp_media, "control");
698 get_client_ports (&client_ports);
700 /* send SETUP request for video */
701 fail_unless (do_setup (conn, video_control, &client_ports, &session,
702 &video_transport) == GST_RTSP_STS_OK);
703 GST_DEBUG ("set up video %s, got session '%s'", video_control, session);
705 /* check response from SETUP */
706 fail_unless (video_transport->trans == GST_RTSP_TRANS_RTP);
707 fail_unless (video_transport->profile == GST_RTSP_PROFILE_AVP);
708 fail_unless (video_transport->lower_transport == GST_RTSP_LOWER_TRANS_UDP);
709 fail_unless (video_transport->mode_play);
710 gst_rtsp_transport_free (video_transport);
712 /* send SETUP request for audio */
713 fail_unless (do_setup (conn, audio_control, &client_ports, &session,
714 &audio_transport) == GST_RTSP_STS_OK);
715 GST_DEBUG ("set up audio %s with session '%s'", audio_control, session);
717 /* check response from SETUP */
718 fail_unless (audio_transport->trans == GST_RTSP_TRANS_RTP);
719 fail_unless (audio_transport->profile == GST_RTSP_PROFILE_AVP);
720 fail_unless (audio_transport->lower_transport == GST_RTSP_LOWER_TRANS_UDP);
721 fail_unless (audio_transport->mode_play);
722 gst_rtsp_transport_free (audio_transport);
724 /* send TEARDOWN request and check that we get 200 OK */
725 fail_unless (do_simple_request (conn, GST_RTSP_TEARDOWN,
726 session) == GST_RTSP_STS_OK);
728 /* clean up and iterate so the clean-up can finish */
730 gst_sdp_message_free (sdp_message);
731 gst_rtsp_connection_free (conn);
738 GST_START_TEST (test_setup_tcp)
740 GstRTSPConnection *conn;
741 GstSDPMessage *sdp_message = NULL;
742 const GstSDPMedia *sdp_media;
743 const gchar *video_control;
744 const gchar *audio_control;
745 gchar *session = NULL;
746 GstRTSPTransport *video_transport = NULL;
747 GstRTSPTransport *audio_transport = NULL;
751 conn = connect_to_server (test_port, TEST_MOUNT_POINT);
753 sdp_message = do_describe (conn, TEST_MOUNT_POINT);
755 /* get control strings from DESCRIBE response */
756 fail_unless (gst_sdp_message_medias_len (sdp_message) == 2);
757 sdp_media = gst_sdp_message_get_media (sdp_message, 0);
758 video_control = gst_sdp_media_get_attribute_val (sdp_media, "control");
759 sdp_media = gst_sdp_message_get_media (sdp_message, 1);
760 audio_control = gst_sdp_media_get_attribute_val (sdp_media, "control");
762 /* send SETUP request for video */
763 fail_unless (do_setup_tcp (conn, video_control, &session,
764 &video_transport) == GST_RTSP_STS_OK);
765 GST_DEBUG ("set up video %s, got session '%s'", video_control, session);
767 /* check response from SETUP */
768 fail_unless (video_transport->trans == GST_RTSP_TRANS_RTP);
769 fail_unless (video_transport->profile == GST_RTSP_PROFILE_AVP);
770 fail_unless (video_transport->lower_transport == GST_RTSP_LOWER_TRANS_TCP);
771 fail_unless (video_transport->mode_play);
772 gst_rtsp_transport_free (video_transport);
774 /* send SETUP request for audio */
775 fail_unless (do_setup_tcp (conn, audio_control, &session,
776 &audio_transport) == GST_RTSP_STS_OK);
777 GST_DEBUG ("set up audio %s with session '%s'", audio_control, session);
779 /* check response from SETUP */
780 fail_unless (audio_transport->trans == GST_RTSP_TRANS_RTP);
781 fail_unless (audio_transport->profile == GST_RTSP_PROFILE_AVP);
782 fail_unless (audio_transport->lower_transport == GST_RTSP_LOWER_TRANS_TCP);
783 fail_unless (audio_transport->mode_play);
784 gst_rtsp_transport_free (audio_transport);
786 /* send TEARDOWN request and check that we get 200 OK */
787 fail_unless (do_simple_request (conn, GST_RTSP_TEARDOWN,
788 session) == GST_RTSP_STS_OK);
790 /* clean up and iterate so the clean-up can finish */
792 gst_sdp_message_free (sdp_message);
793 gst_rtsp_connection_free (conn);
800 GST_START_TEST (test_setup_twice)
802 GstRTSPConnection *conn;
803 GstSDPMessage *sdp_message;
804 const GstSDPMedia *sdp_media;
805 const gchar *video_control;
806 GstRTSPRange client_ports;
807 GstRTSPTransport *video_transport = NULL;
808 gchar *session1 = NULL;
809 gchar *session2 = NULL;
813 conn = connect_to_server (test_port, TEST_MOUNT_POINT);
815 /* we wan't more than one session for this connection */
816 gst_rtsp_connection_set_remember_session_id (conn, FALSE);
818 sdp_message = do_describe (conn, TEST_MOUNT_POINT);
820 /* get the control url */
821 fail_unless (gst_sdp_message_medias_len (sdp_message) == 2);
822 sdp_media = gst_sdp_message_get_media (sdp_message, 0);
823 video_control = gst_sdp_media_get_attribute_val (sdp_media, "control");
825 get_client_ports (&client_ports);
827 /* send SETUP request for one session */
828 fail_unless (do_setup (conn, video_control, &client_ports, &session1,
829 &video_transport) == GST_RTSP_STS_OK);
830 GST_DEBUG ("set up video %s, got session '%s'", video_control, session1);
832 /* check response from SETUP */
833 fail_unless (video_transport->trans == GST_RTSP_TRANS_RTP);
834 fail_unless (video_transport->profile == GST_RTSP_PROFILE_AVP);
835 fail_unless (video_transport->lower_transport == GST_RTSP_LOWER_TRANS_UDP);
836 fail_unless (video_transport->mode_play);
837 gst_rtsp_transport_free (video_transport);
839 /* send SETUP request for another session */
840 fail_unless (do_setup (conn, video_control, &client_ports, &session2,
841 &video_transport) == GST_RTSP_STS_OK);
842 GST_DEBUG ("set up video %s, got session '%s'", video_control, session2);
844 /* check response from SETUP */
845 fail_unless (video_transport->trans == GST_RTSP_TRANS_RTP);
846 fail_unless (video_transport->profile == GST_RTSP_PROFILE_AVP);
847 fail_unless (video_transport->lower_transport == GST_RTSP_LOWER_TRANS_UDP);
848 fail_unless (video_transport->mode_play);
849 gst_rtsp_transport_free (video_transport);
851 /* session can not be the same */
852 fail_unless (strcmp (session1, session2));
854 /* send TEARDOWN request for the first session */
855 fail_unless (do_simple_request (conn, GST_RTSP_TEARDOWN,
856 session1) == GST_RTSP_STS_OK);
858 /* send TEARDOWN request for the second session */
859 fail_unless (do_simple_request (conn, GST_RTSP_TEARDOWN,
860 session2) == GST_RTSP_STS_OK);
864 gst_sdp_message_free (sdp_message);
865 gst_rtsp_connection_free (conn);
872 GST_START_TEST (test_setup_with_require_header)
874 GstRTSPConnection *conn;
875 GstSDPMessage *sdp_message = NULL;
876 const GstSDPMedia *sdp_media;
877 const gchar *video_control;
878 GstRTSPRange client_ports;
879 gchar *session = NULL;
880 gchar *unsupported = NULL;
881 GstRTSPTransport *video_transport = NULL;
885 conn = connect_to_server (test_port, TEST_MOUNT_POINT);
887 sdp_message = do_describe (conn, TEST_MOUNT_POINT);
889 /* get control strings from DESCRIBE response */
890 fail_unless (gst_sdp_message_medias_len (sdp_message) == 2);
891 sdp_media = gst_sdp_message_get_media (sdp_message, 0);
892 video_control = gst_sdp_media_get_attribute_val (sdp_media, "control");
894 get_client_ports (&client_ports);
896 /* send SETUP request for video, with single Require header */
897 fail_unless_equals_int (do_setup_full (conn, video_control, FALSE,
898 &client_ports, "funky-feature", &session, &video_transport,
899 &unsupported), GST_RTSP_STS_OPTION_NOT_SUPPORTED);
900 fail_unless_equals_string (unsupported, "funky-feature");
901 g_free (unsupported);
904 /* send SETUP request for video, with multiple Require headers */
905 fail_unless_equals_int (do_setup_full (conn, video_control, FALSE,
906 &client_ports, "funky-feature, foo-bar, superburst", &session,
907 &video_transport, &unsupported), GST_RTSP_STS_OPTION_NOT_SUPPORTED);
908 fail_unless_equals_string (unsupported, "funky-feature, foo-bar, superburst");
909 g_free (unsupported);
912 /* ok, just do a normal setup then (make sure that still works) */
913 fail_unless_equals_int (do_setup (conn, video_control, &client_ports,
914 &session, &video_transport), GST_RTSP_STS_OK);
916 GST_DEBUG ("set up video %s, got session '%s'", video_control, session);
918 /* check response from SETUP */
919 fail_unless (video_transport->trans == GST_RTSP_TRANS_RTP);
920 fail_unless (video_transport->profile == GST_RTSP_PROFILE_AVP);
921 fail_unless (video_transport->lower_transport == GST_RTSP_LOWER_TRANS_UDP);
922 fail_unless (video_transport->mode_play);
923 gst_rtsp_transport_free (video_transport);
925 /* send TEARDOWN request and check that we get 200 OK */
926 fail_unless (do_simple_request (conn, GST_RTSP_TEARDOWN,
927 session) == GST_RTSP_STS_OK);
929 /* clean up and iterate so the clean-up can finish */
931 gst_sdp_message_free (sdp_message);
932 gst_rtsp_connection_free (conn);
939 GST_START_TEST (test_setup_non_existing_stream)
941 GstRTSPConnection *conn;
942 GstRTSPRange client_ports;
946 conn = connect_to_server (test_port, TEST_MOUNT_POINT);
948 get_client_ports (&client_ports);
950 /* send SETUP request with a non-existing stream and check that we get a
952 fail_unless (do_setup (conn, "stream=7", &client_ports, NULL,
953 NULL) == GST_RTSP_STS_NOT_FOUND);
955 /* clean up and iterate so the clean-up can finish */
956 gst_rtsp_connection_free (conn);
964 receive_rtp (GSocket * socket, GSocketAddress ** addr)
966 GstBuffer *buffer = gst_buffer_new_allocate (NULL, 65536, NULL);
970 GstMapInfo map = GST_MAP_INFO_INIT;
971 GstRTPBuffer rtpbuffer = GST_RTP_BUFFER_INIT;
973 gst_buffer_map (buffer, &map, GST_MAP_WRITE);
974 bytes = g_socket_receive_from (socket, addr, (gchar *) map.data,
975 map.maxsize, NULL, NULL);
976 fail_unless (bytes > 0);
977 gst_buffer_unmap (buffer, &map);
978 gst_buffer_set_size (buffer, bytes);
980 if (gst_rtp_buffer_map (buffer, GST_MAP_READ, &rtpbuffer)) {
981 gst_rtp_buffer_unmap (&rtpbuffer);
986 g_clear_object (addr);
989 gst_buffer_unref (buffer);
993 receive_rtcp (GSocket * socket, GSocketAddress ** addr, GstRTCPType type)
995 GstBuffer *buffer = gst_buffer_new_allocate (NULL, 65536, NULL);
999 GstMapInfo map = GST_MAP_INFO_INIT;
1001 gst_buffer_map (buffer, &map, GST_MAP_WRITE);
1002 bytes = g_socket_receive_from (socket, addr, (gchar *) map.data,
1003 map.maxsize, NULL, NULL);
1004 fail_unless (bytes > 0);
1005 gst_buffer_unmap (buffer, &map);
1006 gst_buffer_set_size (buffer, bytes);
1008 if (gst_rtcp_buffer_validate (buffer)) {
1009 GstRTCPBuffer rtcpbuffer = GST_RTCP_BUFFER_INIT;
1010 GstRTCPPacket packet;
1013 fail_unless (gst_rtcp_buffer_map (buffer, GST_MAP_READ, &rtcpbuffer));
1014 fail_unless (gst_rtcp_buffer_get_first_packet (&rtcpbuffer, &packet));
1016 if (gst_rtcp_packet_get_type (&packet) == type) {
1017 gst_rtcp_buffer_unmap (&rtcpbuffer);
1020 } while (gst_rtcp_packet_move_to_next (&packet));
1021 gst_rtcp_buffer_unmap (&rtcpbuffer);
1028 g_clear_object (addr);
1033 gst_buffer_unref (buffer);
1037 do_test_play (const gchar * range)
1039 GstRTSPConnection *conn;
1040 GstSDPMessage *sdp_message = NULL;
1041 const GstSDPMedia *sdp_media;
1042 const gchar *video_control;
1043 const gchar *audio_control;
1044 GstRTSPRange client_port;
1045 gchar *session = NULL;
1046 GstRTSPTransport *video_transport = NULL;
1047 GstRTSPTransport *audio_transport = NULL;
1048 GSocket *rtp_socket, *rtcp_socket;
1049 gchar *range_out = NULL;
1051 conn = connect_to_server (test_port, TEST_MOUNT_POINT);
1053 sdp_message = do_describe (conn, TEST_MOUNT_POINT);
1055 /* get control strings from DESCRIBE response */
1056 fail_unless (gst_sdp_message_medias_len (sdp_message) == 2);
1057 sdp_media = gst_sdp_message_get_media (sdp_message, 0);
1058 video_control = gst_sdp_media_get_attribute_val (sdp_media, "control");
1059 sdp_media = gst_sdp_message_get_media (sdp_message, 1);
1060 audio_control = gst_sdp_media_get_attribute_val (sdp_media, "control");
1062 get_client_ports_full (&client_port, &rtp_socket, &rtcp_socket);
1064 /* do SETUP for video and audio */
1065 fail_unless (do_setup (conn, video_control, &client_port, &session,
1066 &video_transport) == GST_RTSP_STS_OK);
1067 fail_unless (do_setup (conn, audio_control, &client_port, &session,
1068 &audio_transport) == GST_RTSP_STS_OK);
1070 /* send PLAY request and check that we get 200 OK */
1071 fail_unless (do_request (conn, GST_RTSP_PLAY, NULL, session, NULL, range,
1072 NULL, NULL, NULL, NULL, NULL, &range_out) == GST_RTSP_STS_OK);
1074 fail_unless_equals_string (range, range_out);
1077 receive_rtp (rtp_socket, NULL);
1078 receive_rtcp (rtcp_socket, NULL, 0);
1080 /* send TEARDOWN request and check that we get 200 OK */
1081 fail_unless (do_simple_request (conn, GST_RTSP_TEARDOWN,
1082 session) == GST_RTSP_STS_OK);
1084 /* FIXME: The rtsp-server always disconnects the transport before
1085 * sending the RTCP BYE
1086 * receive_rtcp (rtcp_socket, NULL, GST_RTCP_TYPE_BYE);
1089 /* clean up and iterate so the clean-up can finish */
1090 g_object_unref (rtp_socket);
1091 g_object_unref (rtcp_socket);
1093 gst_rtsp_transport_free (video_transport);
1094 gst_rtsp_transport_free (audio_transport);
1095 gst_sdp_message_free (sdp_message);
1096 gst_rtsp_connection_free (conn);
1100 GST_START_TEST (test_play)
1104 do_test_play (NULL);
1112 GST_START_TEST (test_play_without_session)
1114 GstRTSPConnection *conn;
1118 conn = connect_to_server (test_port, TEST_MOUNT_POINT);
1120 /* send PLAY request without a session and check that we get a
1121 * 454 Session Not Found */
1122 fail_unless (do_simple_request (conn, GST_RTSP_PLAY,
1123 NULL) == GST_RTSP_STS_SESSION_NOT_FOUND);
1125 /* clean up and iterate so the clean-up can finish */
1126 gst_rtsp_connection_free (conn);
1133 GST_START_TEST (test_bind_already_in_use)
1135 GstRTSPServer *serv;
1136 GSocketService *service;
1137 GError *error = NULL;
1141 serv = gst_rtsp_server_new ();
1142 service = g_socket_service_new ();
1144 /* bind service to port */
1146 g_socket_listener_add_any_inet_port (G_SOCKET_LISTENER (service), NULL,
1148 g_assert_no_error (error);
1150 port_str = g_strdup_printf ("%d\n", port);
1152 /* try to bind server to the same port */
1153 g_object_set (serv, "service", port_str, NULL);
1156 /* attach to default main context */
1157 fail_unless (gst_rtsp_server_attach (serv, NULL) == 0);
1160 g_object_unref (serv);
1161 g_socket_service_stop (service);
1162 g_object_unref (service);
1168 GST_START_TEST (test_play_multithreaded)
1170 GstRTSPThreadPool *pool;
1172 pool = gst_rtsp_server_get_thread_pool (server);
1173 gst_rtsp_thread_pool_set_max_threads (pool, 2);
1174 g_object_unref (pool);
1178 do_test_play (NULL);
1195 media_constructed_block (GstRTSPMediaFactory * factory,
1196 GstRTSPMedia * media, gpointer user_data)
1198 gint *block_state = user_data;
1200 g_mutex_lock (&check_mutex);
1202 *block_state = BLOCKED;
1203 g_cond_broadcast (&check_cond);
1205 while (*block_state != UNBLOCK)
1206 g_cond_wait (&check_cond, &check_mutex);
1207 g_mutex_unlock (&check_mutex);
1211 GST_START_TEST (test_play_multithreaded_block_in_describe)
1213 GstRTSPConnection *conn;
1214 GstRTSPMountPoints *mounts;
1215 GstRTSPMediaFactory *factory;
1216 gint block_state = BLOCK_ME;
1217 GstRTSPMessage *request;
1218 GstRTSPMessage *response;
1219 GstRTSPStatusCode code;
1220 GstRTSPThreadPool *pool;
1222 pool = gst_rtsp_server_get_thread_pool (server);
1223 gst_rtsp_thread_pool_set_max_threads (pool, 2);
1224 g_object_unref (pool);
1226 mounts = gst_rtsp_server_get_mount_points (server);
1227 fail_unless (mounts != NULL);
1228 factory = gst_rtsp_media_factory_new ();
1229 gst_rtsp_media_factory_set_launch (factory,
1230 "( " VIDEO_PIPELINE " " AUDIO_PIPELINE " )");
1231 g_signal_connect (factory, "media-constructed",
1232 G_CALLBACK (media_constructed_block), &block_state);
1233 gst_rtsp_mount_points_add_factory (mounts, TEST_MOUNT_POINT "2", factory);
1234 g_object_unref (mounts);
1238 conn = connect_to_server (test_port, TEST_MOUNT_POINT "2");
1241 /* do describe, it will not return now as we've blocked it */
1242 request = create_request (conn, GST_RTSP_DESCRIBE, NULL);
1243 fail_unless (send_request (conn, request));
1244 gst_rtsp_message_free (request);
1246 g_mutex_lock (&check_mutex);
1247 while (block_state != BLOCKED)
1248 g_cond_wait (&check_cond, &check_mutex);
1249 g_mutex_unlock (&check_mutex);
1251 /* Do a second connection while the first one is blocked */
1252 do_test_play (NULL);
1254 /* Now unblock the describe */
1255 g_mutex_lock (&check_mutex);
1256 block_state = UNBLOCK;
1257 g_cond_broadcast (&check_cond);
1258 g_mutex_unlock (&check_mutex);
1260 response = read_response (conn);
1261 gst_rtsp_message_parse_response (response, &code, NULL, NULL);
1262 fail_unless (code == GST_RTSP_STS_OK);
1263 gst_rtsp_message_free (response);
1266 gst_rtsp_connection_free (conn);
1276 new_session_timeout_one (GstRTSPClient * client,
1277 GstRTSPSession * session, gpointer user_data)
1279 gst_rtsp_session_set_timeout (session, 1);
1281 g_signal_handlers_disconnect_by_func (client, new_session_timeout_one,
1286 session_connected_new_session_cb (GstRTSPServer * server,
1287 GstRTSPClient * client, gpointer user_data)
1290 g_signal_connect (client, "new-session", user_data, NULL);
1293 GST_START_TEST (test_play_multithreaded_timeout_client)
1295 GstRTSPConnection *conn;
1296 GstSDPMessage *sdp_message = NULL;
1297 const GstSDPMedia *sdp_media;
1298 const gchar *video_control;
1299 const gchar *audio_control;
1300 GstRTSPRange client_port;
1301 gchar *session = NULL;
1302 GstRTSPTransport *video_transport = NULL;
1303 GstRTSPTransport *audio_transport = NULL;
1304 GstRTSPSessionPool *pool;
1305 GstRTSPThreadPool *thread_pool;
1307 thread_pool = gst_rtsp_server_get_thread_pool (server);
1308 gst_rtsp_thread_pool_set_max_threads (thread_pool, 2);
1309 g_object_unref (thread_pool);
1311 pool = gst_rtsp_server_get_session_pool (server);
1312 g_signal_connect (server, "client-connected",
1313 G_CALLBACK (session_connected_new_session_cb), new_session_timeout_one);
1318 conn = connect_to_server (test_port, TEST_MOUNT_POINT);
1320 sdp_message = do_describe (conn, TEST_MOUNT_POINT);
1322 /* get control strings from DESCRIBE response */
1323 fail_unless (gst_sdp_message_medias_len (sdp_message) == 2);
1324 sdp_media = gst_sdp_message_get_media (sdp_message, 0);
1325 video_control = gst_sdp_media_get_attribute_val (sdp_media, "control");
1326 sdp_media = gst_sdp_message_get_media (sdp_message, 1);
1327 audio_control = gst_sdp_media_get_attribute_val (sdp_media, "control");
1329 get_client_ports (&client_port);
1331 /* do SETUP for video and audio */
1332 fail_unless (do_setup (conn, video_control, &client_port, &session,
1333 &video_transport) == GST_RTSP_STS_OK);
1334 fail_unless (do_setup (conn, audio_control, &client_port, &session,
1335 &audio_transport) == GST_RTSP_STS_OK);
1337 fail_unless (gst_rtsp_session_pool_get_n_sessions (pool) == 1);
1339 /* send PLAY request and check that we get 200 OK */
1340 fail_unless (do_simple_request (conn, GST_RTSP_PLAY,
1341 session) == GST_RTSP_STS_OK);
1345 fail_unless (gst_rtsp_session_pool_cleanup (pool) == 1);
1346 fail_unless (gst_rtsp_session_pool_get_n_sessions (pool) == 0);
1348 /* clean up and iterate so the clean-up can finish */
1349 g_object_unref (pool);
1351 gst_rtsp_transport_free (video_transport);
1352 gst_rtsp_transport_free (audio_transport);
1353 gst_sdp_message_free (sdp_message);
1354 gst_rtsp_connection_free (conn);
1363 GST_START_TEST (test_play_multithreaded_timeout_session)
1365 GstRTSPConnection *conn;
1366 GstSDPMessage *sdp_message = NULL;
1367 const GstSDPMedia *sdp_media;
1368 const gchar *video_control;
1369 const gchar *audio_control;
1370 GstRTSPRange client_port;
1371 gchar *session1 = NULL;
1372 gchar *session2 = NULL;
1373 GstRTSPTransport *video_transport = NULL;
1374 GstRTSPTransport *audio_transport = NULL;
1375 GstRTSPSessionPool *pool;
1376 GstRTSPThreadPool *thread_pool;
1378 thread_pool = gst_rtsp_server_get_thread_pool (server);
1379 gst_rtsp_thread_pool_set_max_threads (thread_pool, 2);
1380 g_object_unref (thread_pool);
1382 pool = gst_rtsp_server_get_session_pool (server);
1383 g_signal_connect (server, "client-connected",
1384 G_CALLBACK (session_connected_new_session_cb), new_session_timeout_one);
1389 conn = connect_to_server (test_port, TEST_MOUNT_POINT);
1391 gst_rtsp_connection_set_remember_session_id (conn, FALSE);
1393 sdp_message = do_describe (conn, TEST_MOUNT_POINT);
1395 /* get control strings from DESCRIBE response */
1396 fail_unless (gst_sdp_message_medias_len (sdp_message) == 2);
1397 sdp_media = gst_sdp_message_get_media (sdp_message, 0);
1398 video_control = gst_sdp_media_get_attribute_val (sdp_media, "control");
1399 sdp_media = gst_sdp_message_get_media (sdp_message, 1);
1400 audio_control = gst_sdp_media_get_attribute_val (sdp_media, "control");
1402 get_client_ports (&client_port);
1404 /* do SETUP for video and audio */
1405 fail_unless (do_setup (conn, video_control, &client_port, &session1,
1406 &video_transport) == GST_RTSP_STS_OK);
1407 fail_unless (do_setup (conn, audio_control, &client_port, &session2,
1408 &audio_transport) == GST_RTSP_STS_OK);
1410 fail_unless (gst_rtsp_session_pool_get_n_sessions (pool) == 2);
1412 /* send PLAY request and check that we get 200 OK */
1413 fail_unless (do_simple_request (conn, GST_RTSP_PLAY,
1414 session1) == GST_RTSP_STS_OK);
1415 fail_unless (do_simple_request (conn, GST_RTSP_PLAY,
1416 session2) == GST_RTSP_STS_OK);
1420 fail_unless (gst_rtsp_session_pool_cleanup (pool) == 1);
1422 /* send TEARDOWN request and check that we get 454 Session Not found */
1423 fail_unless (do_simple_request (conn, GST_RTSP_TEARDOWN,
1424 session1) == GST_RTSP_STS_SESSION_NOT_FOUND);
1426 fail_unless (do_simple_request (conn, GST_RTSP_TEARDOWN,
1427 session2) == GST_RTSP_STS_OK);
1429 /* clean up and iterate so the clean-up can finish */
1430 g_object_unref (pool);
1433 gst_rtsp_transport_free (video_transport);
1434 gst_rtsp_transport_free (audio_transport);
1435 gst_sdp_message_free (sdp_message);
1436 gst_rtsp_connection_free (conn);
1445 GST_START_TEST (test_play_disconnect)
1447 GstRTSPConnection *conn;
1448 GstSDPMessage *sdp_message = NULL;
1449 const GstSDPMedia *sdp_media;
1450 const gchar *video_control;
1451 const gchar *audio_control;
1452 GstRTSPRange client_port;
1453 gchar *session = NULL;
1454 GstRTSPTransport *video_transport = NULL;
1455 GstRTSPTransport *audio_transport = NULL;
1456 GstRTSPSessionPool *pool;
1458 pool = gst_rtsp_server_get_session_pool (server);
1459 g_signal_connect (server, "client-connected",
1460 G_CALLBACK (session_connected_new_session_cb), new_session_timeout_one);
1464 conn = connect_to_server (test_port, TEST_MOUNT_POINT);
1466 sdp_message = do_describe (conn, TEST_MOUNT_POINT);
1468 /* get control strings from DESCRIBE response */
1469 fail_unless (gst_sdp_message_medias_len (sdp_message) == 2);
1470 sdp_media = gst_sdp_message_get_media (sdp_message, 0);
1471 video_control = gst_sdp_media_get_attribute_val (sdp_media, "control");
1472 sdp_media = gst_sdp_message_get_media (sdp_message, 1);
1473 audio_control = gst_sdp_media_get_attribute_val (sdp_media, "control");
1475 get_client_ports (&client_port);
1477 /* do SETUP for video and audio */
1478 fail_unless (do_setup (conn, video_control, &client_port, &session,
1479 &video_transport) == GST_RTSP_STS_OK);
1480 fail_unless (do_setup (conn, audio_control, &client_port, &session,
1481 &audio_transport) == GST_RTSP_STS_OK);
1483 fail_unless (gst_rtsp_session_pool_get_n_sessions (pool) == 1);
1485 /* send PLAY request and check that we get 200 OK */
1486 fail_unless (do_simple_request (conn, GST_RTSP_PLAY,
1487 session) == GST_RTSP_STS_OK);
1489 gst_rtsp_connection_free (conn);
1493 fail_unless (gst_rtsp_session_pool_get_n_sessions (pool) == 1);
1494 fail_unless (gst_rtsp_session_pool_cleanup (pool) == 1);
1497 /* clean up and iterate so the clean-up can finish */
1498 g_object_unref (pool);
1500 gst_rtsp_transport_free (video_transport);
1501 gst_rtsp_transport_free (audio_transport);
1502 gst_sdp_message_free (sdp_message);
1510 /* Only different with test_play is the specific ports selected */
1512 GST_START_TEST (test_play_specific_server_port)
1514 GstRTSPMountPoints *mounts;
1516 GstRTSPMediaFactory *factory;
1517 GstRTSPAddressPool *pool;
1518 GstRTSPConnection *conn;
1519 GstSDPMessage *sdp_message = NULL;
1520 const GstSDPMedia *sdp_media;
1521 const gchar *video_control;
1522 GstRTSPRange client_port;
1523 gchar *session = NULL;
1524 GstRTSPTransport *video_transport = NULL;
1525 GSocket *rtp_socket, *rtcp_socket;
1526 GSocketAddress *rtp_address, *rtcp_address;
1527 guint16 rtp_port, rtcp_port;
1529 mounts = gst_rtsp_server_get_mount_points (server);
1531 factory = gst_rtsp_media_factory_new ();
1532 pool = gst_rtsp_address_pool_new ();
1533 gst_rtsp_address_pool_add_range (pool, GST_RTSP_ADDRESS_POOL_ANY_IPV4,
1534 GST_RTSP_ADDRESS_POOL_ANY_IPV4, 7770, 7780, 0);
1535 gst_rtsp_media_factory_set_address_pool (factory, pool);
1536 g_object_unref (pool);
1537 gst_rtsp_media_factory_set_launch (factory, "( " VIDEO_PIPELINE " )");
1538 gst_rtsp_mount_points_add_factory (mounts, TEST_MOUNT_POINT, factory);
1539 g_object_unref (mounts);
1541 /* set port to any */
1542 gst_rtsp_server_set_service (server, "0");
1544 /* attach to default main context */
1545 source_id = gst_rtsp_server_attach (server, NULL);
1546 fail_if (source_id == 0);
1549 service = gst_rtsp_server_get_service (server);
1550 test_port = atoi (service);
1551 fail_unless (test_port != 0);
1554 GST_DEBUG ("rtsp server listening on port %d", test_port);
1557 conn = connect_to_server (test_port, TEST_MOUNT_POINT);
1559 sdp_message = do_describe (conn, TEST_MOUNT_POINT);
1561 /* get control strings from DESCRIBE response */
1562 fail_unless (gst_sdp_message_medias_len (sdp_message) == 1);
1563 sdp_media = gst_sdp_message_get_media (sdp_message, 0);
1564 video_control = gst_sdp_media_get_attribute_val (sdp_media, "control");
1566 get_client_ports_full (&client_port, &rtp_socket, &rtcp_socket);
1568 /* do SETUP for video */
1569 fail_unless (do_setup (conn, video_control, &client_port, &session,
1570 &video_transport) == GST_RTSP_STS_OK);
1572 /* send PLAY request and check that we get 200 OK */
1573 fail_unless (do_simple_request (conn, GST_RTSP_PLAY,
1574 session) == GST_RTSP_STS_OK);
1576 receive_rtp (rtp_socket, &rtp_address);
1577 receive_rtcp (rtcp_socket, &rtcp_address, 0);
1579 fail_unless (G_IS_INET_SOCKET_ADDRESS (rtp_address));
1580 fail_unless (G_IS_INET_SOCKET_ADDRESS (rtcp_address));
1582 g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (rtp_address));
1584 g_inet_socket_address_get_port (G_INET_SOCKET_ADDRESS (rtcp_address));
1585 fail_unless (rtp_port >= 7770 && rtp_port <= 7780 && rtp_port % 2 == 0);
1586 fail_unless (rtcp_port >= 7770 && rtcp_port <= 7780 && rtcp_port % 2 == 1);
1587 fail_unless (rtp_port + 1 == rtcp_port);
1589 g_object_unref (rtp_address);
1590 g_object_unref (rtcp_address);
1592 /* send TEARDOWN request and check that we get 200 OK */
1593 fail_unless (do_simple_request (conn, GST_RTSP_TEARDOWN,
1594 session) == GST_RTSP_STS_OK);
1596 /* FIXME: The rtsp-server always disconnects the transport before
1597 * sending the RTCP BYE
1598 * receive_rtcp (rtcp_socket, NULL, GST_RTCP_TYPE_BYE);
1601 /* clean up and iterate so the clean-up can finish */
1602 g_object_unref (rtp_socket);
1603 g_object_unref (rtcp_socket);
1605 gst_rtsp_transport_free (video_transport);
1606 gst_sdp_message_free (sdp_message);
1607 gst_rtsp_connection_free (conn);
1617 GST_START_TEST (test_play_smpte_range)
1621 do_test_play ("npt=5-");
1622 do_test_play ("smpte=0:00:00-");
1623 do_test_play ("smpte=1:00:00-");
1624 do_test_play ("smpte=1:00:03-");
1625 do_test_play ("clock=20120321T152256Z-");
1633 GST_START_TEST (test_announce_without_sdp)
1635 GstRTSPConnection *conn;
1636 GstRTSPStatusCode status;
1637 GstRTSPMessage *request;
1638 GstRTSPMessage *response;
1640 start_record_server ("( fakesink name=depay0 )");
1642 conn = connect_to_server (test_port, TEST_MOUNT_POINT);
1644 /* create and send ANNOUNCE request */
1645 request = create_request (conn, GST_RTSP_ANNOUNCE, NULL);
1647 fail_unless (send_request (conn, request));
1651 response = read_response (conn);
1653 /* check response */
1654 gst_rtsp_message_parse_response (response, &status, NULL, NULL);
1655 fail_unless_equals_int (status, GST_RTSP_STS_BAD_REQUEST);
1656 gst_rtsp_message_free (response);
1658 /* try again, this type with content-type, but still no SDP */
1659 gst_rtsp_message_add_header (request, GST_RTSP_HDR_CONTENT_TYPE,
1662 fail_unless (send_request (conn, request));
1666 response = read_response (conn);
1668 /* check response */
1669 gst_rtsp_message_parse_response (response, &status, NULL, NULL);
1670 fail_unless_equals_int (status, GST_RTSP_STS_BAD_REQUEST);
1671 gst_rtsp_message_free (response);
1673 /* try again, this type with an unknown content-type */
1674 gst_rtsp_message_remove_header (request, GST_RTSP_HDR_CONTENT_TYPE, -1);
1675 gst_rtsp_message_add_header (request, GST_RTSP_HDR_CONTENT_TYPE,
1676 "application/x-something");
1678 fail_unless (send_request (conn, request));
1682 response = read_response (conn);
1684 /* check response */
1685 gst_rtsp_message_parse_response (response, &status, NULL, NULL);
1686 fail_unless_equals_int (status, GST_RTSP_STS_BAD_REQUEST);
1687 gst_rtsp_message_free (response);
1689 /* clean up and iterate so the clean-up can finish */
1690 gst_rtsp_message_free (request);
1691 gst_rtsp_connection_free (conn);
1698 static GstRTSPStatusCode
1699 do_announce (GstRTSPConnection * conn, GstSDPMessage * sdp)
1701 GstRTSPMessage *request;
1702 GstRTSPMessage *response;
1703 GstRTSPStatusCode code;
1706 /* create request */
1707 request = create_request (conn, GST_RTSP_ANNOUNCE, NULL);
1709 gst_rtsp_message_add_header (request, GST_RTSP_HDR_CONTENT_TYPE,
1712 /* add SDP to the response body */
1713 str = gst_sdp_message_as_text (sdp);
1714 gst_rtsp_message_take_body (request, (guint8 *) str, strlen (str));
1715 gst_sdp_message_free (sdp);
1718 fail_unless (send_request (conn, request));
1719 gst_rtsp_message_free (request);
1724 response = read_response (conn);
1726 /* check status line */
1727 gst_rtsp_message_parse_response (response, &code, NULL, NULL);
1729 gst_rtsp_message_free (response);
1734 media_constructed_cb (GstRTSPMediaFactory * mfactory, GstRTSPMedia * media,
1737 GstElement **p_sink = user_data;
1740 bin = gst_rtsp_media_get_element (media);
1741 *p_sink = gst_bin_get_by_name (GST_BIN (bin), "sink");
1742 GST_INFO ("media constructed!: %" GST_PTR_FORMAT, *p_sink);
1745 #define RECORD_N_BUFS 10
1747 GST_START_TEST (test_record_tcp)
1749 GstRTSPMediaFactory *mfactory;
1750 GstRTSPConnection *conn;
1751 GstRTSPStatusCode status;
1752 GstRTSPMessage *response;
1753 GstRTSPMessage *request;
1758 GstElement *server_sink = NULL;
1759 GSocket *conn_socket;
1761 gchar *client_ip, *sess_id, *session = NULL;
1765 start_record_server ("( rtppcmadepay name=depay0 ! appsink name=sink )");
1767 g_signal_connect (mfactory, "media-constructed",
1768 G_CALLBACK (media_constructed_cb), &server_sink);
1770 conn = connect_to_server (test_port, TEST_MOUNT_POINT);
1772 conn_socket = gst_rtsp_connection_get_read_socket (conn);
1774 sa = g_socket_get_local_address (conn_socket, NULL);
1775 ia = g_inet_socket_address_get_address (G_INET_SOCKET_ADDRESS (sa));
1776 client_ip = g_inet_address_to_string (ia);
1777 if (g_socket_address_get_family (sa) == G_SOCKET_FAMILY_IPV6)
1779 else if (g_socket_address_get_family (sa) == G_SOCKET_FAMILY_IPV4)
1782 g_assert_not_reached ();
1783 g_object_unref (sa);
1785 gst_sdp_message_new (&sdp);
1787 /* some standard things first */
1788 gst_sdp_message_set_version (sdp, "0");
1790 /* session ID doesn't have to be super-unique in this case */
1791 sess_id = g_strdup_printf ("%u", g_random_int ());
1792 gst_sdp_message_set_origin (sdp, "-", sess_id, "1", "IN", proto, client_ip);
1796 gst_sdp_message_set_session_name (sdp, "Session streamed with GStreamer");
1797 gst_sdp_message_set_information (sdp, "rtsp-server-test");
1798 gst_sdp_message_add_time (sdp, "0", "0", NULL);
1799 gst_sdp_message_add_attribute (sdp, "tool", "GStreamer");
1803 GstSDPMedia *smedia;
1805 gst_sdp_media_new (&smedia);
1806 gst_sdp_media_set_media (smedia, "audio");
1807 gst_sdp_media_add_format (smedia, "8"); /* pcma/alaw */
1808 gst_sdp_media_set_port_info (smedia, 0, 1);
1809 gst_sdp_media_set_proto (smedia, "RTP/AVP");
1810 gst_sdp_media_add_attribute (smedia, "rtpmap", "8 PCMA/8000");
1811 gst_sdp_message_add_media (sdp, smedia);
1812 gst_sdp_media_free (smedia);
1815 /* send ANNOUNCE request */
1816 status = do_announce (conn, sdp);
1817 fail_unless_equals_int (status, GST_RTSP_STS_OK);
1819 /* create and send SETUP request */
1820 request = create_request (conn, GST_RTSP_SETUP, NULL);
1821 gst_rtsp_message_add_header (request, GST_RTSP_HDR_TRANSPORT,
1822 "RTP/AVP/TCP;interleaved=0;mode=record");
1823 fail_unless (send_request (conn, request));
1824 gst_rtsp_message_free (request);
1826 response = read_response (conn);
1827 gst_rtsp_message_parse_response (response, &status, NULL, NULL);
1828 fail_unless_equals_int (status, GST_RTSP_STS_OK);
1831 gst_rtsp_message_get_header (response, GST_RTSP_HDR_SESSION, &session, 0);
1832 session = g_strdup (session);
1833 fail_unless_equals_int (rres, GST_RTSP_OK);
1834 gst_rtsp_message_free (response);
1837 request = create_request (conn, GST_RTSP_RECORD, NULL);
1838 gst_rtsp_message_add_header (request, GST_RTSP_HDR_SESSION, session);
1839 fail_unless (send_request (conn, request));
1840 gst_rtsp_message_free (request);
1842 response = read_response (conn);
1843 gst_rtsp_message_parse_response (response, &status, NULL, NULL);
1844 fail_unless_equals_int (status, GST_RTSP_STS_OK);
1845 gst_rtsp_message_free (response);
1847 /* send some data */
1849 GstElement *pipeline, *src, *enc, *pay, *sink;
1851 pipeline = gst_pipeline_new ("send-pipeline");
1852 src = gst_element_factory_make ("audiotestsrc", NULL);
1853 g_object_set (src, "num-buffers", RECORD_N_BUFS,
1854 "samplesperbuffer", 1000, NULL);
1855 enc = gst_element_factory_make ("alawenc", NULL);
1856 pay = gst_element_factory_make ("rtppcmapay", NULL);
1857 sink = gst_element_factory_make ("appsink", NULL);
1858 fail_unless (pipeline && src && enc && pay && sink);
1859 gst_bin_add_many (GST_BIN (pipeline), src, enc, pay, sink, NULL);
1860 gst_element_link_many (src, enc, pay, sink, NULL);
1861 gst_element_set_state (pipeline, GST_STATE_PLAYING);
1864 GstRTSPMessage *data_msg;
1865 GstMapInfo map = GST_MAP_INFO_INIT;
1867 GstSample *sample = NULL;
1870 g_signal_emit_by_name (G_OBJECT (sink), "pull-sample", &sample);
1873 buf = gst_sample_get_buffer (sample);
1874 rres = gst_rtsp_message_new_data (&data_msg, 0);
1875 fail_unless_equals_int (rres, GST_RTSP_OK);
1876 gst_buffer_map (buf, &map, GST_MAP_READ);
1877 GST_INFO ("sending %u bytes of data on channel 0", (guint) map.size);
1878 GST_MEMDUMP ("data on channel 0", map.data, map.size);
1879 rres = gst_rtsp_message_set_body (data_msg, map.data, map.size);
1880 fail_unless_equals_int (rres, GST_RTSP_OK);
1881 gst_buffer_unmap (buf, &map);
1882 rres = gst_rtsp_connection_send (conn, data_msg, NULL);
1883 fail_unless_equals_int (rres, GST_RTSP_OK);
1884 gst_rtsp_message_free (data_msg);
1885 gst_sample_unref (sample);
1888 gst_element_set_state (pipeline, GST_STATE_NULL);
1889 gst_object_unref (pipeline);
1892 /* check received data (we assume every buffer created by audiotestsrc and
1893 * subsequently encoded by mulawenc results in exactly one RTP packet) */
1894 for (i = 0; i < RECORD_N_BUFS; ++i) {
1895 GstSample *sample = NULL;
1897 g_signal_emit_by_name (G_OBJECT (server_sink), "pull-sample", &sample);
1898 GST_INFO ("%2d recv sample: %p", i, sample);
1899 gst_sample_unref (sample);
1902 fail_unless_equals_int (GST_STATE (server_sink), GST_STATE_PLAYING);
1904 /* clean up and iterate so the clean-up can finish */
1905 gst_rtsp_connection_free (conn);
1914 rtspserver_suite (void)
1916 Suite *s = suite_create ("rtspserver");
1917 TCase *tc = tcase_create ("general");
1919 suite_add_tcase (s, tc);
1920 tcase_add_checked_fixture (tc, setup, teardown);
1921 tcase_set_timeout (tc, 120);
1922 tcase_add_test (tc, test_connect);
1923 tcase_add_test (tc, test_describe);
1924 tcase_add_test (tc, test_describe_non_existing_mount_point);
1925 tcase_add_test (tc, test_describe_record_media);
1926 tcase_add_test (tc, test_setup);
1927 tcase_add_test (tc, test_setup_tcp);
1928 tcase_add_test (tc, test_setup_twice);
1929 tcase_add_test (tc, test_setup_with_require_header);
1930 tcase_add_test (tc, test_setup_non_existing_stream);
1931 tcase_add_test (tc, test_play);
1932 tcase_add_test (tc, test_play_without_session);
1933 tcase_add_test (tc, test_bind_already_in_use);
1934 tcase_add_test (tc, test_play_multithreaded);
1935 tcase_add_test (tc, test_play_multithreaded_block_in_describe);
1936 tcase_add_test (tc, test_play_multithreaded_timeout_client);
1937 tcase_add_test (tc, test_play_multithreaded_timeout_session);
1938 tcase_add_test (tc, test_play_disconnect);
1939 tcase_add_test (tc, test_play_specific_server_port);
1940 tcase_add_test (tc, test_play_smpte_range);
1941 tcase_add_test (tc, test_announce_without_sdp);
1942 tcase_add_test (tc, test_record_tcp);
1946 GST_CHECK_MAIN (rtspserver);