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