[kdbus] Make SipHash function as a private utility function to kdbus
[platform/upstream/glib.git] / tests / iochannel-test.c
index 2b048d9..06a85e5 100644 (file)
@@ -1,3 +1,6 @@
+#undef G_DISABLE_ASSERT
+#undef G_LOG_DOMAIN
+
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 
 #define BUFFER_SIZE 1024
 
+static void
+test_small_writes (void)
+{
+  GIOChannel *io;
+  GIOStatus status = G_IO_STATUS_ERROR;
+  guint cnt; 
+  gchar tmp;
+  GError *error = NULL;
+
+  io = g_io_channel_new_file ("iochannel-test-outfile", "w", &error);
+  if (error)
+    {
+      g_warning ("Unable to open file %s: %s", 
+                "iochannel-test-outfile", 
+                error->message);
+      g_clear_error (&error);
+      
+      exit (1);
+    }
+
+  g_io_channel_set_encoding (io, NULL, NULL);
+  g_io_channel_set_buffer_size (io, 1022);
+
+  cnt = 2 * g_io_channel_get_buffer_size (io);
+  tmp = 0;
+  while (cnt)
+    {
+      status = g_io_channel_write_chars (io, &tmp, 1, NULL, NULL);
+      if (status == G_IO_STATUS_ERROR)
+       break;
+      if (status == G_IO_STATUS_NORMAL)
+       cnt--;
+    }
+
+  g_assert (status == G_IO_STATUS_NORMAL);
+
+  g_io_channel_unref (io);
+}
+
+
 gint main (gint argc, gchar * argv[])
 {
     GIOChannel *gio_r, *gio_w ;
     GError *gerr = NULL;
     GString *buffer;
-    gint rlength = 0, wlength = 0, length_out, line_term_len;
-    gboolean block;
-    const gchar encoding[] = "EUC-JP", line_term[] = "\n";
+    char *filename;
+    gint rlength = 0;
+    glong wlength = 0;
+    gsize length_out;
+    const gchar encoding[] = "EUC-JP";
     GIOStatus status;
-    GIOFlags flags;
 
-    setbuf(stdout, NULL); /* For debugging */
+    g_test_init (&argc, &argv, NULL);
 
-    gio_r = g_io_channel_new_file ("iochannel-test-infile", "r", &gerr);
+    filename = g_test_build_filename (G_TEST_DIST, "iochannel-test-infile", NULL);
+
+    setbuf (stdout, NULL); /* For debugging */
+
+    gio_r = g_io_channel_new_file (filename, "r", &gerr);
     if (gerr)
       {
-        g_warning(gerr->message);
-        g_warning("Unable to open file %s", "iochannel-test-infile");
-        g_free(gerr);
-        return 0;
+        g_warning ("Unable to open file %s: %s", filename, gerr->message);
+        g_clear_error (&gerr);
+        return 1;
       }
-    gio_w = g_io_channel_new_file"iochannel-test-outfile", "w", &gerr);
+    gio_w = g_io_channel_new_file ("iochannel-test-outfile", "w", &gerr);
     if (gerr)
       {
-        g_warning(gerr->message);
-        g_warning("Unable to open file %s", "iochannel-test-outfile");
-        g_free(gerr);
-        return 0;
+        g_warning ("Unable to open file %s: %s", "iochannel-test-outfile", gerr->message);
+        g_clear_error (&gerr);
+        return 1;
       }
 
     g_io_channel_set_encoding (gio_r, encoding, &gerr);
     if (gerr)
       {
-        g_warning(gerr->message);
-        g_free(gerr);
-        return 0;
+        g_warning ("%s", gerr->message);
+        /* Keep going if this is just a case of iconv not supporting EUC-JP, see bug 428048 */
+        if (gerr->code != G_CONVERT_ERROR_NO_CONVERSION)
+          return 1;
+        g_clear_error (&gerr);
       }
     
     g_io_channel_set_buffer_size (gio_r, BUFFER_SIZE);
@@ -51,18 +100,9 @@ gint main (gint argc, gchar * argv[])
     status = g_io_channel_set_flags (gio_r, G_IO_FLAG_NONBLOCK, &gerr);
     if (status == G_IO_STATUS_ERROR)
       {
-        g_warning(gerr->message);
-        g_error_free(gerr);
-        gerr = NULL;
+        g_warning ("%s", gerr->message);
+        g_clear_error (&gerr);
       }
-    flags = g_io_channel_get_flags (gio_r);
-    block = ! (flags & G_IO_FLAG_NONBLOCK);
-    if (block)
-        g_print (" BLOCKING TRUE \n\n");
-    else
-        g_print (" BLOCKING FALSE \n\n");
-
-    line_term_len = strlen (line_term);
     buffer = g_string_sized_new (BUFFER_SIZE);
 
     while (TRUE)
@@ -87,17 +127,9 @@ gint main (gint argc, gchar * argv[])
         if (length_out < buffer->len)
           g_warning ("Only wrote part of the line.");
 
-        do
-          status = g_io_channel_write_chars (gio_w, line_term,
-            line_term_len, &length_out, &gerr);
-        while (status == G_IO_STATUS_AGAIN);
-        if (status != G_IO_STATUS_NORMAL)
-          break;
-
-        if (length_out < line_term_len)
-          g_warning ("Only wrote part of the line term.");
-
-        g_print (": %s\n", buffer->str);
+#ifdef VERBOSE
+        g_print ("%s", buffer->str);
+#endif
         g_string_truncate (buffer, 0);
     }
 
@@ -106,9 +138,8 @@ gint main (gint argc, gchar * argv[])
         case G_IO_STATUS_EOF:
           break;
         case G_IO_STATUS_ERROR:
-          g_warning (gerr->message);
-          g_error_free (gerr);
-          gerr = NULL;
+          g_warning ("%s", gerr->message);
+          g_clear_error (&gerr);
           break;
         default:
           g_warning ("Abnormal exit from write loop.");
@@ -121,15 +152,21 @@ gint main (gint argc, gchar * argv[])
 
     if (status == G_IO_STATUS_ERROR)
       {
-        g_warning(gerr->message);
-        g_error_free(gerr);
-        gerr = NULL;
+        g_warning ("%s", gerr->message);
+        g_clear_error (&gerr);
       }
 
-    g_print ("read %d bytes, wrote %d bytes\n", rlength, wlength);
+#ifdef VERBOSE
+    g_print ("read %d bytes, wrote %ld bytes\n", rlength, wlength);
+#endif
 
     g_io_channel_unref(gio_r);
     g_io_channel_unref(gio_w);
-    
+
+    test_small_writes ();
+
+    g_free (filename);
+    g_string_free (buffer, TRUE);
+
     return 0;
 }