1 /* -*- c-file-style: "gnu" -*- */
2 
3 #include <gcutter.h>
4 
5 #include <sys/types.h>
6 #include <sys/stat.h>
7 #include <fcntl.h>
8 #include <glib.h>
9 #include <string.h>
10 #include <stdio.h>
11 #include <stdlib.h>
12 
13 #define BUFFER_SIZE 1024
14 
15 void test_iochannel (void);
16 
17 void
setup(void)18 setup (void)
19 {
20 }
21 
22 void
teardown(void)23 teardown (void)
24 {
25 }
26 
27 static void
test_small_writes(void)28 test_small_writes (void)
29 {
30   GIOChannel *io;
31   GIOStatus status = G_IO_STATUS_NORMAL;
32   guint cnt;
33   gchar tmp;
34   GError *error = NULL;
35 
36   io = g_io_channel_new_file ("iochannel-test-outfile", "w", &error);
37 
38   gcut_assert_error (error);
39 
40   g_io_channel_set_encoding (io, NULL, NULL);
41   g_io_channel_set_buffer_size (io, 1022);
42 
43   cnt = 2 * g_io_channel_get_buffer_size (io);
44   tmp = 0;
45 
46   while (cnt)
47     {
48       status = g_io_channel_write_chars (io, &tmp, 1, NULL, NULL);
49       if (status == G_IO_STATUS_ERROR)
50 	break;
51       if (status == G_IO_STATUS_NORMAL)
52 	cnt--;
53     }
54 
55   cut_assert_equal_int (G_IO_STATUS_NORMAL, status);
56 
57   g_io_channel_unref (io);
58 }
59 
60 void
test_iochannel(void)61 test_iochannel (void)
62 {
63   GIOChannel *gio_r, *gio_w ;
64   GString *buffer;
65   char *filename;
66   char *srcdir = getenv ("srcdir");
67   gint rlength = 0;
68   glong wlength = 0;
69   gsize length_out;
70   const gchar encoding[] = "EUC-JP";
71   GIOStatus status;
72   GError *error = NULL;
73 
74   if (!srcdir)
75     srcdir = ".";
76   filename = g_build_filename (srcdir, "iochannel-test-infile", NULL);
77 
78   gio_r = g_io_channel_new_file (filename, "r", &error);
79   gcut_assert_error (error);
80 
81   gio_w = g_io_channel_new_file ("iochannel-test-outfile", "w", &error);
82   gcut_assert_error (error);
83 
84   g_io_channel_set_encoding (gio_r, encoding, &error);
85   gcut_assert_error (error);
86 
87   g_io_channel_set_buffer_size (gio_r, BUFFER_SIZE);
88 
89   status = g_io_channel_set_flags (gio_r, G_IO_FLAG_NONBLOCK, &error);
90   gcut_assert_error (error);
91   buffer = g_string_sized_new (BUFFER_SIZE);
92 
93   while (TRUE)
94   {
95       do
96         {
97           status = g_io_channel_read_line_string (gio_r, buffer, NULL, &error);
98           gcut_assert_error (error);
99         } while (status == G_IO_STATUS_AGAIN);
100       if (status != G_IO_STATUS_NORMAL)
101         break;
102 
103       rlength += buffer->len;
104 
105       do
106         {
107           status = g_io_channel_write_chars (gio_w, buffer->str, buffer->len,
108                                              &length_out, &error);
109           gcut_assert_error (error);
110         } while (status == G_IO_STATUS_AGAIN);
111       if (status != G_IO_STATUS_NORMAL)
112         break;
113 
114       wlength += length_out;
115 
116       if (length_out < buffer->len)
117         g_warning ("Only wrote part of the line.");
118 
119       g_string_truncate (buffer, 0);
120   }
121 
122   switch (status)
123     {
124       case G_IO_STATUS_EOF:
125         break;
126       case G_IO_STATUS_ERROR:
127         gcut_assert_error(error);
128         break;
129       default:
130         g_warning ("Abnormal exit from write loop.");
131         break;
132     }
133 
134   do
135     {
136       status = g_io_channel_flush (gio_w, &error);
137       gcut_assert_error (error);
138     } while (status == G_IO_STATUS_AGAIN);
139 
140   cut_assert_equal_int (G_IO_STATUS_NORMAL, status);
141 
142   g_io_channel_unref(gio_r);
143   g_io_channel_unref(gio_w);
144 
145   test_small_writes ();
146 }
147