1 /* GLib testing framework examples and tests
2 * Copyright (C) 2008 Red Hat, Inc.
3 * Authors: Matthias Clasen <mclasen@redhat.com>
5 * SPDX-License-Identifier: LicenseRef-old-glib-tests
7 * This work is provided "as is"; redistribution and modification
8 * in whole or in part, in any medium, physical or electronic is
9 * permitted without restriction.
11 * This work is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
15 * In no event shall the authors or contributors be liable for any
16 * direct, indirect, incidental, special, exemplary, or consequential
17 * damages (including, but not limited to, procurement of substitute
18 * goods or services; loss of use, data, or profits; or business
19 * interruption) however caused and on any theory of liability, whether
20 * in contract, strict liability, or tort (including negligence or
21 * otherwise) arising in any way out of the use of this software, even
22 * if advised of the possibility of such damage.
25 #include <glib/glib.h>
38 base = g_memory_input_stream_new_from_data ("abcdefghijk", -1, NULL);
39 in = g_buffered_input_stream_new_sized (base, 64);
41 g_buffered_input_stream_fill (G_BUFFERED_INPUT_STREAM (in), 5, NULL, NULL);
42 g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 5);
43 g_buffered_input_stream_fill (G_BUFFERED_INPUT_STREAM (in), -1, NULL, NULL);
44 g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, strlen ("abcdefjhijk"));
46 buffer = g_new0 (char, 64);
47 npeek = g_buffered_input_stream_peek (G_BUFFERED_INPUT_STREAM (in), buffer, 2, 3);
48 g_assert_cmpint (npeek, ==, 3);
49 g_assert_cmpstr ("cde", ==, buffer);
52 buffer = g_new0 (char, 64);
53 npeek = g_buffered_input_stream_peek (G_BUFFERED_INPUT_STREAM (in), buffer, 9, 5);
54 g_assert_cmpint (npeek, ==, 2);
55 g_assert_cmpstr ("jk", ==, buffer);
58 buffer = g_new0 (char, 64);
59 npeek = g_buffered_input_stream_peek (G_BUFFERED_INPUT_STREAM (in), buffer, 75, 3);
60 g_assert_cmpint (npeek, ==, 0);
64 g_object_unref (base);
68 test_peek_buffer (void)
76 base = g_memory_input_stream_new_from_data ("abcdefghijk", -1, NULL);
77 in = g_buffered_input_stream_new (base);
79 nfill = g_buffered_input_stream_fill (G_BUFFERED_INPUT_STREAM (in), strlen ("abcdefghijk"), NULL, NULL);
80 buffer = (char *) g_buffered_input_stream_peek_buffer (G_BUFFERED_INPUT_STREAM (in), &bufsize);
81 g_assert_cmpint (nfill, ==, bufsize);
82 g_assert (0 == strncmp ("abcdefghijk", buffer, bufsize));
85 g_object_unref (base);
89 test_set_buffer_size (void)
96 base = g_memory_input_stream_new_from_data ("abcdefghijk", -1, NULL);
97 in = g_buffered_input_stream_new (base);
98 size = g_buffered_input_stream_get_buffer_size (G_BUFFERED_INPUT_STREAM (in));
99 g_assert_cmpint (size, ==, 4096);
101 g_buffered_input_stream_set_buffer_size (G_BUFFERED_INPUT_STREAM (in), 64);
102 size = g_buffered_input_stream_get_buffer_size (G_BUFFERED_INPUT_STREAM (in));
103 g_assert_cmpint (size, ==, 64);
105 /* size cannot shrink below current content len */
106 g_buffered_input_stream_fill (G_BUFFERED_INPUT_STREAM (in), strlen ("abcdefghijk"), NULL, NULL);
107 g_buffered_input_stream_peek_buffer (G_BUFFERED_INPUT_STREAM (in), &bufsize);
108 g_buffered_input_stream_set_buffer_size (G_BUFFERED_INPUT_STREAM (in), 2);
109 size = g_buffered_input_stream_get_buffer_size (G_BUFFERED_INPUT_STREAM (in));
110 g_assert_cmpint (size, ==, bufsize);
111 g_object_get (in, "buffer-size", &bufsize_prop, NULL);
112 g_assert_cmpint (bufsize_prop, ==, bufsize);
116 in = g_buffered_input_stream_new_sized (base, 64);
117 size = g_buffered_input_stream_get_buffer_size (G_BUFFERED_INPUT_STREAM (in));
118 g_assert_cmpint (size, ==, 64);
121 g_object_unref (base);
125 test_read_byte (void)
131 g_test_bug ("https://bugzilla.gnome.org/show_bug.cgi?id=562393");
133 base = g_memory_input_stream_new_from_data ("abcdefgh", -1, NULL);
134 in = g_buffered_input_stream_new (base);
137 g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'a');
138 g_assert_no_error (error);
139 g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'b');
140 g_assert_no_error (error);
141 g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'c');
142 g_assert_no_error (error);
144 g_assert_cmpint (g_input_stream_skip (in, 3, NULL, &error), ==, 3);
145 g_assert_no_error (error);
147 g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'g');
148 g_assert_no_error (error);
149 g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'h');
150 g_assert_no_error (error);
151 g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, -1);
152 g_assert_no_error (error);
154 g_assert (g_input_stream_close (in, NULL, &error));
155 g_assert_no_error (error);
156 g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, -1);
157 g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CLOSED);
158 g_error_free (error);
161 g_object_unref (base);
172 base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", -1, NULL);
173 in = g_buffered_input_stream_new_sized (base, 8);
175 g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 0);
178 g_assert_cmpint (g_buffered_input_stream_fill (G_BUFFERED_INPUT_STREAM (in), 8, NULL, &error), ==, 8);
179 g_assert_no_error (error);
181 g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 8);
183 memset (buffer, 0, 20);
184 g_assert_cmpint (g_input_stream_read (in, &buffer, 16, NULL, &error), ==, 16);
185 g_assert_cmpstr (buffer, ==, "abcdefghijklmnop");
186 g_assert_no_error (error);
188 g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 0);
190 memset (buffer, 0, 20);
191 g_assert_cmpint (g_input_stream_read (in, &buffer, 16, NULL, &error), ==, 16);
192 g_assert_cmpstr (buffer, ==, "qrstuvwxyzABCDEF");
193 g_assert_no_error (error);
195 memset (buffer, 0, 20);
196 g_assert_cmpint (g_input_stream_read (in, &buffer, 16, NULL, &error), ==, 16);
197 g_assert_cmpstr (buffer, ==, "GHIJKLMNOPQRSTUV");
198 g_assert_no_error (error);
200 memset (buffer, 0, 20);
201 g_assert_cmpint (g_input_stream_read (in, &buffer, 16, NULL, &error), ==, 4);
202 g_assert_cmpstr (buffer, ==, "WXYZ");
203 g_assert_no_error (error);
205 memset (buffer, 0, 20);
206 g_assert_cmpint (g_input_stream_read (in, &buffer, 16, NULL, &error), ==, 0);
207 g_assert_no_error (error);
210 g_object_unref (base);
214 return_result_cb (GObject *object,
215 GAsyncResult *result,
218 GAsyncResult **ret = user_data;
220 *ret = g_object_ref (result);
224 test_read_async (void)
230 GAsyncResult *result;
232 base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", -1, NULL);
233 in = g_buffered_input_stream_new_sized (base, 8);
235 g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 0);
239 g_buffered_input_stream_fill_async (G_BUFFERED_INPUT_STREAM (in), 8,
240 G_PRIORITY_DEFAULT, NULL,
241 return_result_cb, &result);
243 g_main_context_iteration (NULL, TRUE);
244 g_assert_cmpint (g_buffered_input_stream_fill_finish (G_BUFFERED_INPUT_STREAM (in), result, &error), ==, 8);
245 g_assert_no_error (error);
246 g_clear_object (&result);
248 g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 8);
250 memset (buffer, 0, 20);
251 g_input_stream_read_async (in, &buffer, 16, G_PRIORITY_DEFAULT,
252 NULL, return_result_cb, &result);
254 g_main_context_iteration (NULL, TRUE);
255 g_assert_cmpint (g_input_stream_read_finish (in, result, &error), ==, 16);
256 g_assert_cmpstr (buffer, ==, "abcdefghijklmnop");
257 g_assert_no_error (error);
258 g_clear_object (&result);
260 g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 0);
262 memset (buffer, 0, 20);
263 g_input_stream_read_async (in, &buffer, 16, G_PRIORITY_DEFAULT,
264 NULL, return_result_cb, &result);
266 g_main_context_iteration (NULL, TRUE);
267 g_assert_cmpint (g_input_stream_read_finish (in, result, &error), ==, 16);
268 g_assert_cmpstr (buffer, ==, "qrstuvwxyzABCDEF");
269 g_assert_no_error (error);
270 g_clear_object (&result);
272 memset (buffer, 0, 20);
273 g_input_stream_read_async (in, &buffer, 16, G_PRIORITY_DEFAULT,
274 NULL, return_result_cb, &result);
276 g_main_context_iteration (NULL, TRUE);
277 g_assert_cmpint (g_input_stream_read_finish (in, result, &error), ==, 16);
278 g_assert_cmpstr (buffer, ==, "GHIJKLMNOPQRSTUV");
279 g_assert_no_error (error);
280 g_clear_object (&result);
282 memset (buffer, 0, 20);
283 g_input_stream_read_async (in, &buffer, 16, G_PRIORITY_DEFAULT,
284 NULL, return_result_cb, &result);
286 g_main_context_iteration (NULL, TRUE);
287 g_assert_cmpint (g_input_stream_read_finish (in, result, &error), ==, 4);
288 g_assert_cmpstr (buffer, ==, "WXYZ");
289 g_assert_no_error (error);
290 g_clear_object (&result);
292 memset (buffer, 0, 20);
293 g_input_stream_read_async (in, &buffer, 16, G_PRIORITY_DEFAULT,
294 NULL, return_result_cb, &result);
296 g_main_context_iteration (NULL, TRUE);
297 g_assert_cmpint (g_input_stream_read_finish (in, result, &error), ==, 0);
298 g_assert_no_error (error);
299 g_clear_object (&result);
302 g_object_unref (base);
312 base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ", -1, NULL);
313 in = g_buffered_input_stream_new_sized (base, 5);
316 g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'a');
317 g_assert_no_error (error);
318 g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'b');
319 g_assert_no_error (error);
320 g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'c');
321 g_assert_no_error (error);
323 g_assert_cmpint (g_input_stream_skip (in, 7, NULL, &error), ==, 7);
324 g_assert_no_error (error);
325 g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'k');
326 g_assert_no_error (error);
328 g_assert_cmpint (g_input_stream_skip (in, 10, NULL, &error), ==, 10);
329 g_assert_no_error (error);
330 g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'v');
331 g_assert_no_error (error);
333 g_assert_cmpint (g_input_stream_skip (in, 20, NULL, &error), ==, 20);
334 g_assert_no_error (error);
335 g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'Q');
336 g_assert_no_error (error);
338 g_assert_cmpint (g_input_stream_skip (in, 10, NULL, &error), ==, 8);
339 g_assert_no_error (error);
340 g_assert_cmpint (g_input_stream_skip (in, 10, NULL, &error), ==, 0);
341 g_assert_no_error (error);
344 g_object_unref (base);
348 test_skip_async (void)
353 GAsyncResult *result;
355 base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ", -1, NULL);
356 in = g_buffered_input_stream_new_sized (base, 5);
359 g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'a');
360 g_assert_no_error (error);
361 g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'b');
362 g_assert_no_error (error);
363 g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'c');
364 g_assert_no_error (error);
367 g_input_stream_skip_async (in, 7, G_PRIORITY_DEFAULT,
368 NULL, return_result_cb, &result);
370 g_main_context_iteration (NULL, TRUE);
371 g_assert_cmpint (g_input_stream_skip_finish (in, result, &error), ==, 7);
372 g_assert_no_error (error);
373 g_clear_object (&result);
374 g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'k');
375 g_assert_no_error (error);
377 g_input_stream_skip_async (in, 10, G_PRIORITY_DEFAULT,
378 NULL, return_result_cb, &result);
380 g_main_context_iteration (NULL, TRUE);
381 g_assert_cmpint (g_input_stream_skip_finish (in, result, &error), ==, 10);
382 g_assert_no_error (error);
383 g_clear_object (&result);
384 g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'v');
385 g_assert_no_error (error);
387 g_input_stream_skip_async (in, 20, G_PRIORITY_DEFAULT,
388 NULL, return_result_cb, &result);
390 g_main_context_iteration (NULL, TRUE);
391 g_assert_cmpint (g_input_stream_skip_finish (in, result, &error), ==, 20);
392 g_assert_no_error (error);
393 g_clear_object (&result);
394 g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'Q');
395 g_assert_no_error (error);
397 g_input_stream_skip_async (in, 10, G_PRIORITY_DEFAULT,
398 NULL, return_result_cb, &result);
400 g_main_context_iteration (NULL, TRUE);
401 g_assert_cmpint (g_input_stream_skip_finish (in, result, &error), ==, 8);
402 g_clear_object (&result);
403 g_assert_no_error (error);
405 g_input_stream_skip_async (in, 10, G_PRIORITY_DEFAULT,
406 NULL, return_result_cb, &result);
408 g_main_context_iteration (NULL, TRUE);
409 g_assert_cmpint (g_input_stream_skip_finish (in, result, &error), ==, 0);
410 g_clear_object (&result);
411 g_assert_no_error (error);
414 g_object_unref (base);
424 base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ", -1, NULL);
425 in = g_buffered_input_stream_new (base);
427 g_assert (g_filter_input_stream_get_close_base_stream (G_FILTER_INPUT_STREAM (in)));
430 g_assert (g_input_stream_close (in, NULL, &error));
431 g_assert_no_error (error);
432 g_assert (g_input_stream_is_closed (base));
435 g_object_unref (base);
437 base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ", -1, NULL);
438 in = g_buffered_input_stream_new (base);
440 g_filter_input_stream_set_close_base_stream (G_FILTER_INPUT_STREAM (in), FALSE);
443 g_assert (g_input_stream_close (in, NULL, &error));
444 g_assert_no_error (error);
445 g_assert (!g_input_stream_is_closed (base));
448 g_object_unref (base);
460 base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ", -1, NULL);
461 in = g_buffered_input_stream_new_sized (base, 4);
465 g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 0);
466 byte = g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error);
467 g_assert_no_error (error);
468 g_assert_cmpint (byte, ==, 'a');
469 g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 1);
471 /* Seek forward (in buffer) */
472 ret = g_seekable_seek (G_SEEKABLE (in), 1, G_SEEK_CUR, NULL, &error);
473 g_assert_no_error (error);
475 g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 2);
476 byte = g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error);
477 g_assert_no_error (error);
478 g_assert_cmpint (byte, ==, 'c');
479 g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 3);
481 /* Seek backward (in buffer) */
482 ret = g_seekable_seek (G_SEEKABLE (in), -2, G_SEEK_CUR, NULL, &error);
483 g_assert_no_error (error);
485 g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 1);
486 byte = g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error);
487 g_assert_no_error (error);
488 g_assert_cmpint (byte, ==, 'b');
489 g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 2);
491 /* Seek forward (outside buffer) */
492 ret = g_seekable_seek (G_SEEKABLE (in), 6, G_SEEK_CUR, NULL, &error);
493 g_assert_no_error (error);
495 g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 8);
496 byte = g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error);
497 g_assert_no_error (error);
498 g_assert_cmpint (byte, ==, 'i');
499 g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 9);
501 /* Seek backward (outside buffer) */
502 ret = g_seekable_seek (G_SEEKABLE (in), -6, G_SEEK_CUR, NULL, &error);
503 g_assert_no_error (error);
505 g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 3);
506 byte = g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error);
507 g_assert_no_error (error);
508 g_assert_cmpint (byte, ==, 'd');
509 g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 4);
511 /* Seek from beginning */
512 ret = g_seekable_seek (G_SEEKABLE (in), 8, G_SEEK_SET, NULL, &error);
513 g_assert_no_error (error);
515 g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 8);
516 byte = g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error);
517 g_assert_no_error (error);
518 g_assert_cmpint (byte, ==, 'i');
519 g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 9);
522 ret = g_seekable_seek (G_SEEKABLE (in), -1, G_SEEK_END, NULL, &error);
523 g_assert_no_error (error);
525 g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 50);
526 byte = g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error);
527 g_assert_no_error (error);
528 g_assert_cmpint (byte, ==, 'Z');
529 g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 51);
533 g_object_unref (base);
540 g_test_init (&argc, &argv, NULL);
542 g_test_add_func ("/buffered-input-stream/peek", test_peek);
543 g_test_add_func ("/buffered-input-stream/peek-buffer", test_peek_buffer);
544 g_test_add_func ("/buffered-input-stream/set-buffer-size", test_set_buffer_size);
545 g_test_add_func ("/buffered-input-stream/read-byte", test_read_byte);
546 g_test_add_func ("/buffered-input-stream/read", test_read);
547 g_test_add_func ("/buffered-input-stream/read-async", test_read_async);
548 g_test_add_func ("/buffered-input-stream/skip", test_skip);
549 g_test_add_func ("/buffered-input-stream/skip-async", test_skip_async);
550 g_test_add_func ("/buffered-input-stream/seek", test_seek);
551 g_test_add_func ("/filter-input-stream/close", test_close);