Returns now GNUNET_SYSERR
[oweals/gnunet.git] / src / util / test_bio.c
1 /*
2      This file is part of GNUnet.
3      (C) 2009 Christian Grothoff (and other contributing authors)
4
5      GNUnet is free software; you can redistribute it and/or modify
6      it under the terms of the GNU General Public License as published
7      by the Free Software Foundation; either version 3, or (at your
8      option) any later version.
9
10      GNUnet is distributed in the hope that it will be useful, but
11      WITHOUT ANY WARRANTY; without even the implied warranty of
12      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13      General Public License for more details.
14
15      You should have received a copy of the GNU General Public License
16      along with GNUnet; see the file COPYING.  If not, write to the
17      Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18      Boston, MA 02111-1307, USA.
19 */
20
21 /**
22  * @file util/test_bio.c
23  * @brief testcase for the buffered IO module
24  * @author Ji Lu
25  */
26
27
28 #include "platform.h"
29 #include "gnunet_util_lib.h"
30 #define TESTSTRING "testString"
31 #define TESTNUMBER64 ((int64_t)100000L)
32
33 static int
34 test_normal_rw ()
35 {
36   char *msg;
37   int64_t testNum;
38   char *readResultString;
39   char *fileName = GNUNET_DISK_mktemp ("gnunet_bio");
40   struct GNUNET_BIO_WriteHandle *fileW;
41   struct GNUNET_BIO_ReadHandle *fileR;
42   struct GNUNET_CONTAINER_MetaData *metaDataW;
43   struct GNUNET_CONTAINER_MetaData *metaDataR;
44   metaDataW = GNUNET_CONTAINER_meta_data_create ();
45   metaDataR = NULL;
46   GNUNET_CONTAINER_meta_data_add_publication_date (metaDataW);
47
48   fileW = GNUNET_BIO_write_open (fileName);
49   GNUNET_assert (NULL != fileW);
50   GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_string (fileW, TESTSTRING));
51   GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_meta_data (fileW, metaDataW));
52   GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_int64 (fileW, TESTNUMBER64));
53   GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_close (fileW));
54
55   fileR = GNUNET_BIO_read_open (fileName);
56   GNUNET_assert (NULL != fileR);
57   readResultString = NULL;
58   GNUNET_assert (GNUNET_OK ==
59                  GNUNET_BIO_read_string (fileR, "Read string error",
60                                          &readResultString, 200));
61   GNUNET_assert (NULL != readResultString);
62   GNUNET_assert (0 == strcmp (TESTSTRING, readResultString));
63   GNUNET_free (readResultString);
64   GNUNET_assert (GNUNET_OK ==
65                  GNUNET_BIO_read_meta_data (fileR, "Read meta error",
66                                             &metaDataR));
67   GNUNET_assert (GNUNET_YES ==
68                  GNUNET_CONTAINER_meta_data_test_equal (metaDataR,
69                                                         metaDataW));
70   GNUNET_assert (GNUNET_OK == GNUNET_BIO_read_int64 (fileR, &testNum));
71   GNUNET_BIO_read_close (fileR, &msg);
72   GNUNET_CONTAINER_meta_data_destroy (metaDataW);
73   GNUNET_CONTAINER_meta_data_destroy (metaDataR);
74   GNUNET_assert (GNUNET_OK == GNUNET_DISK_directory_remove (fileName));
75   GNUNET_free (fileName);
76   return 0;
77 }
78
79 static int
80 test_nullstring_rw ()
81 {
82   char *msg;
83   char *readResultString = (char *) "not null";
84   struct GNUNET_BIO_WriteHandle *fileW;
85   struct GNUNET_BIO_ReadHandle *fileR;
86   char *fileName = GNUNET_DISK_mktemp ("gnunet_bio");
87
88   fileW = GNUNET_BIO_write_open (fileName);
89   GNUNET_assert (NULL != fileW);
90   GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_string (fileW, NULL));
91   GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_close (fileW));
92
93   fileR = GNUNET_BIO_read_open (fileName);
94   GNUNET_assert (NULL != fileR);
95   GNUNET_assert (GNUNET_OK ==
96                  GNUNET_BIO_read_string (fileR, "Read string error",
97                                          &readResultString, 200));
98   GNUNET_assert (NULL == readResultString);
99   GNUNET_BIO_read_close (fileR, &msg);
100   GNUNET_assert (GNUNET_OK == GNUNET_DISK_directory_remove (fileName));
101   GNUNET_free (fileName);
102
103   return 0;
104 }
105
106 static int
107 test_emptystring_rw ()
108 {
109   char *msg;
110   char *readResultString;
111   struct GNUNET_BIO_WriteHandle *fileW;
112   struct GNUNET_BIO_ReadHandle *fileR;
113   char *fileName = GNUNET_DISK_mktemp ("gnunet_bio");
114
115   fileW = GNUNET_BIO_write_open (fileName);
116   GNUNET_assert (NULL != fileW);
117   GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_string (fileW, ""));
118   GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_close (fileW));
119
120   fileR = GNUNET_BIO_read_open (fileName);
121   GNUNET_assert (NULL != fileR);
122   readResultString = NULL;
123   GNUNET_assert (GNUNET_OK ==
124                  GNUNET_BIO_read_string (fileR, "Read string error",
125                                          &readResultString, 200));
126   GNUNET_free (readResultString);
127   GNUNET_BIO_read_close (fileR, &msg);
128   GNUNET_assert (GNUNET_OK == GNUNET_DISK_directory_remove (fileName));
129   GNUNET_free (fileName);
130   return 0;
131 }
132
133 static int
134 test_bigstring_rw ()
135 {
136   char *msg;
137   char *readResultString;
138   struct GNUNET_BIO_WriteHandle *fileW;
139   struct GNUNET_BIO_ReadHandle *fileR;
140   char *fileName = GNUNET_DISK_mktemp ("gnunet_bio");
141
142   fileW = GNUNET_BIO_write_open (fileName);
143   GNUNET_assert (NULL != fileW);
144   GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_string (fileW, TESTSTRING));
145   GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_close (fileW));
146
147   fileR = GNUNET_BIO_read_open (fileName);
148   GNUNET_assert (NULL != fileR);
149   readResultString = NULL;
150   GNUNET_assert (GNUNET_SYSERR ==
151                  GNUNET_BIO_read_string (fileR, "Read string error",
152                                          &readResultString, 1));
153   GNUNET_assert (NULL == readResultString);
154   msg = NULL;
155   GNUNET_BIO_read_close (fileR, &msg);
156   GNUNET_free (msg);
157   GNUNET_assert (GNUNET_OK == GNUNET_DISK_directory_remove (fileName));
158   GNUNET_free (fileName);
159   return 0;
160 }
161
162 static int
163 test_bigmeta_rw ()
164 {
165   char *msg;
166   static char meta[1024 * 1024 * 10];
167   struct GNUNET_BIO_WriteHandle *fileW;
168   struct GNUNET_BIO_ReadHandle *fileR;
169   char *fileName = GNUNET_DISK_mktemp ("gnunet_bio");
170   struct GNUNET_CONTAINER_MetaData *metaDataR;
171
172   memset (meta, 'b', sizeof (meta));
173   meta[sizeof (meta) - 1] = '\0';
174   fileW = GNUNET_BIO_write_open (fileName);
175   GNUNET_assert (NULL != fileW);
176   GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_int32 (fileW, sizeof(meta)));
177   GNUNET_assert (GNUNET_OK == GNUNET_BIO_write (fileW, meta, sizeof(meta)));
178   GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_close (fileW));
179
180   fileR = GNUNET_BIO_read_open (fileName);
181   GNUNET_assert (NULL != fileR);
182   metaDataR = NULL;
183   GNUNET_assert (GNUNET_SYSERR ==
184                  GNUNET_BIO_read_meta_data (fileR, "Read meta error",
185                                             &metaDataR));
186   msg = NULL;
187   GNUNET_BIO_read_close (fileR, &msg);
188   GNUNET_free (msg);
189   GNUNET_assert (GNUNET_OK == GNUNET_DISK_directory_remove (fileName));
190   GNUNET_assert (NULL == metaDataR);
191   GNUNET_free (fileName);
192   return 0;
193 }
194
195 static int
196 test_directory_r ()
197 {
198 #if LINUX || DARWIN
199   char *msg;
200   char readResult[200];
201   struct GNUNET_BIO_ReadHandle *fileR;
202
203   fileR = GNUNET_BIO_read_open ("/dev");
204   GNUNET_assert (NULL != fileR);
205   GNUNET_assert (GNUNET_SYSERR ==
206                  GNUNET_BIO_read (fileR, "Read error", readResult, sizeof(readResult)));
207   msg = NULL;
208   GNUNET_BIO_read_close (fileR, &msg);
209   GNUNET_free (msg);
210 #endif
211   return 0;
212 }
213
214 static int
215 test_nullfile_rw ()
216 {
217   static char fileNameNO[102401];
218   struct GNUNET_BIO_WriteHandle  *fileWNO;
219   struct GNUNET_BIO_ReadHandle *fileRNO;
220
221   memset (fileNameNO, 'a', sizeof (fileNameNO));
222   fileNameNO[sizeof (fileNameNO) - 1] = '\0';
223   
224   GNUNET_log_skip (1, GNUNET_NO);
225   fileWNO = GNUNET_BIO_write_open (fileNameNO);
226   GNUNET_log_skip (0, GNUNET_YES);
227   GNUNET_assert (NULL == fileWNO);
228
229   GNUNET_log_skip (1, GNUNET_NO);
230   fileRNO = GNUNET_BIO_read_open (fileNameNO);
231   GNUNET_log_skip (0, GNUNET_YES);
232   GNUNET_assert (NULL == fileRNO);
233   return 0;
234 }
235
236
237 static int
238 test_fullfile_rw ()
239 {
240 #ifdef LINUX 
241   /* /dev/full only seems to exist on Linux */
242   char *msg;
243   int64_t testNum;
244   char *readResultString;
245   char readResult[200];
246   struct GNUNET_BIO_WriteHandle *fileW;
247   struct GNUNET_BIO_ReadHandle *fileR;
248   struct GNUNET_CONTAINER_MetaData *metaDataW;
249   struct GNUNET_CONTAINER_MetaData *metaDataR;
250
251   metaDataW = GNUNET_CONTAINER_meta_data_create ();
252   GNUNET_CONTAINER_meta_data_add_publication_date (metaDataW);
253
254   fileW = GNUNET_BIO_write_open ("/dev/full");
255   GNUNET_assert (NULL != fileW);
256   (void) GNUNET_BIO_write (fileW, TESTSTRING, strlen (TESTSTRING));
257   (void) GNUNET_BIO_write_string (fileW, TESTSTRING);
258   (void) GNUNET_BIO_write_meta_data (fileW, metaDataW);
259   GNUNET_assert (GNUNET_SYSERR == GNUNET_BIO_write_close (fileW));
260   GNUNET_CONTAINER_meta_data_destroy (metaDataW);
261
262   fileW = GNUNET_BIO_write_open ("/dev/full");
263   GNUNET_assert (NULL != fileW);
264   GNUNET_assert (GNUNET_SYSERR == GNUNET_BIO_write_close (fileW));
265
266   fileR = GNUNET_BIO_read_open ("/dev/null");
267   GNUNET_assert (NULL != fileR);
268   GNUNET_assert (GNUNET_SYSERR ==
269                  GNUNET_BIO_read (fileR, "Read error", readResult, sizeof(readResult)));
270   readResultString = NULL;
271   GNUNET_assert (GNUNET_SYSERR ==
272                  GNUNET_BIO_read_string (fileR, "Read string error",
273                                          &readResultString, 200));
274   GNUNET_assert (NULL == readResultString);
275   GNUNET_assert (GNUNET_SYSERR == GNUNET_BIO_read_int64 (fileR, &testNum));
276   metaDataR = NULL;
277   GNUNET_assert (GNUNET_SYSERR ==
278                  GNUNET_BIO_read_meta_data (fileR, "Read meta error",
279                                             &metaDataR));
280   msg = NULL;
281   GNUNET_BIO_read_close (fileR, &msg);
282   GNUNET_free (msg);
283   GNUNET_assert (NULL == metaDataR);
284 #endif
285   return 0;
286 }
287
288 static int
289 test_fakestring_rw ()
290 {
291   char *msg;
292   int32_t tmpInt = 2;
293   char *readResult;
294   struct GNUNET_BIO_WriteHandle *fileW;
295   struct GNUNET_BIO_ReadHandle *fileR;
296   char *fileName = GNUNET_DISK_mktemp ("gnunet_bio");
297
298   fileW = GNUNET_BIO_write_open (fileName);
299   GNUNET_assert (NULL != fileW);
300   GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_int32 (fileW, tmpInt));
301   GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_close (fileW));
302
303   fileR = GNUNET_BIO_read_open (fileName);
304   GNUNET_assert (NULL != fileR);
305   GNUNET_assert (GNUNET_SYSERR ==
306                  GNUNET_BIO_read_string (fileR, "Read string error",
307                                          &readResult, 200));
308   msg = NULL;
309   GNUNET_BIO_read_close (fileR, &msg);
310   GNUNET_free (msg);
311   GNUNET_assert (GNUNET_OK == GNUNET_DISK_directory_remove (fileName));
312   GNUNET_free (fileName);
313   return 0;
314 }
315
316 static int
317 test_fakemeta_rw ()
318 {
319   char *msg;
320   int32_t tmpInt = 2;
321   struct GNUNET_BIO_WriteHandle *fileW;
322   struct GNUNET_BIO_ReadHandle *fileR;
323   char *fileName = GNUNET_DISK_mktemp ("gnunet_bio");
324   struct GNUNET_CONTAINER_MetaData *metaDataR;
325
326   fileW = GNUNET_BIO_write_open (fileName);
327   GNUNET_assert (NULL != fileW);
328   GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_int32 (fileW, tmpInt));
329   GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_close (fileW));
330
331   fileR = GNUNET_BIO_read_open (fileName);
332   GNUNET_assert (NULL != fileR);
333   metaDataR = NULL;
334   GNUNET_assert (GNUNET_SYSERR ==
335                  GNUNET_BIO_read_meta_data (fileR, "Read meta error",
336                                             &metaDataR));
337   GNUNET_assert (NULL == metaDataR);
338   msg = NULL;
339   GNUNET_BIO_read_close (fileR, &msg);
340   GNUNET_free (msg);
341   GNUNET_assert (GNUNET_OK == GNUNET_DISK_directory_remove (fileName));
342   GNUNET_free (fileName);
343   return 0;
344 }
345
346 static int
347 test_fakebigmeta_rw ()
348 {
349   char *msg;
350   int32_t tmpInt = 1024 * 1024 * 10;
351   struct GNUNET_BIO_WriteHandle *fileW;
352   struct GNUNET_BIO_ReadHandle *fileR;
353   char *fileName = GNUNET_DISK_mktemp ("gnunet_bio");
354   struct GNUNET_CONTAINER_MetaData *metaDataR;
355
356   fileW = GNUNET_BIO_write_open (fileName);
357   GNUNET_assert (NULL != fileW);
358   GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_int32 (fileW, tmpInt));
359   GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_close (fileW));
360
361   fileR = GNUNET_BIO_read_open (fileName);
362   GNUNET_assert (NULL != fileR);
363   metaDataR = NULL;
364   GNUNET_assert (GNUNET_SYSERR ==
365                  GNUNET_BIO_read_meta_data (fileR, "Read meta error",
366                                             &metaDataR));
367   msg = NULL;
368   GNUNET_BIO_read_close (fileR, &msg);
369   GNUNET_free (msg);
370   GNUNET_assert (GNUNET_OK == GNUNET_DISK_directory_remove (fileName));
371   GNUNET_assert (NULL == metaDataR);
372   GNUNET_free (fileName);
373   return 0;
374 }
375
376 static int
377 check_string_rw ()
378 {
379   GNUNET_assert (0 == test_nullstring_rw ());
380   GNUNET_assert (0 == test_emptystring_rw ());
381   GNUNET_assert (0 == test_bigstring_rw ());
382   GNUNET_assert (0 == test_fakestring_rw ());
383   return 0;
384 }
385
386 static int
387 check_metadata_rw ()
388 {
389   GNUNET_assert (0 == test_fakebigmeta_rw ());
390   GNUNET_assert (0 == test_fakemeta_rw ());
391   GNUNET_assert (0 == test_bigmeta_rw ());
392   return 0;
393 }
394
395 static int
396 check_file_rw ()
397 {
398   GNUNET_assert (0 == test_normal_rw ());
399   GNUNET_assert (0 == test_nullfile_rw ());
400   GNUNET_assert (0 == test_fullfile_rw ());
401   GNUNET_assert (0 == test_directory_r ());
402   return 0;
403 }
404
405 int
406 main (int argc, char *argv[])
407 {
408   GNUNET_log_setup ("test-bio", "WARNING", NULL);
409   GNUNET_assert (0 == check_file_rw ());
410   GNUNET_assert (0 == check_metadata_rw ());
411   GNUNET_assert (0 == check_string_rw ());
412   return 0;
413 }
414
415 /* end of test_bio.c */