[glib] gio/tests/socket: add test for g_socket_get_available_bytes()



commit 02393e6faf409c0cae952e94ecbc2c8fad75a3ee
Author: Sebastian Dröge <sebastian droege collabora co uk>
Date:   Wed Oct 24 14:25:01 2012 +0200

    gio/tests/socket: add test for g_socket_get_available_bytes()
    
    https://bugzilla.gnome.org/show_bug.cgi?id=686786

 gio/tests/socket.c |   76 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 76 insertions(+), 0 deletions(-)
---
diff --git a/gio/tests/socket.c b/gio/tests/socket.c
index df1ec70..6b267b0 100644
--- a/gio/tests/socket.c
+++ b/gio/tests/socket.c
@@ -901,6 +901,81 @@ test_reuse_udp (void)
   g_object_unref (sock2);
 }
 
+static void
+test_datagram_get_available (void)
+{
+  GError *err = NULL;
+  GSocket *server, *client;
+  GInetAddress *addr;
+  GSocketAddress *saddr;
+  gchar data[] = "0123456789abcdef";
+  gchar buf[34];
+  gssize nread;
+
+  server = g_socket_new (G_SOCKET_FAMILY_IPV4,
+                                G_SOCKET_TYPE_DATAGRAM,
+                                G_SOCKET_PROTOCOL_DEFAULT,
+                                &err);
+  g_assert_no_error (err);
+  g_assert (G_IS_SOCKET (server));
+
+  client = g_socket_new (G_SOCKET_FAMILY_IPV4,
+                        G_SOCKET_TYPE_DATAGRAM,
+                        G_SOCKET_PROTOCOL_DEFAULT,
+                        &err);
+  g_assert_no_error (err);
+  g_assert (G_IS_SOCKET (client));
+
+  addr = g_inet_address_new_any (G_SOCKET_FAMILY_IPV4);
+  saddr = g_inet_socket_address_new (addr, 0);
+
+  g_socket_bind (server, saddr, TRUE, &err);
+  g_assert_no_error (err);
+  g_object_unref (saddr);
+  g_object_unref (addr);
+
+  saddr = g_socket_get_local_address (server, &err);
+  g_assert_no_error (err);
+
+  g_socket_send_to (client, saddr, data, sizeof (data), NULL, &err);
+  g_assert_no_error (err);
+
+  while (!g_socket_condition_wait (server, G_IO_IN, NULL, NULL))
+    ;
+  g_assert_cmpint (g_socket_get_available_bytes (server), ==, sizeof (data));
+
+  g_socket_send_to (client, saddr, data, sizeof (data), NULL, &err);
+  g_assert_no_error (err);
+
+  /* g_socket_condition_wait() won't help here since the socket is
+   * definitely already readable. So there's a race condition here, but
+   * at least the failure mode is passes-when-it-shouldn't, not
+   * fails-when-it-shouldn't.
+   */
+  g_usleep (100000);
+  g_assert_cmpint (g_socket_get_available_bytes (server), ==, sizeof (data));
+
+  g_assert_cmpint (sizeof (buf), >=, 2 * sizeof (data));
+  nread = g_socket_receive (server, buf, sizeof (buf), NULL, &err);
+  g_assert_cmpint (nread, ==, sizeof (data));
+  g_assert_no_error (err);
+
+  g_assert_cmpint (g_socket_get_available_bytes (server), ==, sizeof (data));
+
+  nread = g_socket_receive (server, buf, sizeof (buf), NULL, &err);
+  g_assert_cmpint (nread, ==, sizeof (data));
+  g_assert_no_error (err);
+
+  g_assert_cmpint (g_socket_get_available_bytes (server), ==, 0);
+
+  g_socket_close (server, &err);
+  g_assert_no_error (err);
+
+  g_object_unref (saddr);
+  g_object_unref (server);
+  g_object_unref (client);
+}
+
 int
 main (int   argc,
       char *argv[])
@@ -924,6 +999,7 @@ main (int   argc,
 #endif
   g_test_add_func ("/socket/reuse/tcp", test_reuse_tcp);
   g_test_add_func ("/socket/reuse/udp", test_reuse_udp);
+  g_test_add_func ("/socket/datagram_get_available", test_datagram_get_available);
 
   return g_test_run();
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]