| #include <gio/gio.h> | |
| static void | |
| test_write (void) | |
| { | |
| GOutputStream *base; | |
| GOutputStream *out; | |
| GError *error; | |
| const gchar buffer[] = "abcdefghijklmnopqrstuvwxyz"; | |
| base = g_memory_output_stream_new (g_malloc0 (20), 20, NULL, g_free); | |
| out = g_buffered_output_stream_new (base); | |
| g_assert_cmpint (g_buffered_output_stream_get_buffer_size (G_BUFFERED_OUTPUT_STREAM (out)), ==, 4096); | |
| g_assert (!g_buffered_output_stream_get_auto_grow (G_BUFFERED_OUTPUT_STREAM (out))); | |
| g_object_set (out, "auto-grow", TRUE, NULL); | |
| g_assert (g_buffered_output_stream_get_auto_grow (G_BUFFERED_OUTPUT_STREAM (out))); | |
| g_object_set (out, "auto-grow", FALSE, NULL); | |
| g_buffered_output_stream_set_buffer_size (G_BUFFERED_OUTPUT_STREAM (out), 16); | |
| g_assert_cmpint (g_buffered_output_stream_get_buffer_size (G_BUFFERED_OUTPUT_STREAM (out)), ==, 16); | |
| error = NULL; | |
| g_assert_cmpint (g_output_stream_write (out, buffer, 10, NULL, &error), ==, 10); | |
| g_assert_no_error (error); | |
| g_assert_cmpint (g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (base)), ==, 0); | |
| g_assert_cmpint (g_output_stream_write (out, buffer + 10, 10, NULL, &error), ==, 6); | |
| g_assert_no_error (error); | |
| g_assert_cmpint (g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (base)), ==, 0); | |
| g_assert (g_output_stream_flush (out, NULL, &error)); | |
| g_assert_no_error (error); | |
| g_assert_cmpint (g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (base)), ==, 16); | |
| g_assert_cmpstr (g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (base)), ==, "abcdefghijklmnop"); | |
| g_object_unref (out); | |
| g_object_unref (base); | |
| } | |
| static void | |
| test_grow (void) | |
| { | |
| GOutputStream *base; | |
| GOutputStream *out; | |
| GError *error; | |
| const gchar buffer[] = "abcdefghijklmnopqrstuvwxyz"; | |
| gint size; | |
| gboolean grow; | |
| base = g_memory_output_stream_new (g_malloc0 (30), 30, g_realloc, g_free); | |
| out = g_buffered_output_stream_new_sized (base, 16); | |
| g_buffered_output_stream_set_auto_grow (G_BUFFERED_OUTPUT_STREAM (out), TRUE); | |
| g_object_get (out, "buffer-size", &size, "auto-grow", &grow, NULL); | |
| g_assert_cmpint (size, ==, 16); | |
| g_assert (grow); | |
| g_assert (g_seekable_can_seek (G_SEEKABLE (out))); | |
| error = NULL; | |
| g_assert_cmpint (g_output_stream_write (out, buffer, 10, NULL, &error), ==, 10); | |
| g_assert_no_error (error); | |
| g_assert_cmpint (g_buffered_output_stream_get_buffer_size (G_BUFFERED_OUTPUT_STREAM (out)), ==, 16); | |
| g_assert_cmpint (g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (base)), ==, 0); | |
| g_assert_cmpint (g_output_stream_write (out, buffer + 10, 10, NULL, &error), ==, 10); | |
| g_assert_no_error (error); | |
| g_assert_cmpint (g_buffered_output_stream_get_buffer_size (G_BUFFERED_OUTPUT_STREAM (out)), >=, 20); | |
| g_assert_cmpint (g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (base)), ==, 0); | |
| g_assert (g_output_stream_flush (out, NULL, &error)); | |
| g_assert_no_error (error); | |
| g_assert_cmpstr (g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (base)), ==, "abcdefghijklmnopqrst"); | |
| g_object_unref (out); | |
| g_object_unref (base); | |
| } | |
| static void | |
| test_close (void) | |
| { | |
| GOutputStream *base; | |
| GOutputStream *out; | |
| GError *error; | |
| base = g_memory_output_stream_new (g_malloc0 (30), 30, g_realloc, g_free); | |
| out = g_buffered_output_stream_new (base); | |
| g_assert (g_filter_output_stream_get_close_base_stream (G_FILTER_OUTPUT_STREAM (out))); | |
| error = NULL; | |
| g_assert (g_output_stream_close (out, NULL, &error)); | |
| g_assert_no_error (error); | |
| g_assert (g_output_stream_is_closed (base)); | |
| g_object_unref (out); | |
| g_object_unref (base); | |
| base = g_memory_output_stream_new (g_malloc0 (30), 30, g_realloc, g_free); | |
| out = g_buffered_output_stream_new (base); | |
| g_filter_output_stream_set_close_base_stream (G_FILTER_OUTPUT_STREAM (out), FALSE); | |
| error = NULL; | |
| g_assert (g_output_stream_close (out, NULL, &error)); | |
| g_assert_no_error (error); | |
| g_assert (!g_output_stream_is_closed (base)); | |
| g_object_unref (out); | |
| g_object_unref (base); | |
| } | |
| static void | |
| test_seek (void) | |
| { | |
| GMemoryOutputStream *base; | |
| GOutputStream *out; | |
| GSeekable *seekable; | |
| GError *error; | |
| gsize bytes_written; | |
| gboolean ret; | |
| const gchar buffer[] = "abcdefghijklmnopqrstuvwxyz"; | |
| base = G_MEMORY_OUTPUT_STREAM (g_memory_output_stream_new (g_malloc0 (30), 30, NULL, g_free)); | |
| out = g_buffered_output_stream_new_sized (G_OUTPUT_STREAM (base), 8); | |
| seekable = G_SEEKABLE (out); | |
| error = NULL; | |
| /* Write data */ | |
| g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 0); | |
| ret = g_output_stream_write_all (out, buffer, 4, &bytes_written, NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert_cmpint (bytes_written, ==, 4); | |
| g_assert (ret); | |
| g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 4); | |
| g_assert_cmpint (g_memory_output_stream_get_data_size (base), ==, 0); | |
| /* Forward relative seek */ | |
| ret = g_seekable_seek (seekable, 2, G_SEEK_CUR, NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert (ret); | |
| g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 6); | |
| g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[0]); | |
| g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[1]); | |
| g_assert_cmpint ('c', ==, ((gchar *)g_memory_output_stream_get_data (base))[2]); | |
| g_assert_cmpint ('d', ==, ((gchar *)g_memory_output_stream_get_data (base))[3]); | |
| ret = g_output_stream_write_all (out, buffer, 2, &bytes_written, NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert (ret); | |
| g_assert_cmpint (bytes_written, ==, 2); | |
| g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 8); | |
| /* Backward relative seek */ | |
| ret = g_seekable_seek (seekable, -4, G_SEEK_CUR, NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert (ret); | |
| g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 4); | |
| g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[0]); | |
| g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[1]); | |
| g_assert_cmpint ('c', ==, ((gchar *)g_memory_output_stream_get_data (base))[2]); | |
| g_assert_cmpint ('d', ==, ((gchar *)g_memory_output_stream_get_data (base))[3]); | |
| g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[6]); | |
| g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[7]); | |
| ret = g_output_stream_write_all (out, buffer, 2, &bytes_written, NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert (ret); | |
| g_assert_cmpint (bytes_written, ==, 2); | |
| g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 6); | |
| /* From start */ | |
| ret = g_seekable_seek (seekable, 2, G_SEEK_SET, NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert (ret); | |
| g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 2); | |
| g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[0]); | |
| g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[1]); | |
| g_assert_cmpint ('c', ==, ((gchar *)g_memory_output_stream_get_data (base))[2]); | |
| g_assert_cmpint ('d', ==, ((gchar *)g_memory_output_stream_get_data (base))[3]); | |
| g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[4]); | |
| g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[5]); | |
| g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[6]); | |
| g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[7]); | |
| ret = g_output_stream_write_all (out, buffer, 2, &bytes_written, NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert (ret); | |
| g_assert_cmpint (bytes_written, ==, 2); | |
| g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 4); | |
| /* From end */ | |
| ret = g_seekable_seek (seekable, 6 - 30, G_SEEK_END, NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert (ret); | |
| g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 6); | |
| g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[0]); | |
| g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[1]); | |
| g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[2]); | |
| g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[3]); | |
| g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[4]); | |
| g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[5]); | |
| g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[6]); | |
| g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[7]); | |
| ret = g_output_stream_write_all (out, buffer + 2, 2, &bytes_written, NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert (ret); | |
| g_assert_cmpint (bytes_written, ==, 2); | |
| g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 8); | |
| /* Check flush */ | |
| ret = g_output_stream_flush (out, NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert (ret); | |
| g_assert_cmpint (g_seekable_tell (G_SEEKABLE (out)), ==, 8); | |
| g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[0]); | |
| g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[1]); | |
| g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[2]); | |
| g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[3]); | |
| g_assert_cmpint ('a', ==, ((gchar *)g_memory_output_stream_get_data (base))[4]); | |
| g_assert_cmpint ('b', ==, ((gchar *)g_memory_output_stream_get_data (base))[5]); | |
| g_assert_cmpint ('c', ==, ((gchar *)g_memory_output_stream_get_data (base))[6]); | |
| g_assert_cmpint ('d', ==, ((gchar *)g_memory_output_stream_get_data (base))[7]); | |
| g_object_unref (out); | |
| g_object_unref (base); | |
| } | |
| static void | |
| test_truncate(void) | |
| { | |
| GMemoryOutputStream *base_stream; | |
| GOutputStream *stream; | |
| GSeekable *seekable; | |
| GError *error; | |
| gsize bytes_written; | |
| guchar *stream_data; | |
| gsize len; | |
| gboolean res; | |
| len = 8; | |
| /* Create objects */ | |
| stream_data = g_malloc0 (len); | |
| base_stream = G_MEMORY_OUTPUT_STREAM (g_memory_output_stream_new (stream_data, len, g_realloc, g_free)); | |
| stream = g_buffered_output_stream_new_sized (G_OUTPUT_STREAM (base_stream), 8); | |
| seekable = G_SEEKABLE (stream); | |
| g_assert (g_seekable_can_truncate (seekable)); | |
| /* Write */ | |
| g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, len); | |
| g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 0); | |
| error = NULL; | |
| res = g_output_stream_write_all (stream, "ab", 2, &bytes_written, NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert (res); | |
| res = g_output_stream_write_all (stream, "cd", 2, &bytes_written, NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert (res); | |
| res = g_output_stream_flush (stream, NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert (res); | |
| g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, len); | |
| g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 4); | |
| stream_data = g_memory_output_stream_get_data (base_stream); | |
| g_assert_cmpint (stream_data[0], ==, 'a'); | |
| g_assert_cmpint (stream_data[1], ==, 'b'); | |
| g_assert_cmpint (stream_data[2], ==, 'c'); | |
| g_assert_cmpint (stream_data[3], ==, 'd'); | |
| /* Truncate at position */ | |
| res = g_seekable_truncate (seekable, 4, NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert (res); | |
| g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, 4); | |
| g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 4); | |
| stream_data = g_memory_output_stream_get_data (base_stream); | |
| g_assert_cmpint (stream_data[0], ==, 'a'); | |
| g_assert_cmpint (stream_data[1], ==, 'b'); | |
| g_assert_cmpint (stream_data[2], ==, 'c'); | |
| g_assert_cmpint (stream_data[3], ==, 'd'); | |
| /* Truncate beyond position */ | |
| res = g_seekable_truncate (seekable, 6, NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert (res); | |
| g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, 6); | |
| g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 6); | |
| stream_data = g_memory_output_stream_get_data (base_stream); | |
| g_assert_cmpint (stream_data[0], ==, 'a'); | |
| g_assert_cmpint (stream_data[1], ==, 'b'); | |
| g_assert_cmpint (stream_data[2], ==, 'c'); | |
| g_assert_cmpint (stream_data[3], ==, 'd'); | |
| /* Truncate before position */ | |
| res = g_seekable_truncate (seekable, 2, NULL, &error); | |
| g_assert_no_error (error); | |
| g_assert (res); | |
| g_assert_cmpint (g_memory_output_stream_get_size (base_stream), ==, 2); | |
| g_assert_cmpint (g_memory_output_stream_get_data_size (base_stream), ==, 2); | |
| stream_data = g_memory_output_stream_get_data (base_stream); | |
| g_assert_cmpint (stream_data[0], ==, 'a'); | |
| g_assert_cmpint (stream_data[1], ==, 'b'); | |
| g_object_unref (stream); | |
| g_object_unref (base_stream); | |
| } | |
| int | |
| main (int argc, char *argv[]) | |
| { | |
| g_test_init (&argc, &argv, NULL); | |
| g_test_add_func ("/buffered-output-stream/write", test_write); | |
| g_test_add_func ("/buffered-output-stream/grow", test_grow); | |
| g_test_add_func ("/buffered-output-stream/seek", test_seek); | |
| g_test_add_func ("/buffered-output-stream/truncate", test_truncate); | |
| g_test_add_func ("/filter-output-stream/close", test_close); | |
| return g_test_run (); | |
| } |