Branch data Line data Source code
1 : : /* GLib testing framework examples and tests
2 : : * Copyright (C) 2008 Red Hat, Inc.
3 : : * Authors: Matthias Clasen <mclasen@redhat.com>
4 : : *
5 : : * SPDX-License-Identifier: LicenseRef-old-glib-tests
6 : : *
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.
10 : : *
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.
14 : : *
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.
23 : : */
24 : :
25 : : #include <glib/glib.h>
26 : : #include <gio/gio.h>
27 : : #include <stdlib.h>
28 : : #include <string.h>
29 : :
30 : : static void
31 : 1 : test_peek (void)
32 : : {
33 : : GInputStream *base;
34 : : GInputStream *in;
35 : : gssize npeek;
36 : : char *buffer;
37 : :
38 : 1 : base = g_memory_input_stream_new_from_data ("abcdefghijk", -1, NULL);
39 : 1 : in = g_buffered_input_stream_new_sized (base, 64);
40 : :
41 : 1 : g_buffered_input_stream_fill (G_BUFFERED_INPUT_STREAM (in), 5, NULL, NULL);
42 : 1 : g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 5);
43 : 1 : g_buffered_input_stream_fill (G_BUFFERED_INPUT_STREAM (in), -1, NULL, NULL);
44 : 1 : g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, strlen ("abcdefjhijk"));
45 : :
46 : 1 : buffer = g_new0 (char, 64);
47 : 1 : npeek = g_buffered_input_stream_peek (G_BUFFERED_INPUT_STREAM (in), buffer, 2, 3);
48 : 1 : g_assert_cmpint (npeek, ==, 3);
49 : 1 : g_assert_cmpstr ("cde", ==, buffer);
50 : 1 : g_free (buffer);
51 : :
52 : 1 : buffer = g_new0 (char, 64);
53 : 1 : npeek = g_buffered_input_stream_peek (G_BUFFERED_INPUT_STREAM (in), buffer, 9, 5);
54 : 1 : g_assert_cmpint (npeek, ==, 2);
55 : 1 : g_assert_cmpstr ("jk", ==, buffer);
56 : 1 : g_free (buffer);
57 : :
58 : 1 : buffer = g_new0 (char, 64);
59 : 1 : npeek = g_buffered_input_stream_peek (G_BUFFERED_INPUT_STREAM (in), buffer, 75, 3);
60 : 1 : g_assert_cmpint (npeek, ==, 0);
61 : 1 : g_free (buffer);
62 : :
63 : 1 : buffer = g_new0 (char, 64);
64 : 1 : npeek = g_buffered_input_stream_peek (G_BUFFERED_INPUT_STREAM (in), buffer, 8, 0);
65 : 1 : g_assert_cmpint (npeek, ==, 0);
66 : 1 : g_free (buffer);
67 : :
68 : 1 : buffer = g_new0 (char, 64);
69 : 1 : npeek = g_buffered_input_stream_peek (G_BUFFERED_INPUT_STREAM (in), buffer, 5, G_MAXSIZE);
70 : 1 : g_assert_cmpint (npeek, ==, 0);
71 : 1 : g_free (buffer);
72 : :
73 : 1 : g_object_unref (in);
74 : 1 : g_object_unref (base);
75 : 1 : }
76 : :
77 : : static void
78 : 1 : test_peek_buffer (void)
79 : : {
80 : : GInputStream *base;
81 : : GInputStream *in;
82 : : gssize nfill;
83 : : gsize bufsize;
84 : : char *buffer;
85 : :
86 : 1 : base = g_memory_input_stream_new_from_data ("abcdefghijk", -1, NULL);
87 : 1 : in = g_buffered_input_stream_new (base);
88 : :
89 : 1 : nfill = g_buffered_input_stream_fill (G_BUFFERED_INPUT_STREAM (in), strlen ("abcdefghijk"), NULL, NULL);
90 : 1 : buffer = (char *) g_buffered_input_stream_peek_buffer (G_BUFFERED_INPUT_STREAM (in), &bufsize);
91 : 1 : g_assert_cmpint (nfill, ==, bufsize);
92 : 1 : g_assert_cmpint (strncmp ("abcdefghijk", buffer, bufsize), ==, 0);
93 : :
94 : 1 : g_object_unref (in);
95 : 1 : g_object_unref (base);
96 : 1 : }
97 : :
98 : : static void
99 : 1 : test_set_buffer_size (void)
100 : : {
101 : : GInputStream *base;
102 : : GInputStream *in;
103 : : guint bufsize_prop;
104 : : gsize size, bufsize;
105 : :
106 : 1 : base = g_memory_input_stream_new_from_data ("abcdefghijk", -1, NULL);
107 : 1 : in = g_buffered_input_stream_new (base);
108 : 1 : size = g_buffered_input_stream_get_buffer_size (G_BUFFERED_INPUT_STREAM (in));
109 : 1 : g_assert_cmpint (size, ==, 4096);
110 : :
111 : 1 : g_buffered_input_stream_set_buffer_size (G_BUFFERED_INPUT_STREAM (in), 64);
112 : 1 : size = g_buffered_input_stream_get_buffer_size (G_BUFFERED_INPUT_STREAM (in));
113 : 1 : g_assert_cmpint (size, ==, 64);
114 : :
115 : : /* size cannot shrink below current content len */
116 : 1 : g_buffered_input_stream_fill (G_BUFFERED_INPUT_STREAM (in), strlen ("abcdefghijk"), NULL, NULL);
117 : 1 : g_buffered_input_stream_peek_buffer (G_BUFFERED_INPUT_STREAM (in), &bufsize);
118 : 1 : g_buffered_input_stream_set_buffer_size (G_BUFFERED_INPUT_STREAM (in), 2);
119 : 1 : size = g_buffered_input_stream_get_buffer_size (G_BUFFERED_INPUT_STREAM (in));
120 : 1 : g_assert_cmpint (size, ==, bufsize);
121 : 1 : g_object_get (in, "buffer-size", &bufsize_prop, NULL);
122 : 1 : g_assert_cmpint (bufsize_prop, ==, bufsize);
123 : :
124 : 1 : g_object_unref (in);
125 : :
126 : 1 : in = g_buffered_input_stream_new_sized (base, 64);
127 : 1 : size = g_buffered_input_stream_get_buffer_size (G_BUFFERED_INPUT_STREAM (in));
128 : 1 : g_assert_cmpint (size, ==, 64);
129 : :
130 : 1 : g_object_unref (in);
131 : 1 : g_object_unref (base);
132 : 1 : }
133 : :
134 : : static void
135 : 1 : test_read_byte (void)
136 : : {
137 : : GInputStream *base;
138 : : GInputStream *in;
139 : : GError *error;
140 : :
141 : 1 : g_test_bug ("https://bugzilla.gnome.org/show_bug.cgi?id=562393");
142 : :
143 : 1 : base = g_memory_input_stream_new_from_data ("abcdefgh", -1, NULL);
144 : 1 : in = g_buffered_input_stream_new (base);
145 : :
146 : 1 : error = NULL;
147 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'a');
148 : 1 : g_assert_no_error (error);
149 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'b');
150 : 1 : g_assert_no_error (error);
151 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'c');
152 : 1 : g_assert_no_error (error);
153 : :
154 : 1 : g_assert_cmpint (g_input_stream_skip (in, 3, NULL, &error), ==, 3);
155 : 1 : g_assert_no_error (error);
156 : :
157 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'g');
158 : 1 : g_assert_no_error (error);
159 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'h');
160 : 1 : g_assert_no_error (error);
161 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, -1);
162 : 1 : g_assert_no_error (error);
163 : :
164 : 1 : g_input_stream_close (in, NULL, &error);
165 : 1 : g_assert_no_error (error);
166 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, -1);
167 : 1 : g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CLOSED);
168 : 1 : g_error_free (error);
169 : :
170 : 1 : g_object_unref (in);
171 : 1 : g_object_unref (base);
172 : 1 : }
173 : :
174 : : static void
175 : 1 : test_read (void)
176 : : {
177 : : GInputStream *base;
178 : : GInputStream *in;
179 : : gchar buffer[20];
180 : : GError *error;
181 : :
182 : 1 : base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", -1, NULL);
183 : 1 : in = g_buffered_input_stream_new_sized (base, 8);
184 : :
185 : 1 : g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 0);
186 : :
187 : 1 : error = NULL;
188 : 1 : g_assert_cmpint (g_buffered_input_stream_fill (G_BUFFERED_INPUT_STREAM (in), 8, NULL, &error), ==, 8);
189 : 1 : g_assert_no_error (error);
190 : :
191 : 1 : g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 8);
192 : :
193 : 1 : memset (buffer, 0, 20);
194 : 1 : g_assert_cmpint (g_input_stream_read (in, &buffer, 16, NULL, &error), ==, 16);
195 : 1 : g_assert_cmpstr (buffer, ==, "abcdefghijklmnop");
196 : 1 : g_assert_no_error (error);
197 : :
198 : 1 : g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 0);
199 : :
200 : 1 : memset (buffer, 0, 20);
201 : 1 : g_assert_cmpint (g_input_stream_read (in, &buffer, 16, NULL, &error), ==, 16);
202 : 1 : g_assert_cmpstr (buffer, ==, "qrstuvwxyzABCDEF");
203 : 1 : g_assert_no_error (error);
204 : :
205 : 1 : memset (buffer, 0, 20);
206 : 1 : g_assert_cmpint (g_input_stream_read (in, &buffer, 16, NULL, &error), ==, 16);
207 : 1 : g_assert_cmpstr (buffer, ==, "GHIJKLMNOPQRSTUV");
208 : 1 : g_assert_no_error (error);
209 : :
210 : 1 : memset (buffer, 0, 20);
211 : 1 : g_assert_cmpint (g_input_stream_read (in, &buffer, 16, NULL, &error), ==, 4);
212 : 1 : g_assert_cmpstr (buffer, ==, "WXYZ");
213 : 1 : g_assert_no_error (error);
214 : :
215 : 1 : memset (buffer, 0, 20);
216 : 1 : g_assert_cmpint (g_input_stream_read (in, &buffer, 16, NULL, &error), ==, 0);
217 : 1 : g_assert_no_error (error);
218 : :
219 : 1 : g_object_unref (in);
220 : 1 : g_object_unref (base);
221 : 1 : }
222 : :
223 : : static void
224 : 11 : return_result_cb (GObject *object,
225 : : GAsyncResult *result,
226 : : gpointer user_data)
227 : : {
228 : 11 : GAsyncResult **ret = user_data;
229 : :
230 : 11 : *ret = g_object_ref (result);
231 : 11 : }
232 : :
233 : : static void
234 : 1 : test_read_async (void)
235 : : {
236 : : GInputStream *base;
237 : : GInputStream *in;
238 : : gchar buffer[20];
239 : : GError *error;
240 : : GAsyncResult *result;
241 : :
242 : 1 : base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", -1, NULL);
243 : 1 : in = g_buffered_input_stream_new_sized (base, 8);
244 : :
245 : 1 : g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 0);
246 : :
247 : 1 : error = NULL;
248 : 1 : result = NULL;
249 : 1 : g_buffered_input_stream_fill_async (G_BUFFERED_INPUT_STREAM (in), 8,
250 : : G_PRIORITY_DEFAULT, NULL,
251 : : return_result_cb, &result);
252 : 2 : while (!result)
253 : 1 : g_main_context_iteration (NULL, TRUE);
254 : 1 : g_assert_cmpint (g_buffered_input_stream_fill_finish (G_BUFFERED_INPUT_STREAM (in), result, &error), ==, 8);
255 : 1 : g_assert_no_error (error);
256 : 1 : g_clear_object (&result);
257 : :
258 : 1 : g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 8);
259 : :
260 : 1 : memset (buffer, 0, 20);
261 : 1 : g_input_stream_read_async (in, &buffer, 16, G_PRIORITY_DEFAULT,
262 : : NULL, return_result_cb, &result);
263 : 2 : while (!result)
264 : 1 : g_main_context_iteration (NULL, TRUE);
265 : 1 : g_assert_cmpint (g_input_stream_read_finish (in, result, &error), ==, 16);
266 : 1 : g_assert_cmpstr (buffer, ==, "abcdefghijklmnop");
267 : 1 : g_assert_no_error (error);
268 : 1 : g_clear_object (&result);
269 : :
270 : 1 : g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 0);
271 : :
272 : 1 : memset (buffer, 0, 20);
273 : 1 : g_input_stream_read_async (in, &buffer, 16, G_PRIORITY_DEFAULT,
274 : : NULL, return_result_cb, &result);
275 : 2 : while (!result)
276 : 1 : g_main_context_iteration (NULL, TRUE);
277 : 1 : g_assert_cmpint (g_input_stream_read_finish (in, result, &error), ==, 16);
278 : 1 : g_assert_cmpstr (buffer, ==, "qrstuvwxyzABCDEF");
279 : 1 : g_assert_no_error (error);
280 : 1 : g_clear_object (&result);
281 : :
282 : 1 : memset (buffer, 0, 20);
283 : 1 : g_input_stream_read_async (in, &buffer, 16, G_PRIORITY_DEFAULT,
284 : : NULL, return_result_cb, &result);
285 : 2 : while (!result)
286 : 1 : g_main_context_iteration (NULL, TRUE);
287 : 1 : g_assert_cmpint (g_input_stream_read_finish (in, result, &error), ==, 16);
288 : 1 : g_assert_cmpstr (buffer, ==, "GHIJKLMNOPQRSTUV");
289 : 1 : g_assert_no_error (error);
290 : 1 : g_clear_object (&result);
291 : :
292 : 1 : memset (buffer, 0, 20);
293 : 1 : g_input_stream_read_async (in, &buffer, 16, G_PRIORITY_DEFAULT,
294 : : NULL, return_result_cb, &result);
295 : 2 : while (!result)
296 : 1 : g_main_context_iteration (NULL, TRUE);
297 : 1 : g_assert_cmpint (g_input_stream_read_finish (in, result, &error), ==, 4);
298 : 1 : g_assert_cmpstr (buffer, ==, "WXYZ");
299 : 1 : g_assert_no_error (error);
300 : 1 : g_clear_object (&result);
301 : :
302 : 1 : memset (buffer, 0, 20);
303 : 1 : g_input_stream_read_async (in, &buffer, 16, G_PRIORITY_DEFAULT,
304 : : NULL, return_result_cb, &result);
305 : 2 : while (!result)
306 : 1 : g_main_context_iteration (NULL, TRUE);
307 : 1 : g_assert_cmpint (g_input_stream_read_finish (in, result, &error), ==, 0);
308 : 1 : g_assert_no_error (error);
309 : 1 : g_clear_object (&result);
310 : :
311 : 1 : g_object_unref (in);
312 : 1 : g_object_unref (base);
313 : 1 : }
314 : :
315 : : static void
316 : 1 : test_skip (void)
317 : : {
318 : : GInputStream *base;
319 : : GInputStream *in;
320 : : GError *error;
321 : :
322 : 1 : base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ", -1, NULL);
323 : 1 : in = g_buffered_input_stream_new_sized (base, 5);
324 : :
325 : 1 : error = NULL;
326 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'a');
327 : 1 : g_assert_no_error (error);
328 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'b');
329 : 1 : g_assert_no_error (error);
330 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'c');
331 : 1 : g_assert_no_error (error);
332 : :
333 : 1 : g_assert_cmpint (g_input_stream_skip (in, 7, NULL, &error), ==, 7);
334 : 1 : g_assert_no_error (error);
335 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'k');
336 : 1 : g_assert_no_error (error);
337 : :
338 : 1 : g_assert_cmpint (g_input_stream_skip (in, 10, NULL, &error), ==, 10);
339 : 1 : g_assert_no_error (error);
340 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'v');
341 : 1 : g_assert_no_error (error);
342 : :
343 : 1 : g_assert_cmpint (g_input_stream_skip (in, 20, NULL, &error), ==, 20);
344 : 1 : g_assert_no_error (error);
345 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'Q');
346 : 1 : g_assert_no_error (error);
347 : :
348 : 1 : g_assert_cmpint (g_input_stream_skip (in, 10, NULL, &error), ==, 8);
349 : 1 : g_assert_no_error (error);
350 : 1 : g_assert_cmpint (g_input_stream_skip (in, 10, NULL, &error), ==, 0);
351 : 1 : g_assert_no_error (error);
352 : :
353 : 1 : g_object_unref (in);
354 : 1 : g_object_unref (base);
355 : 1 : }
356 : :
357 : : static void
358 : 1 : test_skip_async (void)
359 : : {
360 : : GInputStream *base;
361 : : GInputStream *in;
362 : : GError *error;
363 : : GAsyncResult *result;
364 : :
365 : 1 : base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ", -1, NULL);
366 : 1 : in = g_buffered_input_stream_new_sized (base, 5);
367 : :
368 : 1 : error = NULL;
369 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'a');
370 : 1 : g_assert_no_error (error);
371 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'b');
372 : 1 : g_assert_no_error (error);
373 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'c');
374 : 1 : g_assert_no_error (error);
375 : :
376 : 1 : result = NULL;
377 : 1 : g_input_stream_skip_async (in, 7, G_PRIORITY_DEFAULT,
378 : : NULL, return_result_cb, &result);
379 : 2 : while (!result)
380 : 1 : g_main_context_iteration (NULL, TRUE);
381 : 1 : g_assert_cmpint (g_input_stream_skip_finish (in, result, &error), ==, 7);
382 : 1 : g_assert_no_error (error);
383 : 1 : g_clear_object (&result);
384 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'k');
385 : 1 : g_assert_no_error (error);
386 : :
387 : 1 : g_input_stream_skip_async (in, 10, G_PRIORITY_DEFAULT,
388 : : NULL, return_result_cb, &result);
389 : 2 : while (!result)
390 : 1 : g_main_context_iteration (NULL, TRUE);
391 : 1 : g_assert_cmpint (g_input_stream_skip_finish (in, result, &error), ==, 10);
392 : 1 : g_assert_no_error (error);
393 : 1 : g_clear_object (&result);
394 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'v');
395 : 1 : g_assert_no_error (error);
396 : :
397 : 1 : g_input_stream_skip_async (in, 20, G_PRIORITY_DEFAULT,
398 : : NULL, return_result_cb, &result);
399 : 2 : while (!result)
400 : 1 : g_main_context_iteration (NULL, TRUE);
401 : 1 : g_assert_cmpint (g_input_stream_skip_finish (in, result, &error), ==, 20);
402 : 1 : g_assert_no_error (error);
403 : 1 : g_clear_object (&result);
404 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'Q');
405 : 1 : g_assert_no_error (error);
406 : :
407 : 1 : g_input_stream_skip_async (in, 10, G_PRIORITY_DEFAULT,
408 : : NULL, return_result_cb, &result);
409 : 2 : while (!result)
410 : 1 : g_main_context_iteration (NULL, TRUE);
411 : 1 : g_assert_cmpint (g_input_stream_skip_finish (in, result, &error), ==, 8);
412 : 1 : g_clear_object (&result);
413 : 1 : g_assert_no_error (error);
414 : :
415 : 1 : g_input_stream_skip_async (in, 10, G_PRIORITY_DEFAULT,
416 : : NULL, return_result_cb, &result);
417 : 2 : while (!result)
418 : 1 : g_main_context_iteration (NULL, TRUE);
419 : 1 : g_assert_cmpint (g_input_stream_skip_finish (in, result, &error), ==, 0);
420 : 1 : g_clear_object (&result);
421 : 1 : g_assert_no_error (error);
422 : :
423 : 1 : g_object_unref (in);
424 : 1 : g_object_unref (base);
425 : 1 : }
426 : :
427 : : static void
428 : 1 : test_close (void)
429 : : {
430 : : GInputStream *base;
431 : : GInputStream *in;
432 : : GError *error;
433 : :
434 : 1 : base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ", -1, NULL);
435 : 1 : in = g_buffered_input_stream_new (base);
436 : :
437 : 1 : g_assert_true (g_filter_input_stream_get_close_base_stream (G_FILTER_INPUT_STREAM (in)));
438 : :
439 : 1 : error = NULL;
440 : 1 : g_input_stream_close (in, NULL, &error);
441 : 1 : g_assert_no_error (error);
442 : 1 : g_assert_true (g_input_stream_is_closed (base));
443 : :
444 : 1 : g_object_unref (in);
445 : 1 : g_object_unref (base);
446 : :
447 : 1 : base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ", -1, NULL);
448 : 1 : in = g_buffered_input_stream_new (base);
449 : :
450 : 1 : g_filter_input_stream_set_close_base_stream (G_FILTER_INPUT_STREAM (in), FALSE);
451 : :
452 : 1 : error = NULL;
453 : 1 : g_input_stream_close (in, NULL, &error);
454 : 1 : g_assert_no_error (error);
455 : 1 : g_assert_false (g_input_stream_is_closed (base));
456 : :
457 : 1 : g_object_unref (in);
458 : 1 : g_object_unref (base);
459 : 1 : }
460 : :
461 : : static void
462 : 1 : test_seek (void)
463 : : {
464 : : GInputStream *base;
465 : : GInputStream *in;
466 : : GError *error;
467 : : gint byte;
468 : : gboolean ret;
469 : :
470 : 1 : base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ", -1, NULL);
471 : 1 : in = g_buffered_input_stream_new_sized (base, 4);
472 : 1 : error = NULL;
473 : :
474 : : /* Seek by read */
475 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 0);
476 : 1 : byte = g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error);
477 : 1 : g_assert_no_error (error);
478 : 1 : g_assert_cmpint (byte, ==, 'a');
479 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 1);
480 : :
481 : : /* Seek forward (in buffer) */
482 : 1 : ret = g_seekable_seek (G_SEEKABLE (in), 1, G_SEEK_CUR, NULL, &error);
483 : 1 : g_assert_no_error (error);
484 : 1 : g_assert_true (ret);
485 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 2);
486 : 1 : byte = g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error);
487 : 1 : g_assert_no_error (error);
488 : 1 : g_assert_cmpint (byte, ==, 'c');
489 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 3);
490 : :
491 : : /* Seek backward (in buffer) */
492 : 1 : ret = g_seekable_seek (G_SEEKABLE (in), -2, G_SEEK_CUR, NULL, &error);
493 : 1 : g_assert_no_error (error);
494 : 1 : g_assert_true (ret);
495 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 1);
496 : 1 : byte = g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error);
497 : 1 : g_assert_no_error (error);
498 : 1 : g_assert_cmpint (byte, ==, 'b');
499 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 2);
500 : :
501 : : /* Seek forward (outside buffer) */
502 : 1 : ret = g_seekable_seek (G_SEEKABLE (in), 6, G_SEEK_CUR, NULL, &error);
503 : 1 : g_assert_no_error (error);
504 : 1 : g_assert_true (ret);
505 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 8);
506 : 1 : byte = g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error);
507 : 1 : g_assert_no_error (error);
508 : 1 : g_assert_cmpint (byte, ==, 'i');
509 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 9);
510 : :
511 : : /* Seek backward (outside buffer) */
512 : 1 : ret = g_seekable_seek (G_SEEKABLE (in), -6, G_SEEK_CUR, NULL, &error);
513 : 1 : g_assert_no_error (error);
514 : 1 : g_assert_true (ret);
515 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 3);
516 : 1 : byte = g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error);
517 : 1 : g_assert_no_error (error);
518 : 1 : g_assert_cmpint (byte, ==, 'd');
519 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 4);
520 : :
521 : : /* Seek from beginning */
522 : 1 : ret = g_seekable_seek (G_SEEKABLE (in), 8, G_SEEK_SET, NULL, &error);
523 : 1 : g_assert_no_error (error);
524 : 1 : g_assert_true (ret);
525 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 8);
526 : 1 : byte = g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error);
527 : 1 : g_assert_no_error (error);
528 : 1 : g_assert_cmpint (byte, ==, 'i');
529 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 9);
530 : :
531 : : /* Seek from end */
532 : 1 : ret = g_seekable_seek (G_SEEKABLE (in), -1, G_SEEK_END, NULL, &error);
533 : 1 : g_assert_no_error (error);
534 : 1 : g_assert_true (ret);
535 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 50);
536 : 1 : byte = g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error);
537 : 1 : g_assert_no_error (error);
538 : 1 : g_assert_cmpint (byte, ==, 'Z');
539 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 51);
540 : :
541 : : /* Cleanup */
542 : 1 : g_object_unref (in);
543 : 1 : g_object_unref (base);
544 : 1 : }
545 : :
546 : : int
547 : 1 : main (int argc,
548 : : char *argv[])
549 : : {
550 : 1 : g_test_init (&argc, &argv, NULL);
551 : :
552 : 1 : g_test_add_func ("/buffered-input-stream/peek", test_peek);
553 : 1 : g_test_add_func ("/buffered-input-stream/peek-buffer", test_peek_buffer);
554 : 1 : g_test_add_func ("/buffered-input-stream/set-buffer-size", test_set_buffer_size);
555 : 1 : g_test_add_func ("/buffered-input-stream/read-byte", test_read_byte);
556 : 1 : g_test_add_func ("/buffered-input-stream/read", test_read);
557 : 1 : g_test_add_func ("/buffered-input-stream/read-async", test_read_async);
558 : 1 : g_test_add_func ("/buffered-input-stream/skip", test_skip);
559 : 1 : g_test_add_func ("/buffered-input-stream/skip-async", test_skip_async);
560 : 1 : g_test_add_func ("/buffered-input-stream/seek", test_seek);
561 : 1 : g_test_add_func ("/filter-input-stream/close", test_close);
562 : :
563 : 1 : return g_test_run();
564 : : }
|