Git init
[framework/multimedia/gstreamer0.10.git] / tests / check / libs / gstnettimeprovider.c
1 /* GStreamer
2  * Copyright (C) 2005 Andy Wingo <wingo@pobox.com>
3  *
4  * gstnettimeprovider.c: Unit test for the network time provider
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Library General Public
8  * License as published by the Free Software Foundation; either
9  * version 2 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Library General Public License for more details.
15  *
16  * You should have received a copy of the GNU Library General Public
17  * License along with this library; if not, write to the
18  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19  * Boston, MA 02111-1307, USA.
20  */
21
22 #include <gst/check/gstcheck.h>
23 #include <gst/net/gstnet.h>
24
25 #include <unistd.h>
26
27 GST_START_TEST (test_refcounts)
28 {
29   GstNetTimeProvider *ntp;
30   GstClock *clock;
31
32   clock = gst_system_clock_obtain ();
33   fail_unless (clock != NULL, "failed to get system clock");
34
35   /* one for gstreamer, one for us */
36   ASSERT_OBJECT_REFCOUNT (clock, "system clock", 2);
37
38   ntp = gst_net_time_provider_new (clock, NULL, 0);
39   fail_unless (ntp != NULL, "failed to create net time provider");
40
41   /* one for ntp, one for gstreamer, one for us */
42   ASSERT_OBJECT_REFCOUNT (clock, "system clock", 3);
43   /* one for us */
44   ASSERT_OBJECT_REFCOUNT (ntp, "net time provider", 1);
45
46   gst_object_unref (ntp);
47   ASSERT_OBJECT_REFCOUNT (clock, "net time provider", 2);
48
49   gst_object_unref (clock);
50 }
51
52 GST_END_TEST;
53
54 GST_START_TEST (test_functioning)
55 {
56   GstNetTimeProvider *ntp;
57   GstNetTimePacket *packet;
58   GstClock *clock;
59   GstClockTime local;
60   struct sockaddr_in servaddr;
61   gint port = -1, sockfd, ret;
62   socklen_t len;
63
64   clock = gst_system_clock_obtain ();
65   fail_unless (clock != NULL, "failed to get system clock");
66   ntp = gst_net_time_provider_new (clock, "127.0.0.1", 0);
67   fail_unless (ntp != NULL, "failed to create net time provider");
68
69   g_object_get (ntp, "port", &port, NULL);
70   fail_unless (port > 0);
71
72   sockfd = socket (AF_INET, SOCK_DGRAM, 0);
73   fail_if (sockfd < 0, "socket failed");
74
75   memset (&servaddr, 0, sizeof (servaddr));
76   servaddr.sin_family = AF_INET;
77   servaddr.sin_port = htons (port);
78 #ifndef G_OS_WIN32
79   inet_aton ("127.0.0.1", &servaddr.sin_addr);
80 #else
81   servaddr.sin_addr.s_addr = inet_addr ("127.0.0.1");
82 #endif
83
84   packet = gst_net_time_packet_new (NULL);
85   fail_unless (packet != NULL, "failed to create packet");
86
87   packet->local_time = local = gst_clock_get_time (clock);
88
89   len = sizeof (servaddr);
90   ret = gst_net_time_packet_send (packet, sockfd,
91       (struct sockaddr *) &servaddr, len);
92
93   fail_unless (ret == GST_NET_TIME_PACKET_SIZE, "failed to send packet");
94
95   g_free (packet);
96
97   packet = gst_net_time_packet_receive (sockfd, (struct sockaddr *) &servaddr,
98       &len);
99
100   fail_unless (packet != NULL, "failed to receive packet");
101   fail_unless (packet->local_time == local, "local time is not the same");
102   fail_unless (packet->remote_time > local, "remote time not after local time");
103   fail_unless (packet->remote_time < gst_clock_get_time (clock),
104       "remote time in the future");
105
106   g_free (packet);
107
108   close (sockfd);
109
110   gst_object_unref (ntp);
111   gst_object_unref (clock);
112 }
113
114 GST_END_TEST;
115
116 static Suite *
117 gst_net_time_provider_suite (void)
118 {
119   Suite *s = suite_create ("GstNetTimeProvider");
120   TCase *tc_chain = tcase_create ("generic tests");
121
122   suite_add_tcase (s, tc_chain);
123   tcase_add_test (tc_chain, test_refcounts);
124   tcase_add_test (tc_chain, test_functioning);
125
126   return s;
127 }
128
129 GST_CHECK_MAIN (gst_net_time_provider);