LCOV - code coverage report
Current view: top level - glib/gio/tests - buffered-output-stream.c (source / functions) Hit Total Coverage
Test: unnamed Lines: 224 224 100.0 %
Date: 2024-04-23 05:16:05 Functions: 6 6 100.0 %
Branches: 0 0 -

           Branch data     Line data    Source code
       1                 :            : #include <gio/gio.h>
       2                 :            : 
       3                 :            : static void
       4                 :          1 : test_write (void)
       5                 :            : {
       6                 :            :   GOutputStream *base;
       7                 :            :   GOutputStream *out;
       8                 :            :   GError *error;
       9                 :          1 :   const gchar buffer[] = "abcdefghijklmnopqrstuvwxyz";
      10                 :            : 
      11                 :          1 :   base = g_memory_output_stream_new (g_malloc0 (20), 20, NULL, g_free);
      12                 :          1 :   out = g_buffered_output_stream_new (base);
      13                 :            : 
      14                 :          1 :   g_assert_cmpint (g_buffered_output_stream_get_buffer_size (G_BUFFERED_OUTPUT_STREAM (out)), ==, 4096);
      15                 :          1 :   g_assert (!g_buffered_output_stream_get_auto_grow (G_BUFFERED_OUTPUT_STREAM (out)));
      16                 :          1 :   g_object_set (out, "auto-grow", TRUE, NULL);
      17                 :          1 :   g_assert (g_buffered_output_stream_get_auto_grow (G_BUFFERED_OUTPUT_STREAM (out)));
      18                 :          1 :   g_object_set (out, "auto-grow", FALSE, NULL);
      19                 :            : 
      20                 :          1 :   g_buffered_output_stream_set_buffer_size (G_BUFFERED_OUTPUT_STREAM (out), 16);
      21                 :          1 :   g_assert_cmpint (g_buffered_output_stream_get_buffer_size (G_BUFFERED_OUTPUT_STREAM (out)), ==, 16);
      22                 :            : 
      23                 :          1 :   error = NULL;
      24                 :          1 :   g_assert_cmpint (g_output_stream_write (out, buffer, 10, NULL, &error), ==, 10);
      25                 :          1 :   g_assert_no_error (error);
      26                 :            : 
      27                 :          1 :   g_assert_cmpint (g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (base)), ==, 0);
      28                 :            : 
      29                 :          1 :   g_assert_cmpint (g_output_stream_write (out, buffer + 10, 10, NULL, &error), ==, 6);
      30                 :          1 :   g_assert_no_error (error);
      31                 :            : 
      32                 :          1 :   g_assert_cmpint (g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (base)), ==, 0);
      33                 :          1 :   g_assert (g_output_stream_flush (out, NULL, &error));
      34                 :          1 :   g_assert_no_error (error);
      35                 :          1 :   g_assert_cmpint (g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (base)), ==, 16);
      36                 :            : 
      37                 :          1 :   g_assert_cmpstr (g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (base)), ==, "abcdefghijklmnop");
      38                 :            : 
      39                 :          1 :   g_object_unref (out);
      40                 :          1 :   g_object_unref (base);
      41                 :          1 : }
      42                 :            : 
      43                 :            : static void
      44                 :          1 : test_grow (void)
      45                 :            : {
      46                 :            :   GOutputStream *base;
      47                 :            :   GOutputStream *out;
      48                 :            :   GError *error;
      49                 :          1 :   const gchar buffer[] = "abcdefghijklmnopqrstuvwxyz";
      50                 :            :   gint size;
      51                 :            :   gboolean grow;
      52                 :            : 
      53                 :          1 :   base = g_memory_output_stream_new (g_malloc0 (30), 30, g_realloc, g_free);
      54                 :          1 :   out = g_buffered_output_stream_new_sized (base, 16);
      55                 :            : 
      56                 :          1 :   g_buffered_output_stream_set_auto_grow (G_BUFFERED_OUTPUT_STREAM (out), TRUE);
      57                 :            : 
      58                 :          1 :   g_object_get (out, "buffer-size", &size, "auto-grow", &grow, NULL);
      59                 :          1 :   g_assert_cmpint (size, ==, 16);
      60                 :          1 :   g_assert (grow);
      61                 :            : 
      62                 :          1 :   g_assert (g_seekable_can_seek (G_SEEKABLE (out)));
      63                 :            : 
      64                 :          1 :   error = NULL;
      65                 :          1 :   g_assert_cmpint (g_output_stream_write (out, buffer, 10, NULL, &error), ==, 10);
      66                 :          1 :   g_assert_no_error (error);
      67                 :            : 
      68                 :          1 :   g_assert_cmpint (g_buffered_output_stream_get_buffer_size (G_BUFFERED_OUTPUT_STREAM (out)), ==, 16);
      69                 :          1 :   g_assert_cmpint (g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (base)), ==, 0);
      70                 :            : 
      71                 :          1 :   g_assert_cmpint (g_output_stream_write (out, buffer + 10, 10, NULL, &error), ==, 10);
      72                 :          1 :   g_assert_no_error (error);
      73                 :            : 
      74                 :          1 :   g_assert_cmpint (g_buffered_output_stream_get_buffer_size (G_BUFFERED_OUTPUT_STREAM (out)), >=, 20);
      75                 :          1 :   g_assert_cmpint (g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (base)), ==, 0);
      76                 :            : 
      77                 :          1 :   g_assert (g_output_stream_flush (out, NULL, &error));
      78                 :          1 :   g_assert_no_error (error);
      79                 :            : 
      80                 :          1 :   g_assert_cmpstr (g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (base)), ==, "abcdefghijklmnopqrst");
      81                 :            : 
      82                 :          1 :   g_object_unref (out);
      83                 :          1 :   g_object_unref (base);
      84                 :          1 : }
      85                 :            : 
      86                 :            : static void
      87                 :          1 : test_close (void)
      88                 :            : {
      89                 :            :   GOutputStream *base;
      90                 :            :   GOutputStream *out;
      91                 :            :   GError *error;
      92                 :            : 
      93                 :          1 :   base = g_memory_output_stream_new (g_malloc0 (30), 30, g_realloc, g_free);
      94                 :          1 :   out = g_buffered_output_stream_new (base);
      95                 :            : 
      96                 :          1 :   g_assert (g_filter_output_stream_get_close_base_stream (G_FILTER_OUTPUT_STREAM (out)));
      97                 :            : 
      98                 :          1 :   error = NULL;
      99                 :          1 :   g_assert (g_output_stream_close (out, NULL, &error));
     100                 :          1 :   g_assert_no_error (error);
     101                 :          1 :   g_assert (g_output_stream_is_closed (base));
     102                 :            : 
     103                 :          1 :   g_object_unref (out);
     104                 :          1 :   g_object_unref (base);
     105                 :            : 
     106                 :          1 :   base = g_memory_output_stream_new (g_malloc0 (30), 30, g_realloc, g_free);
     107                 :          1 :   out = g_buffered_output_stream_new (base);
     108                 :            : 
     109                 :          1 :   g_filter_output_stream_set_close_base_stream (G_FILTER_OUTPUT_STREAM (out), FALSE);
     110                 :            : 
     111                 :          1 :   error = NULL;
     112                 :          1 :   g_assert (g_output_stream_close (out, NULL, &error));
     113                 :          1 :   g_assert_no_error (error);
     114                 :          1 :   g_assert (!g_output_stream_is_closed (base));
     115                 :            : 
     116                 :          1 :   g_object_unref (out);
     117                 :          1 :   g_object_unref (base);
     118                 :          1 : }
     119                 :            : 
     120                 :            : static void
     121                 :          1 : test_seek (void)
     122                 :            : {
     123                 :            :   GMemoryOutputStream *base;
     124                 :            :   GOutputStream *out;
     125                 :            :   GSeekable *seekable;
     126                 :            :   GError *error;
     127                 :            :   gsize bytes_written;
     128                 :            :   gboolean ret;
     129                 :          1 :   const gchar buffer[] = "abcdefghijklmnopqrstuvwxyz";
     130                 :            : 
     131                 :          1 :   base = G_MEMORY_OUTPUT_STREAM (g_memory_output_stream_new (g_malloc0 (30), 30, NULL, g_free));
     132                 :          1 :   out = g_buffered_output_stream_new_sized (G_OUTPUT_STREAM (base), 8);
     133                 :          1 :   seekable = G_SEEKABLE (out);
     134                 :          1 :   error = NULL;
     135                 :            : 
     136                 :            :   /* Write data */
     137                 :          1 :   g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 0);
     138                 :          1 :   ret = g_output_stream_write_all (out, buffer, 4, &bytes_written, NULL, &error);
     139                 :          1 :   g_assert_no_error (error);
     140                 :          1 :   g_assert_cmpint (bytes_written, ==, 4);
     141                 :          1 :   g_assert (ret);
     142                 :          1 :   g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 4);
     143                 :          1 :   g_assert_cmpint (g_memory_output_stream_get_data_size (base), ==, 0);
     144                 :            : 
     145                 :            :   /* Forward relative seek */
     146                 :          1 :   ret = g_seekable_seek (seekable, 2, G_SEEK_CUR, NULL, &error);
     147                 :          1 :   g_assert_no_error (error);
     148                 :          1 :   g_assert (ret);
     149                 :          1 :   g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 6);
     150                 :          1 :   g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[0]);
     151                 :          1 :   g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[1]);
     152                 :          1 :   g_assert_cmpint ('c', ==, ((gchar *)g_memory_output_stream_get_data (base))[2]);
     153                 :          1 :   g_assert_cmpint ('d', ==, ((gchar *)g_memory_output_stream_get_data (base))[3]);
     154                 :          1 :   ret = g_output_stream_write_all (out, buffer, 2, &bytes_written, NULL, &error);
     155                 :          1 :   g_assert_no_error (error);
     156                 :          1 :   g_assert (ret);
     157                 :          1 :   g_assert_cmpint (bytes_written, ==, 2);
     158                 :          1 :   g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 8);
     159                 :            : 
     160                 :            :   /* Backward relative seek */
     161                 :          1 :   ret = g_seekable_seek (seekable, -4, G_SEEK_CUR, NULL, &error);
     162                 :          1 :   g_assert_no_error (error);
     163                 :          1 :   g_assert (ret);
     164                 :          1 :   g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 4);
     165                 :          1 :   g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[0]);
     166                 :          1 :   g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[1]);
     167                 :          1 :   g_assert_cmpint ('c', ==, ((gchar *)g_memory_output_stream_get_data (base))[2]);
     168                 :          1 :   g_assert_cmpint ('d', ==, ((gchar *)g_memory_output_stream_get_data (base))[3]);
     169                 :          1 :   g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[6]);
     170                 :          1 :   g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[7]);
     171                 :          1 :   ret = g_output_stream_write_all (out, buffer, 2, &bytes_written, NULL, &error);
     172                 :          1 :   g_assert_no_error (error);
     173                 :          1 :   g_assert (ret);
     174                 :          1 :   g_assert_cmpint (bytes_written, ==, 2);
     175                 :          1 :   g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 6);
     176                 :            : 
     177                 :            :   /* From start */
     178                 :          1 :   ret = g_seekable_seek (seekable, 2, G_SEEK_SET, NULL, &error);
     179                 :          1 :   g_assert_no_error (error);
     180                 :          1 :   g_assert (ret);
     181                 :          1 :   g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 2);
     182                 :          1 :   g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[0]);
     183                 :          1 :   g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[1]);
     184                 :          1 :   g_assert_cmpint ('c', ==, ((gchar *)g_memory_output_stream_get_data (base))[2]);
     185                 :          1 :   g_assert_cmpint ('d', ==, ((gchar *)g_memory_output_stream_get_data (base))[3]);
     186                 :          1 :   g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[4]);
     187                 :          1 :   g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[5]);
     188                 :          1 :   g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[6]);
     189                 :          1 :   g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[7]);
     190                 :          1 :   ret = g_output_stream_write_all (out, buffer, 2, &bytes_written, NULL, &error);
     191                 :          1 :   g_assert_no_error (error);
     192                 :          1 :   g_assert (ret);
     193                 :          1 :   g_assert_cmpint (bytes_written, ==, 2);
     194                 :          1 :   g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 4);
     195                 :            : 
     196                 :            :   /* From end */
     197                 :          1 :   ret = g_seekable_seek (seekable, 6 - 30, G_SEEK_END, NULL, &error);
     198                 :          1 :   g_assert_no_error (error);
     199                 :          1 :   g_assert (ret);
     200                 :          1 :   g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 6);
     201                 :          1 :   g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[0]);
     202                 :          1 :   g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[1]);
     203                 :          1 :   g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[2]);
     204                 :          1 :   g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[3]);
     205                 :          1 :   g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[4]);
     206                 :          1 :   g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[5]);
     207                 :          1 :   g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[6]);
     208                 :          1 :   g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[7]);
     209                 :          1 :   ret = g_output_stream_write_all (out, buffer + 2, 2, &bytes_written, NULL, &error);
     210                 :          1 :   g_assert_no_error (error);
     211                 :          1 :   g_assert (ret);
     212                 :          1 :   g_assert_cmpint (bytes_written, ==, 2);
     213                 :          1 :   g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 8);
     214                 :            : 
     215                 :            :   /* Check flush */
     216                 :          1 :   ret = g_output_stream_flush (out, NULL, &error);
     217                 :          1 :   g_assert_no_error (error);
     218                 :          1 :   g_assert (ret);
     219                 :          1 :   g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 8);
     220                 :          1 :   g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[0]);
     221                 :          1 :   g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[1]);
     222                 :          1 :   g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[2]);
     223                 :          1 :   g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[3]);
     224                 :          1 :   g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[4]);
     225                 :          1 :   g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[5]);
     226                 :          1 :   g_assert_cmpint ('c', ==, ((gchar *)g_memory_output_stream_get_data (base))[6]);
     227                 :          1 :   g_assert_cmpint ('d', ==, ((gchar *)g_memory_output_stream_get_data (base))[7]);
     228                 :            : 
     229                 :          1 :   g_object_unref (out);
     230                 :          1 :   g_object_unref (base);
     231                 :          1 : }
     232                 :            : 
     233                 :            : static void
     234                 :          1 : test_truncate(void)
     235                 :            : {
     236                 :            :   GMemoryOutputStream *base_stream;
     237                 :            :   GOutputStream *stream;
     238                 :            :   GSeekable *seekable;
     239                 :            :   GError *error;
     240                 :            :   gsize bytes_written;
     241                 :            :   guchar *stream_data;
     242                 :            :   gsize len;
     243                 :            :   gboolean res;
     244                 :            : 
     245                 :          1 :   len = 8;
     246                 :            : 
     247                 :            :   /* Create objects */
     248                 :          1 :   stream_data = g_malloc0 (len);
     249                 :          1 :   base_stream = G_MEMORY_OUTPUT_STREAM (g_memory_output_stream_new (stream_data, len, g_realloc, g_free));
     250                 :          1 :   stream = g_buffered_output_stream_new_sized (G_OUTPUT_STREAM (base_stream), 8);
     251                 :          1 :   seekable = G_SEEKABLE (stream);
     252                 :            : 
     253                 :          1 :   g_assert (g_seekable_can_truncate (seekable));
     254                 :            : 
     255                 :            :   /* Write */
     256                 :          1 :   g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, len);
     257                 :          1 :   g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 0);
     258                 :            : 
     259                 :          1 :   error = NULL;
     260                 :          1 :   res = g_output_stream_write_all (stream, "ab", 2, &bytes_written, NULL, &error);
     261                 :          1 :   g_assert_no_error (error);
     262                 :          1 :   g_assert (res);
     263                 :          1 :   res = g_output_stream_write_all (stream, "cd", 2, &bytes_written, NULL, &error);
     264                 :          1 :   g_assert_no_error (error);
     265                 :          1 :   g_assert (res);
     266                 :            : 
     267                 :          1 :   res = g_output_stream_flush (stream, NULL, &error);
     268                 :          1 :   g_assert_no_error (error);
     269                 :          1 :   g_assert (res);
     270                 :            : 
     271                 :          1 :   g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, len);
     272                 :          1 :   g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 4);
     273                 :          1 :   stream_data = g_memory_output_stream_get_data (base_stream);
     274                 :          1 :   g_assert_cmpint (stream_data[0], ==, 'a');
     275                 :          1 :   g_assert_cmpint (stream_data[1], ==, 'b');
     276                 :          1 :   g_assert_cmpint (stream_data[2], ==, 'c');
     277                 :          1 :   g_assert_cmpint (stream_data[3], ==, 'd');
     278                 :            : 
     279                 :            :   /* Truncate at position */
     280                 :          1 :   res = g_seekable_truncate (seekable, 4, NULL, &error);
     281                 :          1 :   g_assert_no_error (error);
     282                 :          1 :   g_assert (res);
     283                 :          1 :   g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, 4);
     284                 :          1 :   g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 4);
     285                 :          1 :   stream_data = g_memory_output_stream_get_data (base_stream);
     286                 :          1 :   g_assert_cmpint (stream_data[0], ==, 'a');
     287                 :          1 :   g_assert_cmpint (stream_data[1], ==, 'b');
     288                 :          1 :   g_assert_cmpint (stream_data[2], ==, 'c');
     289                 :          1 :   g_assert_cmpint (stream_data[3], ==, 'd');
     290                 :            : 
     291                 :            :   /* Truncate beyond position */
     292                 :          1 :   res = g_seekable_truncate (seekable, 6, NULL, &error);
     293                 :          1 :   g_assert_no_error (error);
     294                 :          1 :   g_assert (res);
     295                 :          1 :   g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, 6);
     296                 :          1 :   g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 6);
     297                 :          1 :   stream_data = g_memory_output_stream_get_data (base_stream);
     298                 :          1 :   g_assert_cmpint (stream_data[0], ==, 'a');
     299                 :          1 :   g_assert_cmpint (stream_data[1], ==, 'b');
     300                 :          1 :   g_assert_cmpint (stream_data[2], ==, 'c');
     301                 :          1 :   g_assert_cmpint (stream_data[3], ==, 'd');
     302                 :            : 
     303                 :            :   /* Truncate before position */
     304                 :          1 :   res = g_seekable_truncate (seekable, 2, NULL, &error);
     305                 :          1 :   g_assert_no_error (error);
     306                 :          1 :   g_assert (res);
     307                 :          1 :   g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, 2);
     308                 :          1 :   g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 2);
     309                 :          1 :   stream_data = g_memory_output_stream_get_data (base_stream);
     310                 :          1 :   g_assert_cmpint (stream_data[0], ==, 'a');
     311                 :          1 :   g_assert_cmpint (stream_data[1], ==, 'b');
     312                 :            : 
     313                 :          1 :   g_object_unref (stream);
     314                 :          1 :   g_object_unref (base_stream);
     315                 :          1 : }
     316                 :            : 
     317                 :            : int
     318                 :          1 : main (int argc, char *argv[])
     319                 :            : {
     320                 :          1 :   g_test_init (&argc, &argv, NULL);
     321                 :            : 
     322                 :          1 :   g_test_add_func ("/buffered-output-stream/write", test_write);
     323                 :          1 :   g_test_add_func ("/buffered-output-stream/grow", test_grow);
     324                 :          1 :   g_test_add_func ("/buffered-output-stream/seek", test_seek);
     325                 :          1 :   g_test_add_func ("/buffered-output-stream/truncate", test_truncate);
     326                 :          1 :   g_test_add_func ("/filter-output-stream/close", test_close);
     327                 :            : 
     328                 :          1 :   return g_test_run ();
     329                 :            : }

Generated by: LCOV version 1.14