/bin/ksh can't handle a for-loop with no arguments, so add a "." for when
[platform/upstream/glib.git] / gio / tests / data-output-stream.c
1 /* GLib testing framework examples and tests
2  * Copyright (C) 2008 Red Hat, Inc.
3  * Authors: Tomas Bzatek <tbzatek@redhat.com>
4  *
5  * This work is provided "as is"; redistribution and modification
6  * in whole or in part, in any medium, physical or electronic is
7  * permitted without restriction.
8  *
9  * This work is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12  *
13  * In no event shall the authors or contributors be liable for any
14  * direct, indirect, incidental, special, exemplary, or consequential
15  * damages (including, but not limited to, procurement of substitute
16  * goods or services; loss of use, data, or profits; or business
17  * interruption) however caused and on any theory of liability, whether
18  * in contract, strict liability, or tort (including negligence or
19  * otherwise) arising in any way out of the use of this software, even
20  * if advised of the possibility of such damage.
21  */
22 #include <glib/gtestutils.h>
23 #include <glib/glib.h>
24 #include <gio/gio.h>
25 #include <stdlib.h>
26 #include <string.h>
27
28 #define MAX_LINES               0xFFF   
29 #define MAX_LINES_BUFF          0xFFFFFF
30 #define MAX_BYTES_BINARY        0x100   
31
32 static void
33 test_read_lines (GDataStreamNewlineType newline_type)
34 {
35   GOutputStream *stream;
36   GOutputStream *base_stream;
37   GError *error = NULL;
38   gpointer data;
39   char *lines;
40   int size;
41   int i;
42   int size;
43
44 #define TEST_STRING     "some_text"
45   
46   const char* endl[4] = {"\n", "\r", "\r\n", "\n"};
47   
48   
49   data = g_malloc0 (MAX_LINES_BUFF);
50   lines = g_malloc0 ((strlen (TEST_STRING) + strlen (endl[newline_type])) * MAX_LINES + 1);
51   
52   /* initialize objects */
53   base_stream = g_memory_output_stream_new (data, MAX_LINES_BUFF, NULL, NULL);
54   stream = G_OUTPUT_STREAM (g_data_output_stream_new (base_stream));
55
56   
57   /*  fill data */
58   for (i = 0; i < MAX_LINES; i++)
59     {
60       gboolean res;
61       char *s = g_strconcat (TEST_STRING, endl[newline_type], NULL);
62       res = g_data_output_stream_put_string (G_DATA_OUTPUT_STREAM (stream), s, NULL, &error);
63       g_stpcpy ((char*)(lines + i*strlen(s)), s);
64       g_assert (error == NULL);
65       g_assert (res == TRUE);
66     }
67
68   /*  Byte order testing */
69   g_data_output_stream_set_byte_order (G_DATA_OUTPUT_STREAM (stream), G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN);
70   g_assert_cmpint (g_data_output_stream_get_byte_order (G_DATA_OUTPUT_STREAM (stream)), ==, G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN);
71   g_data_output_stream_set_byte_order (G_DATA_OUTPUT_STREAM (stream), G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN);
72   g_assert_cmpint (g_data_output_stream_get_byte_order (G_DATA_OUTPUT_STREAM (stream)), ==, G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN);
73   
74   /*  compare data */
75   size = strlen (data);
76   g_assert_cmpint (size, <, MAX_LINES_BUFF);
77   g_assert_cmpstr ((char*)data, ==, lines);
78   
79   g_object_unref (base_stream);
80   g_object_unref (stream);
81   g_free (data);
82   g_free (lines);
83 }
84
85 static void
86 test_read_lines_LF (void)
87 {
88   test_read_lines (G_DATA_STREAM_NEWLINE_TYPE_LF);
89 }
90
91 static void
92 test_read_lines_CR (void)
93 {
94   test_read_lines (G_DATA_STREAM_NEWLINE_TYPE_CR);
95 }
96
97 static void
98 test_read_lines_CR_LF (void)
99 {
100   test_read_lines (G_DATA_STREAM_NEWLINE_TYPE_CR_LF);
101 }
102
103 enum TestDataType {
104   TEST_DATA_BYTE = 0,
105   TEST_DATA_INT16,
106   TEST_DATA_UINT16,
107   TEST_DATA_INT32,
108   TEST_DATA_UINT32,
109   TEST_DATA_INT64,
110   TEST_DATA_UINT64
111 };
112
113 #define TEST_DATA_RETYPE(a, v)  \
114         (a == TEST_DATA_BYTE    ? (guchar)v : \
115         (a == TEST_DATA_INT16   ? (gint16)v : \
116         (a == TEST_DATA_UINT16  ? (guint16)v : \
117         (a == TEST_DATA_INT32   ? (gint32)v : \
118         (a == TEST_DATA_UINT32  ? (guint32)v : \
119         (a == TEST_DATA_INT64   ? (gint64)v : \
120          (guint64)v )))))) 
121
122 #define TEST_DATA_RETYPE_BUFF(a, v)     \
123         (a == TEST_DATA_BYTE    ? *(guchar*)v : \
124         (a == TEST_DATA_INT16   ? *(gint16*)v : \
125         (a == TEST_DATA_UINT16  ? *(guint16*)v : \
126         (a == TEST_DATA_INT32   ? *(gint32*)v : \
127         (a == TEST_DATA_UINT32  ? *(guint32*)v : \
128         (a == TEST_DATA_INT64   ? *(gint64*)v : \
129          *(guint64*)v )))))) 
130
131
132
133
134 static void
135 test_data_array (gpointer buffer, int len,
136                  enum TestDataType data_type, GDataStreamByteOrder byte_order)
137 {
138   GOutputStream *stream;
139   GOutputStream *base_stream;
140   gpointer stream_data;
141   
142   GError *error = NULL;
143   int pos;
144   int data_size = 1;
145   GDataStreamByteOrder native;
146   gboolean swap;
147   gboolean res;
148   guint64 data;
149   
150   /*  create objects */
151   stream_data = g_malloc0 (len);
152   base_stream = g_memory_output_stream_new (stream_data, len, NULL, NULL);
153   stream = G_OUTPUT_STREAM (g_data_output_stream_new (base_stream));
154   g_data_output_stream_set_byte_order (G_DATA_OUTPUT_STREAM (stream), byte_order);
155   
156
157   /*  Set correct data size */
158   switch (data_type)
159     {
160     case TEST_DATA_BYTE:
161       data_size = 1;
162       break;
163     case TEST_DATA_INT16:
164     case TEST_DATA_UINT16:
165       data_size = 2;
166       break;
167     case TEST_DATA_INT32:
168     case TEST_DATA_UINT32:
169       data_size = 4;
170       break;
171     case TEST_DATA_INT64:
172     case TEST_DATA_UINT64:
173       data_size = 8;
174       break; 
175     }
176         
177   /*  Set flag to swap bytes if needed */
178   native = (G_BYTE_ORDER == G_BIG_ENDIAN) ? G_DATA_STREAM_BYTE_ORDER_BIG_ENDIAN : G_DATA_STREAM_BYTE_ORDER_LITTLE_ENDIAN;
179   swap = (byte_order != G_DATA_STREAM_BYTE_ORDER_HOST_ENDIAN) && (byte_order != native);
180
181   /*  Write data to the file */
182   pos = 0;
183   while (pos < len)
184     {
185       switch (data_type)
186         {
187         case TEST_DATA_BYTE:
188           res = g_data_output_stream_put_byte (G_DATA_OUTPUT_STREAM (stream), TEST_DATA_RETYPE_BUFF (data_type, ((guchar*)buffer + pos)), NULL, &error);
189           break;
190         case TEST_DATA_INT16:
191           res = g_data_output_stream_put_int16 (G_DATA_OUTPUT_STREAM (stream), TEST_DATA_RETYPE_BUFF (data_type, ((guchar*)buffer + pos)), NULL, &error);
192           break;
193         case TEST_DATA_UINT16:
194           res = g_data_output_stream_put_uint16 (G_DATA_OUTPUT_STREAM (stream), TEST_DATA_RETYPE_BUFF (data_type, ((guchar*)buffer + pos)), NULL, &error);
195           break;
196         case TEST_DATA_INT32:
197           res = g_data_output_stream_put_int32 (G_DATA_OUTPUT_STREAM (stream), TEST_DATA_RETYPE_BUFF (data_type, ((guchar*)buffer + pos)), NULL, &error);
198           break;
199         case TEST_DATA_UINT32:
200           res = g_data_output_stream_put_uint32 (G_DATA_OUTPUT_STREAM (stream), TEST_DATA_RETYPE_BUFF (data_type, ((guchar*)buffer + pos)), NULL, &error);
201           break;
202         case TEST_DATA_INT64:
203           res = g_data_output_stream_put_int64 (G_DATA_OUTPUT_STREAM (stream), TEST_DATA_RETYPE_BUFF (data_type, ((guchar*)buffer + pos)), NULL, &error);
204           break;
205         case TEST_DATA_UINT64:
206           res = g_data_output_stream_put_uint64 (G_DATA_OUTPUT_STREAM (stream), TEST_DATA_RETYPE_BUFF (data_type, ((guchar*)buffer + pos)), NULL, &error);
207           break;
208         }
209       g_assert (error == NULL);
210       g_assert_cmpint (res, ==, TRUE);
211       pos += data_size;
212     }
213   
214         
215   /*  Compare data back */
216   pos = 0;
217   data = 0;
218   while (pos < len)
219     {
220       data = TEST_DATA_RETYPE_BUFF(data_type, ((guchar*)stream_data + pos));
221       if (swap)
222         {
223           switch (data_type)
224             {
225             case TEST_DATA_BYTE:  
226               break;
227             case TEST_DATA_UINT16:
228             case TEST_DATA_INT16:
229               data = TEST_DATA_RETYPE(data_type, GUINT16_SWAP_LE_BE(TEST_DATA_RETYPE(data_type, data)));
230               break;
231             case TEST_DATA_UINT32:
232             case TEST_DATA_INT32:
233               data = TEST_DATA_RETYPE(data_type, GUINT32_SWAP_LE_BE(TEST_DATA_RETYPE(data_type, data)));
234               break;
235             case TEST_DATA_UINT64:
236             case TEST_DATA_INT64:
237               data = TEST_DATA_RETYPE(data_type, GUINT64_SWAP_LE_BE(TEST_DATA_RETYPE(data_type, data)));
238               break;
239             }
240         }
241       g_assert_cmpint (data, ==, TEST_DATA_RETYPE_BUFF(data_type, ((guchar*)buffer + pos)));
242       break;
243       
244       pos += data_size;
245     }
246   
247   g_object_unref (base_stream);
248   g_object_unref (stream);
249   g_free (stream_data);
250 }
251
252 static void
253 test_read_int (void)
254 {
255   GRand *rand;
256   gpointer buffer;
257   int i;
258   
259   rand = g_rand_new ();
260   buffer = g_malloc0(MAX_BYTES_BINARY);
261   
262   /*  Fill in some random data */
263   for (i = 0; i < MAX_BYTES_BINARY; i++)
264     {
265       guchar x = 0;
266       while (! x)  x = (guchar)g_rand_int (rand);
267       *(guchar*)((guchar*)buffer + sizeof (guchar) * i) = x; 
268     }
269
270   for (i = 0; i < 3; i++)
271     {
272       int j;
273       for (j = 0; j <= TEST_DATA_UINT64; j++)
274         test_data_array (buffer, MAX_BYTES_BINARY, j, i);
275     }
276   
277   g_rand_free (rand);
278   g_free (buffer);
279 }
280
281 int
282 main (int   argc,
283       char *argv[])
284 {
285   g_type_init ();
286   g_test_init (&argc, &argv, NULL);
287
288   g_test_add_func ("/data-input-stream/read-lines-LF", test_read_lines_LF);
289   g_test_add_func ("/data-input-stream/read-lines-CR", test_read_lines_CR);
290   g_test_add_func ("/data-input-stream/read-lines-CR-LF", test_read_lines_CR_LF);
291   g_test_add_func ("/data-input-stream/read-int", test_read_int);
292
293   return g_test_run();
294 }