(root)/
glib-2.79.0/
gio/
tests/
buffered-input-stream.c
       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  test_peek (void)
      32  {
      33    GInputStream *base;
      34    GInputStream *in;
      35    gssize npeek;
      36    char *buffer;
      37  
      38    base = g_memory_input_stream_new_from_data ("abcdefghijk", -1, NULL);
      39    in = g_buffered_input_stream_new_sized (base, 64);
      40  
      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"));
      45  
      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);
      50    g_free (buffer);
      51  
      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);
      56    g_free (buffer);
      57  
      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);
      61    g_free (buffer);
      62  
      63    g_object_unref (in);
      64    g_object_unref (base);
      65  }
      66  
      67  static void
      68  test_peek_buffer (void)
      69  {
      70    GInputStream *base;
      71    GInputStream *in;
      72    gssize nfill;
      73    gsize bufsize;
      74    char *buffer;
      75  
      76    base = g_memory_input_stream_new_from_data ("abcdefghijk", -1, NULL);
      77    in = g_buffered_input_stream_new (base);
      78  
      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));
      83  
      84    g_object_unref (in);
      85    g_object_unref (base);
      86  }
      87  
      88  static void
      89  test_set_buffer_size (void)
      90  {
      91    GInputStream *base;
      92    GInputStream *in;
      93    guint bufsize_prop;
      94    gsize size, bufsize;
      95  
      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);
     100  
     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);
     104  
     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);
     113  
     114    g_object_unref (in);
     115  
     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);
     119  
     120    g_object_unref (in);
     121    g_object_unref (base);
     122  }
     123  
     124  static void
     125  test_read_byte (void)
     126  {
     127    GInputStream *base;
     128    GInputStream *in;
     129    GError *error;
     130  
     131    g_test_bug ("https://bugzilla.gnome.org/show_bug.cgi?id=562393");
     132  
     133    base = g_memory_input_stream_new_from_data ("abcdefgh", -1, NULL);
     134    in = g_buffered_input_stream_new (base);
     135  
     136    error = NULL;
     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);
     143  
     144    g_assert_cmpint (g_input_stream_skip (in, 3, NULL, &error), ==, 3);
     145    g_assert_no_error (error);
     146  
     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);
     153  
     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);
     159  
     160    g_object_unref (in);
     161    g_object_unref (base);
     162  }
     163  
     164  static void
     165  test_read (void)
     166  {
     167    GInputStream *base;
     168    GInputStream *in;
     169    gchar buffer[20];
     170    GError *error;
     171  
     172    base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", -1, NULL);
     173    in = g_buffered_input_stream_new_sized (base, 8);
     174  
     175    g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 0);
     176  
     177    error = NULL;
     178    g_assert_cmpint (g_buffered_input_stream_fill (G_BUFFERED_INPUT_STREAM (in), 8, NULL, &error), ==, 8);
     179    g_assert_no_error (error);
     180  
     181    g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 8);
     182  
     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);
     187  
     188    g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 0);
     189  
     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);
     194  
     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);
     199  
     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);
     204  
     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);
     208  
     209    g_object_unref (in);
     210    g_object_unref (base);
     211  }
     212  
     213  static void
     214  return_result_cb (GObject      *object,
     215                    GAsyncResult *result,
     216                    gpointer      user_data)
     217  {
     218    GAsyncResult **ret = user_data;
     219  
     220    *ret = g_object_ref (result);
     221  }
     222  
     223  static void
     224  test_read_async (void)
     225  {
     226    GInputStream *base;
     227    GInputStream *in;
     228    gchar buffer[20];
     229    GError *error;
     230    GAsyncResult *result;
     231  
     232    base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", -1, NULL);
     233    in = g_buffered_input_stream_new_sized (base, 8);
     234  
     235    g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 0);
     236  
     237    error = NULL;
     238    result = NULL;
     239    g_buffered_input_stream_fill_async (G_BUFFERED_INPUT_STREAM (in), 8,
     240                                        G_PRIORITY_DEFAULT, NULL,
     241                                        return_result_cb, &result);
     242    while (!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);
     247  
     248    g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 8);
     249  
     250    memset (buffer, 0, 20);
     251    g_input_stream_read_async (in, &buffer, 16, G_PRIORITY_DEFAULT,
     252                               NULL, return_result_cb, &result);
     253    while (!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);
     259  
     260    g_assert_cmpint (g_buffered_input_stream_get_available (G_BUFFERED_INPUT_STREAM (in)), ==, 0);
     261  
     262    memset (buffer, 0, 20);
     263    g_input_stream_read_async (in, &buffer, 16, G_PRIORITY_DEFAULT,
     264                               NULL, return_result_cb, &result);
     265    while (!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);
     271  
     272    memset (buffer, 0, 20);
     273    g_input_stream_read_async (in, &buffer, 16, G_PRIORITY_DEFAULT,
     274                               NULL, return_result_cb, &result);
     275    while (!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);
     281  
     282    memset (buffer, 0, 20);
     283    g_input_stream_read_async (in, &buffer, 16, G_PRIORITY_DEFAULT,
     284                               NULL, return_result_cb, &result);
     285    while (!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);
     291  
     292    memset (buffer, 0, 20);
     293    g_input_stream_read_async (in, &buffer, 16, G_PRIORITY_DEFAULT,
     294                               NULL, return_result_cb, &result);
     295    while (!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);
     300  
     301    g_object_unref (in);
     302    g_object_unref (base);
     303  }
     304  
     305  static void
     306  test_skip (void)
     307  {
     308    GInputStream *base;
     309    GInputStream *in;
     310    GError *error;
     311  
     312    base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ", -1, NULL);
     313    in = g_buffered_input_stream_new_sized (base, 5);
     314  
     315    error = NULL;
     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);
     322  
     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);
     327  
     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);
     332  
     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);
     337  
     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);
     342  
     343    g_object_unref (in);
     344    g_object_unref (base);
     345  }
     346  
     347  static void
     348  test_skip_async (void)
     349  {
     350    GInputStream *base;
     351    GInputStream *in;
     352    GError *error;
     353    GAsyncResult *result;
     354  
     355    base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ", -1, NULL);
     356    in = g_buffered_input_stream_new_sized (base, 5);
     357  
     358    error = NULL;
     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);
     365  
     366    result = NULL;
     367    g_input_stream_skip_async (in, 7, G_PRIORITY_DEFAULT,
     368                               NULL, return_result_cb, &result);
     369    while (!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);
     376  
     377    g_input_stream_skip_async (in, 10, G_PRIORITY_DEFAULT,
     378                               NULL, return_result_cb, &result);
     379    while (!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);
     386  
     387    g_input_stream_skip_async (in, 20, G_PRIORITY_DEFAULT,
     388                               NULL, return_result_cb, &result);
     389    while (!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);
     396  
     397    g_input_stream_skip_async (in, 10, G_PRIORITY_DEFAULT,
     398                               NULL, return_result_cb, &result);
     399    while (!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);
     404  
     405    g_input_stream_skip_async (in, 10, G_PRIORITY_DEFAULT,
     406                               NULL, return_result_cb, &result);
     407    while (!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);
     412  
     413    g_object_unref (in);
     414    g_object_unref (base);
     415  }
     416  
     417  static void
     418  test_close (void)
     419  {
     420    GInputStream *base;
     421    GInputStream *in;
     422    GError *error;
     423  
     424    base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ", -1, NULL);
     425    in = g_buffered_input_stream_new (base);
     426  
     427    g_assert (g_filter_input_stream_get_close_base_stream (G_FILTER_INPUT_STREAM (in)));
     428  
     429    error = NULL;
     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));
     433  
     434    g_object_unref (in);
     435    g_object_unref (base);
     436  
     437    base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ", -1, NULL);
     438    in = g_buffered_input_stream_new (base);
     439  
     440    g_filter_input_stream_set_close_base_stream (G_FILTER_INPUT_STREAM (in), FALSE);
     441  
     442    error = NULL;
     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));
     446  
     447    g_object_unref (in);
     448    g_object_unref (base);
     449  }
     450  
     451  static void
     452  test_seek (void)
     453  {
     454    GInputStream *base;
     455    GInputStream *in;
     456    GError *error;
     457    gint byte;
     458    gboolean ret;
     459  
     460    base = g_memory_input_stream_new_from_data ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYZ", -1, NULL);
     461    in = g_buffered_input_stream_new_sized (base, 4);
     462    error = NULL;
     463  
     464    /* Seek by read */
     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);
     470  
     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);
     474    g_assert (ret);
     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);
     480  
     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);
     484    g_assert (ret);
     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);
     490  
     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);
     494    g_assert (ret);
     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);
     500  
     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);
     504    g_assert (ret);
     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);
     510  
     511    /* Seek from beginning */
     512    ret = g_seekable_seek (G_SEEKABLE (in), 8, G_SEEK_SET, NULL, &error);
     513    g_assert_no_error (error);
     514    g_assert (ret);
     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);
     520  
     521    /* Seek from end */
     522    ret = g_seekable_seek (G_SEEKABLE (in), -1, G_SEEK_END, NULL, &error);
     523    g_assert_no_error (error);
     524    g_assert (ret);
     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);
     530  
     531    /* Cleanup */
     532    g_object_unref (in);
     533    g_object_unref (base);
     534  }
     535  
     536  int
     537  main (int   argc,
     538        char *argv[])
     539  {
     540    g_test_init (&argc, &argv, NULL);
     541  
     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);
     552  
     553    return g_test_run();
     554  }