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 : g_object_unref (in);
64 : 1 : g_object_unref (base);
65 : 1 : }
66 : :
67 : : static void
68 : 1 : test_peek_buffer (void)
69 : : {
70 : : GInputStream *base;
71 : : GInputStream *in;
72 : : gssize nfill;
73 : : gsize bufsize;
74 : : char *buffer;
75 : :
76 : 1 : base = g_memory_input_stream_new_from_data ("abcdefghijk", -1, NULL);
77 : 1 : in = g_buffered_input_stream_new (base);
78 : :
79 : 1 : nfill = g_buffered_input_stream_fill (G_BUFFERED_INPUT_STREAM (in), strlen ("abcdefghijk"), NULL, NULL);
80 : 1 : buffer = (char *) g_buffered_input_stream_peek_buffer (G_BUFFERED_INPUT_STREAM (in), &bufsize);
81 : 1 : g_assert_cmpint (nfill, ==, bufsize);
82 : 1 : g_assert (0 == strncmp ("abcdefghijk", buffer, bufsize));
83 : :
84 : 1 : g_object_unref (in);
85 : 1 : g_object_unref (base);
86 : 1 : }
87 : :
88 : : static void
89 : 1 : test_set_buffer_size (void)
90 : : {
91 : : GInputStream *base;
92 : : GInputStream *in;
93 : : guint bufsize_prop;
94 : : gsize size, bufsize;
95 : :
96 : 1 : base = g_memory_input_stream_new_from_data ("abcdefghijk", -1, NULL);
97 : 1 : in = g_buffered_input_stream_new (base);
98 : 1 : size = g_buffered_input_stream_get_buffer_size (G_BUFFERED_INPUT_STREAM (in));
99 : 1 : g_assert_cmpint (size, ==, 4096);
100 : :
101 : 1 : g_buffered_input_stream_set_buffer_size (G_BUFFERED_INPUT_STREAM (in), 64);
102 : 1 : size = g_buffered_input_stream_get_buffer_size (G_BUFFERED_INPUT_STREAM (in));
103 : 1 : g_assert_cmpint (size, ==, 64);
104 : :
105 : : /* size cannot shrink below current content len */
106 : 1 : g_buffered_input_stream_fill (G_BUFFERED_INPUT_STREAM (in), strlen ("abcdefghijk"), NULL, NULL);
107 : 1 : g_buffered_input_stream_peek_buffer (G_BUFFERED_INPUT_STREAM (in), &bufsize);
108 : 1 : g_buffered_input_stream_set_buffer_size (G_BUFFERED_INPUT_STREAM (in), 2);
109 : 1 : size = g_buffered_input_stream_get_buffer_size (G_BUFFERED_INPUT_STREAM (in));
110 : 1 : g_assert_cmpint (size, ==, bufsize);
111 : 1 : g_object_get (in, "buffer-size", &bufsize_prop, NULL);
112 : 1 : g_assert_cmpint (bufsize_prop, ==, bufsize);
113 : :
114 : 1 : g_object_unref (in);
115 : :
116 : 1 : in = g_buffered_input_stream_new_sized (base, 64);
117 : 1 : size = g_buffered_input_stream_get_buffer_size (G_BUFFERED_INPUT_STREAM (in));
118 : 1 : g_assert_cmpint (size, ==, 64);
119 : :
120 : 1 : g_object_unref (in);
121 : 1 : g_object_unref (base);
122 : 1 : }
123 : :
124 : : static void
125 : 1 : test_read_byte (void)
126 : : {
127 : : GInputStream *base;
128 : : GInputStream *in;
129 : : GError *error;
130 : :
131 : 1 : g_test_bug ("https://bugzilla.gnome.org/show_bug.cgi?id=562393");
132 : :
133 : 1 : base = g_memory_input_stream_new_from_data ("abcdefgh", -1, NULL);
134 : 1 : in = g_buffered_input_stream_new (base);
135 : :
136 : 1 : error = NULL;
137 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'a');
138 : 1 : g_assert_no_error (error);
139 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'b');
140 : 1 : g_assert_no_error (error);
141 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'c');
142 : 1 : g_assert_no_error (error);
143 : :
144 : 1 : g_assert_cmpint (g_input_stream_skip (in, 3, NULL, &error), ==, 3);
145 : 1 : g_assert_no_error (error);
146 : :
147 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'g');
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), ==, 'h');
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), ==, -1);
152 : 1 : g_assert_no_error (error);
153 : :
154 : 1 : g_assert (g_input_stream_close (in, NULL, &error));
155 : 1 : g_assert_no_error (error);
156 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, -1);
157 : 1 : g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CLOSED);
158 : 1 : g_error_free (error);
159 : :
160 : 1 : g_object_unref (in);
161 : 1 : g_object_unref (base);
162 : 1 : }
163 : :
164 : : static void
165 : 1 : test_read (void)
166 : : {
167 : : GInputStream *base;
168 : : GInputStream *in;
169 : : gchar buffer[20];
170 : : GError *error;
171 : :
172 : 1 : base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", -1, NULL);
173 : 1 : in = g_buffered_input_stream_new_sized (base, 8);
174 : :
175 : 1 : g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 0);
176 : :
177 : 1 : error = NULL;
178 : 1 : g_assert_cmpint (g_buffered_input_stream_fill (G_BUFFERED_INPUT_STREAM (in), 8, NULL, &error), ==, 8);
179 : 1 : g_assert_no_error (error);
180 : :
181 : 1 : g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 8);
182 : :
183 : 1 : memset (buffer, 0, 20);
184 : 1 : g_assert_cmpint (g_input_stream_read (in, &buffer, 16, NULL, &error), ==, 16);
185 : 1 : g_assert_cmpstr (buffer, ==, "abcdefghijklmnop");
186 : 1 : g_assert_no_error (error);
187 : :
188 : 1 : g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 0);
189 : :
190 : 1 : memset (buffer, 0, 20);
191 : 1 : g_assert_cmpint (g_input_stream_read (in, &buffer, 16, NULL, &error), ==, 16);
192 : 1 : g_assert_cmpstr (buffer, ==, "qrstuvwxyzABCDEF");
193 : 1 : g_assert_no_error (error);
194 : :
195 : 1 : memset (buffer, 0, 20);
196 : 1 : g_assert_cmpint (g_input_stream_read (in, &buffer, 16, NULL, &error), ==, 16);
197 : 1 : g_assert_cmpstr (buffer, ==, "GHIJKLMNOPQRSTUV");
198 : 1 : g_assert_no_error (error);
199 : :
200 : 1 : memset (buffer, 0, 20);
201 : 1 : g_assert_cmpint (g_input_stream_read (in, &buffer, 16, NULL, &error), ==, 4);
202 : 1 : g_assert_cmpstr (buffer, ==, "WXYZ");
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), ==, 0);
207 : 1 : g_assert_no_error (error);
208 : :
209 : 1 : g_object_unref (in);
210 : 1 : g_object_unref (base);
211 : 1 : }
212 : :
213 : : static void
214 : 11 : return_result_cb (GObject *object,
215 : : GAsyncResult *result,
216 : : gpointer user_data)
217 : : {
218 : 11 : GAsyncResult **ret = user_data;
219 : :
220 : 11 : *ret = g_object_ref (result);
221 : 11 : }
222 : :
223 : : static void
224 : 1 : test_read_async (void)
225 : : {
226 : : GInputStream *base;
227 : : GInputStream *in;
228 : : gchar buffer[20];
229 : : GError *error;
230 : : GAsyncResult *result;
231 : :
232 : 1 : base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", -1, NULL);
233 : 1 : in = g_buffered_input_stream_new_sized (base, 8);
234 : :
235 : 1 : g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 0);
236 : :
237 : 1 : error = NULL;
238 : 1 : result = NULL;
239 : 1 : g_buffered_input_stream_fill_async (G_BUFFERED_INPUT_STREAM (in), 8,
240 : : G_PRIORITY_DEFAULT, NULL,
241 : : return_result_cb, &result);
242 : 2 : while (!result)
243 : 1 : g_main_context_iteration (NULL, TRUE);
244 : 1 : g_assert_cmpint (g_buffered_input_stream_fill_finish (G_BUFFERED_INPUT_STREAM (in), result, &error), ==, 8);
245 : 1 : g_assert_no_error (error);
246 : 1 : g_clear_object (&result);
247 : :
248 : 1 : g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 8);
249 : :
250 : 1 : memset (buffer, 0, 20);
251 : 1 : g_input_stream_read_async (in, &buffer, 16, G_PRIORITY_DEFAULT,
252 : : NULL, return_result_cb, &result);
253 : 2 : while (!result)
254 : 1 : g_main_context_iteration (NULL, TRUE);
255 : 1 : g_assert_cmpint (g_input_stream_read_finish (in, result, &error), ==, 16);
256 : 1 : g_assert_cmpstr (buffer, ==, "abcdefghijklmnop");
257 : 1 : g_assert_no_error (error);
258 : 1 : g_clear_object (&result);
259 : :
260 : 1 : g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 0);
261 : :
262 : 1 : memset (buffer, 0, 20);
263 : 1 : g_input_stream_read_async (in, &buffer, 16, G_PRIORITY_DEFAULT,
264 : : NULL, return_result_cb, &result);
265 : 2 : while (!result)
266 : 1 : g_main_context_iteration (NULL, TRUE);
267 : 1 : g_assert_cmpint (g_input_stream_read_finish (in, result, &error), ==, 16);
268 : 1 : g_assert_cmpstr (buffer, ==, "qrstuvwxyzABCDEF");
269 : 1 : g_assert_no_error (error);
270 : 1 : g_clear_object (&result);
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, ==, "GHIJKLMNOPQRSTUV");
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), ==, 4);
288 : 1 : g_assert_cmpstr (buffer, ==, "WXYZ");
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), ==, 0);
298 : 1 : g_assert_no_error (error);
299 : 1 : g_clear_object (&result);
300 : :
301 : 1 : g_object_unref (in);
302 : 1 : g_object_unref (base);
303 : 1 : }
304 : :
305 : : static void
306 : 1 : test_skip (void)
307 : : {
308 : : GInputStream *base;
309 : : GInputStream *in;
310 : : GError *error;
311 : :
312 : 1 : base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ", -1, NULL);
313 : 1 : in = g_buffered_input_stream_new_sized (base, 5);
314 : :
315 : 1 : error = NULL;
316 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'a');
317 : 1 : g_assert_no_error (error);
318 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'b');
319 : 1 : g_assert_no_error (error);
320 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'c');
321 : 1 : g_assert_no_error (error);
322 : :
323 : 1 : g_assert_cmpint (g_input_stream_skip (in, 7, NULL, &error), ==, 7);
324 : 1 : g_assert_no_error (error);
325 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'k');
326 : 1 : g_assert_no_error (error);
327 : :
328 : 1 : g_assert_cmpint (g_input_stream_skip (in, 10, NULL, &error), ==, 10);
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), ==, 'v');
331 : 1 : g_assert_no_error (error);
332 : :
333 : 1 : g_assert_cmpint (g_input_stream_skip (in, 20, NULL, &error), ==, 20);
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), ==, 'Q');
336 : 1 : g_assert_no_error (error);
337 : :
338 : 1 : g_assert_cmpint (g_input_stream_skip (in, 10, NULL, &error), ==, 8);
339 : 1 : g_assert_no_error (error);
340 : 1 : g_assert_cmpint (g_input_stream_skip (in, 10, NULL, &error), ==, 0);
341 : 1 : g_assert_no_error (error);
342 : :
343 : 1 : g_object_unref (in);
344 : 1 : g_object_unref (base);
345 : 1 : }
346 : :
347 : : static void
348 : 1 : test_skip_async (void)
349 : : {
350 : : GInputStream *base;
351 : : GInputStream *in;
352 : : GError *error;
353 : : GAsyncResult *result;
354 : :
355 : 1 : base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ", -1, NULL);
356 : 1 : in = g_buffered_input_stream_new_sized (base, 5);
357 : :
358 : 1 : error = NULL;
359 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'a');
360 : 1 : g_assert_no_error (error);
361 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'b');
362 : 1 : g_assert_no_error (error);
363 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'c');
364 : 1 : g_assert_no_error (error);
365 : :
366 : 1 : result = NULL;
367 : 1 : g_input_stream_skip_async (in, 7, G_PRIORITY_DEFAULT,
368 : : NULL, return_result_cb, &result);
369 : 2 : while (!result)
370 : 1 : g_main_context_iteration (NULL, TRUE);
371 : 1 : g_assert_cmpint (g_input_stream_skip_finish (in, result, &error), ==, 7);
372 : 1 : g_assert_no_error (error);
373 : 1 : g_clear_object (&result);
374 : 1 : g_assert_cmpint (g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error), ==, 'k');
375 : 1 : g_assert_no_error (error);
376 : :
377 : 1 : g_input_stream_skip_async (in, 10, 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), ==, 10);
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), ==, 'v');
385 : 1 : g_assert_no_error (error);
386 : :
387 : 1 : g_input_stream_skip_async (in, 20, 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), ==, 20);
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), ==, 'Q');
395 : 1 : g_assert_no_error (error);
396 : :
397 : 1 : g_input_stream_skip_async (in, 10, 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), ==, 8);
402 : 1 : g_clear_object (&result);
403 : 1 : g_assert_no_error (error);
404 : :
405 : 1 : g_input_stream_skip_async (in, 10, G_PRIORITY_DEFAULT,
406 : : NULL, return_result_cb, &result);
407 : 2 : while (!result)
408 : 1 : g_main_context_iteration (NULL, TRUE);
409 : 1 : g_assert_cmpint (g_input_stream_skip_finish (in, result, &error), ==, 0);
410 : 1 : g_clear_object (&result);
411 : 1 : g_assert_no_error (error);
412 : :
413 : 1 : g_object_unref (in);
414 : 1 : g_object_unref (base);
415 : 1 : }
416 : :
417 : : static void
418 : 1 : test_close (void)
419 : : {
420 : : GInputStream *base;
421 : : GInputStream *in;
422 : : GError *error;
423 : :
424 : 1 : base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ", -1, NULL);
425 : 1 : in = g_buffered_input_stream_new (base);
426 : :
427 : 1 : g_assert (g_filter_input_stream_get_close_base_stream (G_FILTER_INPUT_STREAM (in)));
428 : :
429 : 1 : error = NULL;
430 : 1 : g_assert (g_input_stream_close (in, NULL, &error));
431 : 1 : g_assert_no_error (error);
432 : 1 : g_assert (g_input_stream_is_closed (base));
433 : :
434 : 1 : g_object_unref (in);
435 : 1 : g_object_unref (base);
436 : :
437 : 1 : base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ", -1, NULL);
438 : 1 : in = g_buffered_input_stream_new (base);
439 : :
440 : 1 : g_filter_input_stream_set_close_base_stream (G_FILTER_INPUT_STREAM (in), FALSE);
441 : :
442 : 1 : error = NULL;
443 : 1 : g_assert (g_input_stream_close (in, NULL, &error));
444 : 1 : g_assert_no_error (error);
445 : 1 : g_assert (!g_input_stream_is_closed (base));
446 : :
447 : 1 : g_object_unref (in);
448 : 1 : g_object_unref (base);
449 : 1 : }
450 : :
451 : : static void
452 : 1 : test_seek (void)
453 : : {
454 : : GInputStream *base;
455 : : GInputStream *in;
456 : : GError *error;
457 : : gint byte;
458 : : gboolean ret;
459 : :
460 : 1 : base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ", -1, NULL);
461 : 1 : in = g_buffered_input_stream_new_sized (base, 4);
462 : 1 : error = NULL;
463 : :
464 : : /* Seek by read */
465 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 0);
466 : 1 : byte = g_buffered_input_stream_read_byte (G_BUFFERED_INPUT_STREAM (in), NULL, &error);
467 : 1 : g_assert_no_error (error);
468 : 1 : g_assert_cmpint (byte, ==, 'a');
469 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 1);
470 : :
471 : : /* Seek forward (in buffer) */
472 : 1 : ret = g_seekable_seek (G_SEEKABLE (in), 1, G_SEEK_CUR, NULL, &error);
473 : 1 : g_assert_no_error (error);
474 : 1 : g_assert (ret);
475 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 2);
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, ==, 'c');
479 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 3);
480 : :
481 : : /* Seek backward (in buffer) */
482 : 1 : ret = g_seekable_seek (G_SEEKABLE (in), -2, G_SEEK_CUR, NULL, &error);
483 : 1 : g_assert_no_error (error);
484 : 1 : g_assert (ret);
485 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 1);
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, ==, 'b');
489 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 2);
490 : :
491 : : /* Seek forward (outside buffer) */
492 : 1 : ret = g_seekable_seek (G_SEEKABLE (in), 6, G_SEEK_CUR, NULL, &error);
493 : 1 : g_assert_no_error (error);
494 : 1 : g_assert (ret);
495 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 8);
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, ==, 'i');
499 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 9);
500 : :
501 : : /* Seek backward (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 (ret);
505 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 3);
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, ==, 'd');
509 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 4);
510 : :
511 : : /* Seek from beginning */
512 : 1 : ret = g_seekable_seek (G_SEEKABLE (in), 8, G_SEEK_SET, NULL, &error);
513 : 1 : g_assert_no_error (error);
514 : 1 : g_assert (ret);
515 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 8);
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, ==, 'i');
519 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 9);
520 : :
521 : : /* Seek from end */
522 : 1 : ret = g_seekable_seek (G_SEEKABLE (in), -1, G_SEEK_END, NULL, &error);
523 : 1 : g_assert_no_error (error);
524 : 1 : g_assert (ret);
525 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 50);
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, ==, 'Z');
529 : 1 : g_assert_cmpint (g_seekable_tell (G_SEEKABLE (in)), ==, 51);
530 : :
531 : : /* Cleanup */
532 : 1 : g_object_unref (in);
533 : 1 : g_object_unref (base);
534 : 1 : }
535 : :
536 : : int
537 : 1 : main (int argc,
538 : : char *argv[])
539 : : {
540 : 1 : g_test_init (&argc, &argv, NULL);
541 : :
542 : 1 : g_test_add_func ("/buffered-input-stream/peek", test_peek);
543 : 1 : g_test_add_func ("/buffered-input-stream/peek-buffer", test_peek_buffer);
544 : 1 : g_test_add_func ("/buffered-input-stream/set-buffer-size", test_set_buffer_size);
545 : 1 : g_test_add_func ("/buffered-input-stream/read-byte", test_read_byte);
546 : 1 : g_test_add_func ("/buffered-input-stream/read", test_read);
547 : 1 : g_test_add_func ("/buffered-input-stream/read-async", test_read_async);
548 : 1 : g_test_add_func ("/buffered-input-stream/skip", test_skip);
549 : 1 : g_test_add_func ("/buffered-input-stream/skip-async", test_skip_async);
550 : 1 : g_test_add_func ("/buffered-input-stream/seek", test_seek);
551 : 1 : g_test_add_func ("/filter-input-stream/close", test_close);
552 : :
553 : 1 : return g_test_run();
554 : : }
|