2 #include <glib/gstdio.h>
7 static const char *original_data = "This is some test data that we can put in a file...";
8 static const char *new_data = "new data..";
11 verify_pos (GIOStream *iostream, goffset expected_pos)
15 pos = g_seekable_tell (G_SEEKABLE (iostream));
16 g_assert_cmpint (pos, ==, expected_pos);
18 pos = g_seekable_tell (G_SEEKABLE (g_io_stream_get_input_stream (iostream)));
19 g_assert_cmpint (pos, ==, expected_pos);
21 pos = g_seekable_tell (G_SEEKABLE (g_io_stream_get_output_stream (iostream)));
22 g_assert_cmpint (pos, ==, expected_pos);
26 verify_iostream (GFileIOStream *file_iostream)
37 iostream = G_IO_STREAM (file_iostream);
39 verify_pos (iostream, 0);
41 in = g_io_stream_get_input_stream (iostream);
42 out = g_io_stream_get_output_stream (iostream);
44 res = g_input_stream_read_all (in, buffer, 20, &n_bytes, NULL, NULL);
46 g_assert_cmpint ((int)n_bytes, ==, 20);
48 g_assert (memcmp (buffer, original_data, 20) == 0);
50 verify_pos (iostream, 20);
52 res = g_seekable_seek (G_SEEKABLE (iostream),
56 verify_pos (iostream, strlen (original_data) - 10);
58 res = g_input_stream_read_all (in, buffer, 20, &n_bytes, NULL, NULL);
60 g_assert_cmpint ((int)n_bytes, ==, 10);
61 g_assert (memcmp (buffer, original_data + strlen (original_data) - 10, 10) == 0);
63 verify_pos (iostream, strlen (original_data));
65 res = g_seekable_seek (G_SEEKABLE (iostream),
69 verify_pos (iostream, 10);
71 res = g_output_stream_write_all (out, new_data, strlen (new_data),
72 &n_bytes, NULL, NULL);
74 g_assert_cmpint (n_bytes, ==, strlen (new_data));
76 verify_pos (iostream, 10 + strlen (new_data));
78 res = g_seekable_seek (G_SEEKABLE (iostream),
82 verify_pos (iostream, 0);
84 res = g_input_stream_read_all (in, buffer, strlen (original_data), &n_bytes, NULL, NULL);
86 g_assert_cmpint ((int)n_bytes, ==, strlen (original_data));
89 modified_data = g_strdup (original_data);
90 memcpy (modified_data + 10, new_data, strlen (new_data));
91 g_assert_cmpstr (buffer, ==, modified_data);
93 verify_pos (iostream, strlen (original_data));
95 res = g_seekable_seek (G_SEEKABLE (iostream),
99 verify_pos (iostream, 0);
101 res = g_output_stream_close (out, NULL, NULL);
104 res = g_input_stream_read_all (in, buffer, 15, &n_bytes, NULL, NULL);
106 g_assert_cmpint ((int)n_bytes, ==, 15);
107 g_assert (memcmp (buffer, modified_data, 15) == 0);
110 res = g_output_stream_write_all (out, new_data, strlen (new_data),
111 &n_bytes, NULL, &error);
113 g_assert (error != NULL);
114 g_assert (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CLOSED));
117 res = g_io_stream_close (iostream, NULL, &error);
118 g_assert (res && error == NULL);
120 g_free (modified_data);
124 test_g_file_open_readwrite (void)
129 GFileIOStream *file_iostream;
134 fd = g_file_open_tmp ("readwrite_XXXXXX",
139 res = g_file_set_contents (tmp_file,
140 original_data, -1, NULL);
143 path = g_build_filename (g_get_tmp_dir (), "g-a-nonexisting-file", NULL);
144 file = g_file_new_for_path (path);
147 file_iostream = g_file_open_readwrite (file, NULL, &error);
148 g_assert (file_iostream == NULL);
149 g_assert (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND));
150 g_error_free (error);
151 g_object_unref (file);
153 file = g_file_new_for_path (tmp_file);
155 file_iostream = g_file_open_readwrite (file, NULL, &error);
156 g_assert (file_iostream != NULL);
158 verify_iostream (file_iostream);
160 g_object_unref (file_iostream);
167 test_g_file_create_readwrite (void)
172 GFileIOStream *file_iostream;
178 fd = g_file_open_tmp ("readwrite_XXXXXX",
183 file = g_file_new_for_path (tmp_file);
185 file_iostream = g_file_create_readwrite (file, 0, NULL, &error);
186 g_assert (file_iostream == NULL);
187 g_assert (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_EXISTS));
190 file_iostream = g_file_create_readwrite (file, 0, NULL, &error);
191 g_assert (file_iostream != NULL);
193 out = g_io_stream_get_output_stream (G_IO_STREAM (file_iostream));
194 res = g_output_stream_write_all (out, original_data, strlen (original_data),
195 &n_bytes, NULL, NULL);
197 g_assert_cmpint (n_bytes, ==, strlen (original_data));
199 res = g_seekable_seek (G_SEEKABLE (file_iostream),
204 verify_iostream (file_iostream);
206 g_object_unref (file_iostream);
213 test_g_file_replace_readwrite (void)
215 char *tmp_file, *backup, *data;
218 GFileIOStream *file_iostream;
226 fd = g_file_open_tmp ("readwrite_XXXXXX",
231 res = g_file_set_contents (tmp_file,
235 file = g_file_new_for_path (tmp_file);
237 file_iostream = g_file_replace_readwrite (file, NULL,
238 TRUE, 0, NULL, &error);
239 g_assert (file_iostream != NULL);
241 in = g_io_stream_get_input_stream (G_IO_STREAM (file_iostream));
243 /* Ensure its empty */
244 res = g_input_stream_read_all (in, buffer, sizeof buffer, &n_bytes, NULL, NULL);
246 g_assert_cmpint ((int)n_bytes, ==, 0);
248 out = g_io_stream_get_output_stream (G_IO_STREAM (file_iostream));
249 res = g_output_stream_write_all (out, original_data, strlen (original_data),
250 &n_bytes, NULL, NULL);
252 g_assert_cmpint (n_bytes, ==, strlen (original_data));
254 res = g_seekable_seek (G_SEEKABLE (file_iostream),
259 verify_iostream (file_iostream);
261 g_object_unref (file_iostream);
263 backup = g_strconcat (tmp_file, "~", NULL);
264 res = g_file_get_contents (backup,
268 g_assert_cmpstr (data, ==, new_data);
283 g_test_init (&argc, &argv, NULL);
285 g_test_add_func ("/readwrite/test_g_file_open_readwrite",
286 test_g_file_open_readwrite);
287 g_test_add_func ("/readwrite/test_g_file_create_readwrite",
288 test_g_file_create_readwrite);
289 g_test_add_func ("/readwrite/test_g_file_replace_readwrite",
290 test_g_file_replace_readwrite);