2 This file is part of GNUnet.
3 Copyright (C) 2009 GNUnet e.V.
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your option) any later version.
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 Affero General Public License for more details.
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
18 SPDX-License-Identifier: AGPL3.0-or-later
22 * @file util/test_bio.c
23 * @brief testcase for the buffered IO module
29 #include "gnunet_util_lib.h"
30 #define TESTSTRING "testString"
31 #define TESTNUMBER64 ((int64_t) 100000L)
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;
45 metaDataW = GNUNET_CONTAINER_meta_data_create ();
47 GNUNET_CONTAINER_meta_data_add_publication_date (metaDataW);
49 fileW = GNUNET_BIO_write_open (fileName);
50 GNUNET_assert (NULL != fileW);
51 GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_string (fileW, TESTSTRING));
52 GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_meta_data (fileW, metaDataW));
53 GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_int64 (fileW, TESTNUMBER64));
54 GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_close (fileW));
56 fileR = GNUNET_BIO_read_open (fileName);
57 GNUNET_assert (NULL != fileR);
58 readResultString = NULL;
59 GNUNET_assert (GNUNET_OK ==
60 GNUNET_BIO_read_string (fileR, "Read string error",
61 &readResultString, 200));
62 GNUNET_assert (NULL != readResultString);
63 GNUNET_assert (0 == strcmp (TESTSTRING, readResultString));
64 GNUNET_free (readResultString);
65 GNUNET_assert (GNUNET_OK ==
66 GNUNET_BIO_read_meta_data (fileR, "Read meta error",
68 GNUNET_assert (GNUNET_YES ==
69 GNUNET_CONTAINER_meta_data_test_equal (metaDataR, 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);
84 char *readResultString = (char *) "not null";
85 struct GNUNET_BIO_WriteHandle *fileW;
86 struct GNUNET_BIO_ReadHandle *fileR;
87 char *fileName = GNUNET_DISK_mktemp ("gnunet_bio");
89 fileW = GNUNET_BIO_write_open (fileName);
90 GNUNET_assert (NULL != fileW);
91 GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_string (fileW, NULL));
92 GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_close (fileW));
94 fileR = GNUNET_BIO_read_open (fileName);
95 GNUNET_assert (NULL != fileR);
96 GNUNET_assert (GNUNET_OK ==
97 GNUNET_BIO_read_string (fileR, "Read string error",
98 &readResultString, 200));
99 GNUNET_assert (NULL == readResultString);
100 GNUNET_BIO_read_close (fileR, &msg);
101 GNUNET_assert (GNUNET_OK == GNUNET_DISK_directory_remove (fileName));
102 GNUNET_free (fileName);
109 test_emptystring_rw ()
112 char *readResultString;
113 struct GNUNET_BIO_WriteHandle *fileW;
114 struct GNUNET_BIO_ReadHandle *fileR;
115 char *fileName = GNUNET_DISK_mktemp ("gnunet_bio");
117 fileW = GNUNET_BIO_write_open (fileName);
118 GNUNET_assert (NULL != fileW);
119 GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_string (fileW, ""));
120 GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_close (fileW));
122 fileR = GNUNET_BIO_read_open (fileName);
123 GNUNET_assert (NULL != fileR);
124 readResultString = NULL;
125 GNUNET_assert (GNUNET_OK ==
126 GNUNET_BIO_read_string (fileR, "Read string error",
127 &readResultString, 200));
128 GNUNET_free (readResultString);
129 GNUNET_BIO_read_close (fileR, &msg);
130 GNUNET_assert (GNUNET_OK == GNUNET_DISK_directory_remove (fileName));
131 GNUNET_free (fileName);
140 char *readResultString;
141 struct GNUNET_BIO_WriteHandle *fileW;
142 struct GNUNET_BIO_ReadHandle *fileR;
143 char *fileName = GNUNET_DISK_mktemp ("gnunet_bio");
145 fileW = GNUNET_BIO_write_open (fileName);
146 GNUNET_assert (NULL != fileW);
147 GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_string (fileW, TESTSTRING));
148 GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_close (fileW));
150 fileR = GNUNET_BIO_read_open (fileName);
151 GNUNET_assert (NULL != fileR);
152 readResultString = NULL;
153 GNUNET_assert (GNUNET_SYSERR ==
154 GNUNET_BIO_read_string (fileR, "Read string error",
155 &readResultString, 1));
156 GNUNET_assert (NULL == readResultString);
158 GNUNET_BIO_read_close (fileR, &msg);
160 GNUNET_assert (GNUNET_OK == GNUNET_DISK_directory_remove (fileName));
161 GNUNET_free (fileName);
170 static char meta[1024 * 1024 * 10];
171 struct GNUNET_BIO_WriteHandle *fileW;
172 struct GNUNET_BIO_ReadHandle *fileR;
173 char *fileName = GNUNET_DISK_mktemp ("gnunet_bio");
174 struct GNUNET_CONTAINER_MetaData *metaDataR;
176 memset (meta, 'b', sizeof(meta));
177 meta[sizeof(meta) - 1] = '\0';
178 fileW = GNUNET_BIO_write_open (fileName);
179 GNUNET_assert (NULL != fileW);
180 GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_int32 (fileW, sizeof(meta)));
181 GNUNET_assert (GNUNET_OK == GNUNET_BIO_write (fileW, meta, sizeof(meta)));
182 GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_close (fileW));
184 fileR = GNUNET_BIO_read_open (fileName);
185 GNUNET_assert (NULL != fileR);
187 GNUNET_assert (GNUNET_SYSERR ==
188 GNUNET_BIO_read_meta_data (fileR, "Read meta error",
191 GNUNET_BIO_read_close (fileR, &msg);
193 GNUNET_assert (GNUNET_OK == GNUNET_DISK_directory_remove (fileName));
194 GNUNET_assert (NULL == metaDataR);
195 GNUNET_free (fileName);
205 char readResult[200];
206 struct GNUNET_BIO_ReadHandle *fileR;
208 fileR = GNUNET_BIO_read_open ("/dev");
209 GNUNET_assert (NULL != fileR);
210 GNUNET_assert (GNUNET_SYSERR ==
211 GNUNET_BIO_read (fileR, "Read error", readResult,
212 sizeof(readResult)));
214 GNUNET_BIO_read_close (fileR, &msg);
224 static char fileNameNO[102401];
225 struct GNUNET_BIO_WriteHandle *fileWNO;
226 struct GNUNET_BIO_ReadHandle *fileRNO;
228 memset (fileNameNO, 'a', sizeof(fileNameNO));
229 fileNameNO[sizeof(fileNameNO) - 1] = '\0';
231 GNUNET_log_skip (1, GNUNET_NO);
232 fileWNO = GNUNET_BIO_write_open (fileNameNO);
233 GNUNET_log_skip (0, GNUNET_YES);
234 GNUNET_assert (NULL == fileWNO);
236 GNUNET_log_skip (1, GNUNET_NO);
237 fileRNO = GNUNET_BIO_read_open (fileNameNO);
238 GNUNET_log_skip (0, GNUNET_YES);
239 GNUNET_assert (NULL == fileRNO);
248 /* /dev/full only seems to exist on Linux */
251 char *readResultString;
252 char readResult[200];
253 struct GNUNET_BIO_WriteHandle *fileW;
254 struct GNUNET_BIO_ReadHandle *fileR;
255 struct GNUNET_CONTAINER_MetaData *metaDataW;
256 struct GNUNET_CONTAINER_MetaData *metaDataR;
258 metaDataW = GNUNET_CONTAINER_meta_data_create ();
259 GNUNET_CONTAINER_meta_data_add_publication_date (metaDataW);
261 fileW = GNUNET_BIO_write_open ("/dev/full");
262 GNUNET_assert (NULL != fileW);
263 (void) GNUNET_BIO_write (fileW, TESTSTRING, strlen (TESTSTRING));
264 (void) GNUNET_BIO_write_string (fileW, TESTSTRING);
265 (void) GNUNET_BIO_write_meta_data (fileW, metaDataW);
266 GNUNET_assert (GNUNET_SYSERR == GNUNET_BIO_write_close (fileW));
267 GNUNET_CONTAINER_meta_data_destroy (metaDataW);
269 fileW = GNUNET_BIO_write_open ("/dev/full");
270 GNUNET_assert (NULL != fileW);
271 GNUNET_assert (GNUNET_SYSERR == GNUNET_BIO_write_close (fileW));
273 fileR = GNUNET_BIO_read_open ("/dev/null");
274 GNUNET_assert (NULL != fileR);
275 GNUNET_assert (GNUNET_SYSERR ==
276 GNUNET_BIO_read (fileR, "Read error", readResult,
277 sizeof(readResult)));
278 readResultString = NULL;
279 GNUNET_assert (GNUNET_SYSERR ==
280 GNUNET_BIO_read_string (fileR, "Read string error",
281 &readResultString, 200));
282 GNUNET_assert (NULL == readResultString);
283 GNUNET_assert (GNUNET_SYSERR == GNUNET_BIO_read_int64 (fileR, &testNum));
285 GNUNET_assert (GNUNET_SYSERR ==
286 GNUNET_BIO_read_meta_data (fileR, "Read meta error",
289 GNUNET_BIO_read_close (fileR, &msg);
291 GNUNET_assert (NULL == metaDataR);
298 test_fakestring_rw ()
303 struct GNUNET_BIO_WriteHandle *fileW;
304 struct GNUNET_BIO_ReadHandle *fileR;
305 char *fileName = GNUNET_DISK_mktemp ("gnunet_bio");
307 fileW = GNUNET_BIO_write_open (fileName);
308 GNUNET_assert (NULL != fileW);
309 GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_int32 (fileW, tmpInt));
310 GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_close (fileW));
312 fileR = GNUNET_BIO_read_open (fileName);
313 GNUNET_assert (NULL != fileR);
314 GNUNET_assert (GNUNET_SYSERR ==
315 GNUNET_BIO_read_string (fileR, "Read string error",
318 GNUNET_BIO_read_close (fileR, &msg);
320 GNUNET_assert (GNUNET_OK == GNUNET_DISK_directory_remove (fileName));
321 GNUNET_free (fileName);
331 struct GNUNET_BIO_WriteHandle *fileW;
332 struct GNUNET_BIO_ReadHandle *fileR;
333 char *fileName = GNUNET_DISK_mktemp ("gnunet_bio");
334 struct GNUNET_CONTAINER_MetaData *metaDataR;
336 fileW = GNUNET_BIO_write_open (fileName);
337 GNUNET_assert (NULL != fileW);
338 GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_int32 (fileW, tmpInt));
339 GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_close (fileW));
341 fileR = GNUNET_BIO_read_open (fileName);
342 GNUNET_assert (NULL != fileR);
344 GNUNET_assert (GNUNET_SYSERR ==
345 GNUNET_BIO_read_meta_data (fileR, "Read meta error",
347 GNUNET_assert (NULL == metaDataR);
349 GNUNET_BIO_read_close (fileR, &msg);
351 GNUNET_assert (GNUNET_OK == GNUNET_DISK_directory_remove (fileName));
352 GNUNET_free (fileName);
358 test_fakebigmeta_rw ()
361 int32_t tmpInt = 1024 * 1024 * 10;
362 struct GNUNET_BIO_WriteHandle *fileW;
363 struct GNUNET_BIO_ReadHandle *fileR;
364 char *fileName = GNUNET_DISK_mktemp ("gnunet_bio");
365 struct GNUNET_CONTAINER_MetaData *metaDataR;
367 fileW = GNUNET_BIO_write_open (fileName);
368 GNUNET_assert (NULL != fileW);
369 GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_int32 (fileW, tmpInt));
370 GNUNET_assert (GNUNET_OK == GNUNET_BIO_write_close (fileW));
372 fileR = GNUNET_BIO_read_open (fileName);
373 GNUNET_assert (NULL != fileR);
375 GNUNET_assert (GNUNET_SYSERR ==
376 GNUNET_BIO_read_meta_data (fileR, "Read meta error",
379 GNUNET_BIO_read_close (fileR, &msg);
381 GNUNET_assert (GNUNET_OK == GNUNET_DISK_directory_remove (fileName));
382 GNUNET_assert (NULL == metaDataR);
383 GNUNET_free (fileName);
391 GNUNET_assert (0 == test_nullstring_rw ());
392 GNUNET_assert (0 == test_emptystring_rw ());
393 GNUNET_assert (0 == test_bigstring_rw ());
394 GNUNET_assert (0 == test_fakestring_rw ());
402 GNUNET_assert (0 == test_fakebigmeta_rw ());
403 GNUNET_assert (0 == test_fakemeta_rw ());
404 GNUNET_assert (0 == test_bigmeta_rw ());
412 GNUNET_assert (0 == test_normal_rw ());
413 GNUNET_assert (0 == test_nullfile_rw ());
414 GNUNET_assert (0 == test_fullfile_rw ());
415 GNUNET_assert (0 == test_directory_r ());
421 main (int argc, char *argv[])
423 GNUNET_log_setup ("test-bio", "WARNING", NULL);
424 GNUNET_assert (0 == check_file_rw ());
425 GNUNET_assert (0 == check_metadata_rw ());
426 GNUNET_assert (0 == check_string_rw ());
431 /* end of test_bio.c */