[kdbus] Make SipHash function as a private utility function to kdbus
[platform/upstream/glib.git] / tests / iochannel-test.c
index 18ea01d..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[] = G_IO_CHANNEL_UNIX_LINE_TERM;
+    char *filename;
+    gint rlength = 0;
+    glong wlength = 0;
+    gsize length_out;
+    const gchar encoding[] = "EUC-JP";
     GIOStatus status;
-    GIOFlags flags;
 
-    if (argc < 2)
-    {
-        g_print( "Usage: foo in-file\n" );
-        exit (1);
-    }
+    g_test_init (&argc, &argv, NULL);
 
-    setbuf(stdout, NULL); /* For debugging */
+    filename = g_test_build_filename (G_TEST_DIST, "iochannel-test-infile", NULL);
 
-    gio_r = g_io_channel_new_file (argv[1], G_IO_FILE_MODE_READ, &gerr);
-    if(gerr) {
-      g_warning(gerr->message);
-      g_warning("Unable to open file %s", argv[1]);
-      g_free(gerr);
-      return 0;
-    }
-    gio_w = g_io_channel_new_file( "/var/tmp/fooOut.txt", G_IO_FILE_MODE_WRITE, &gerr);
-    if(gerr) {
-      g_warning(gerr->message);
-      g_free(gerr);
-      return 0;
-    }
+    setbuf (stdout, NULL); /* For debugging */
+
+    gio_r = g_io_channel_new_file (filename, "r", &gerr);
+    if (gerr)
+      {
+        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);
+    if (gerr)
+      {
+        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;
-    }
+    if (gerr)
+      {
+        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);
 
     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;
-    }
-    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);
+    if (status == G_IO_STATUS_ERROR)
+      {
+        g_warning ("%s", gerr->message);
+        g_clear_error (&gerr);
+      }
     buffer = g_string_sized_new (BUFFER_SIZE);
 
     while (TRUE)
@@ -88,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,13 +137,9 @@ gint main (gint argc, gchar * argv[])
       {
         case G_IO_STATUS_EOF:
           break;
-        case G_IO_STATUS_PARTIAL_CHARS:
-          g_warning ("Partial characters at the end of input.");
-          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.");
@@ -123,16 +150,23 @@ gint main (gint argc, gchar * argv[])
       status = g_io_channel_flush (gio_w, &gerr);
     while (status == G_IO_STATUS_AGAIN);
 
-    if(status == G_IO_STATUS_ERROR) {
-      g_warning(gerr->message);
-      g_error_free(gerr);
-      gerr = NULL;
-    }
+    if (status == G_IO_STATUS_ERROR)
+      {
+        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;
 }