3 #include <gio/gfiledescriptorbased.h>
11 file = g_file_new_for_path ("./some/directory/testfile");
13 s = g_file_get_basename (file);
14 g_assert_cmpstr (s, ==, "testfile");
17 s = g_file_get_uri (file);
18 g_assert (g_str_has_prefix (s, "file://"));
19 g_assert (g_str_has_suffix (s, "/some/directory/testfile"));
22 g_assert (g_file_has_uri_scheme (file, "file"));
23 s = g_file_get_uri_scheme (file);
24 g_assert_cmpstr (s, ==, "file");
27 g_object_unref (file);
38 file = g_file_new_for_path ("./some/directory/testfile");
39 file2 = g_file_new_for_path ("./some/directory");
40 root = g_file_new_for_path ("/");
42 g_assert (g_file_has_parent (file, file2));
44 parent = g_file_get_parent (file);
45 g_assert (g_file_equal (parent, file2));
46 g_object_unref (parent);
48 g_assert (g_file_get_parent (root) == NULL);
50 g_object_unref (file);
51 g_object_unref (file2);
52 g_object_unref (root);
62 file = g_file_new_for_path ("./some/directory");
63 child = g_file_get_child (file, "child");
64 g_assert (g_file_has_parent (child, file));
66 child2 = g_file_get_child_for_display_name (file, "child2", NULL);
67 g_assert (g_file_has_parent (child2, file));
69 g_object_unref (child);
70 g_object_unref (child2);
71 g_object_unref (file);
80 file = g_file_new_for_path (SRCDIR "/file.c");
81 type = g_file_query_file_type (file, 0, NULL);
82 g_assert_cmpint (type, ==, G_FILE_TYPE_REGULAR);
83 g_object_unref (file);
85 file = g_file_new_for_path (SRCDIR "/schema-tests");
86 type = g_file_query_file_type (file, 0, NULL);
87 g_assert_cmpint (type, ==, G_FILE_TYPE_DIRECTORY);
88 g_object_unref (file);
95 GFileMonitor *monitor;
96 GOutputStream *ostream;
97 GInputStream *istream;
100 gint monitor_created;
101 gint monitor_deleted;
102 gint monitor_changed;
111 monitor_changed (GFileMonitor *monitor,
114 GFileMonitorEvent event_type,
117 CreateDeleteData *data = user_data;
119 g_assert_cmpstr (data->monitor_path, ==, g_file_get_path (file));
121 if (event_type == G_FILE_MONITOR_EVENT_CREATED)
122 data->monitor_created++;
123 if (event_type == G_FILE_MONITOR_EVENT_DELETED)
124 data->monitor_deleted++;
125 if (event_type == G_FILE_MONITOR_EVENT_CHANGED)
126 data->monitor_changed++;
131 quit_idle (gpointer user_data)
133 CreateDeleteData *data = user_data;
135 g_source_remove (data->timeout);
136 g_main_loop_quit (data->loop);
142 iclosed_cb (GObject *source,
146 CreateDeleteData *data = user_data;
151 ret = g_input_stream_close_finish (data->istream, res, &error);
152 g_assert_no_error (error);
155 g_assert (g_input_stream_is_closed (data->istream));
157 ret = g_file_delete (data->file, NULL, &error);
159 g_assert_no_error (error);
161 /* work around file monitor bug:
162 * inotify events are only processed every 1000 ms, regardless
163 * of the rate limit set on the file monitor
165 g_timeout_add (2000, quit_idle, data);
169 read_cb (GObject *source,
173 CreateDeleteData *data = user_data;
178 size = g_input_stream_read_finish (data->istream, res, &error);
179 g_assert_no_error (error);
182 if (data->pos < strlen (data->data))
184 g_input_stream_read_async (data->istream,
185 data->buffer + data->pos,
186 strlen (data->data) - data->pos,
194 g_assert_cmpstr (data->buffer, ==, data->data);
195 g_assert (!g_input_stream_is_closed (data->istream));
196 g_input_stream_close_async (data->istream, 0, NULL, iclosed_cb, data);
201 ipending_cb (GObject *source,
205 CreateDeleteData *data = user_data;
210 size = g_input_stream_read_finish (data->istream, res, &error);
211 g_assert_error (error, G_IO_ERROR, G_IO_ERROR_PENDING);
212 g_error_free (error);
216 skipped_cb (GObject *source,
220 CreateDeleteData *data = user_data;
225 size = g_input_stream_skip_finish (data->istream, res, &error);
226 g_assert_no_error (error);
227 g_assert_cmpint (size, ==, data->pos);
229 g_input_stream_read_async (data->istream,
230 data->buffer + data->pos,
231 strlen (data->data) - data->pos,
236 /* check that we get a pending error */
237 g_input_stream_read_async (data->istream,
238 data->buffer + data->pos,
239 strlen (data->data) - data->pos,
247 opened_cb (GObject *source,
251 GFileInputStream *base;
252 CreateDeleteData *data = user_data;
256 base = g_file_read_finish (data->file, res, &error);
257 g_assert_no_error (error);
259 if (data->buffersize == 0)
260 data->istream = G_INPUT_STREAM (g_object_ref (base));
262 data->istream = g_buffered_input_stream_new_sized (G_INPUT_STREAM (base), data->buffersize);
263 g_object_unref (base);
265 data->buffer = g_new0 (gchar, strlen (data->data) + 1);
267 /* copy initial segment directly, then skip */
268 memcpy (data->buffer, data->data, 10);
271 g_input_stream_skip_async (data->istream,
280 oclosed_cb (GObject *source,
284 CreateDeleteData *data = user_data;
289 ret = g_output_stream_close_finish (data->ostream, res, &error);
290 g_assert_no_error (error);
292 g_assert (g_output_stream_is_closed (data->ostream));
294 g_file_read_async (data->file, 0, NULL, opened_cb, data);
298 written_cb (GObject *source,
302 CreateDeleteData *data = user_data;
307 size = g_output_stream_write_finish (data->ostream, res, &error);
308 g_assert_no_error (error);
311 if (data->pos < strlen (data->data))
313 g_output_stream_write_async (data->ostream,
314 data->data + data->pos,
315 strlen (data->data) - data->pos,
323 g_assert (!g_output_stream_is_closed (data->ostream));
324 g_output_stream_close_async (data->ostream, 0, NULL, oclosed_cb, data);
329 opending_cb (GObject *source,
333 CreateDeleteData *data = user_data;
338 size = g_output_stream_write_finish (data->ostream, res, &error);
339 g_assert_error (error, G_IO_ERROR, G_IO_ERROR_PENDING);
340 g_error_free (error);
344 created_cb (GObject *source,
348 GFileOutputStream *base;
349 CreateDeleteData *data = user_data;
353 base = g_file_create_finish (G_FILE (source), res, &error);
354 g_assert_no_error (error);
355 g_assert (g_file_query_exists (data->file, NULL));
357 if (data->buffersize == 0)
358 data->ostream = G_OUTPUT_STREAM (g_object_ref (base));
360 data->ostream = g_buffered_output_stream_new_sized (G_OUTPUT_STREAM (base), data->buffersize);
361 g_object_unref (base);
363 g_output_stream_write_async (data->ostream,
370 /* check that we get a pending error */
371 g_output_stream_write_async (data->ostream,
381 stop_timeout (gpointer data)
383 g_assert_not_reached ();
389 * This test does a fully async create-write-read-delete.
393 test_create_delete (gconstpointer d)
397 CreateDeleteData *data;
399 data = g_new0 (CreateDeleteData, 1);
401 data->buffersize = GPOINTER_TO_INT (d);
402 data->data = "abcdefghijklmnopqrstuvxyzABCDEFGHIJKLMNOPQRSTUVXYZ0123456789";
406 fd = g_file_open_tmp ("g_file_create_delete_XXXXXX", &data->monitor_path, &error);
407 g_assert_no_error (error);
408 unlink (data->monitor_path);
411 data->file = g_file_new_for_path (data->monitor_path);
412 g_assert (!g_file_query_exists (data->file, NULL));
414 data->monitor = g_file_monitor_file (data->file, 0, NULL, &error);
415 g_file_monitor_set_rate_limit (data->monitor, 100);
416 g_assert_no_error (error);
418 g_signal_connect (data->monitor, "changed", G_CALLBACK (monitor_changed), data);
420 data->loop = g_main_loop_new (NULL, FALSE);
422 data->timeout = g_timeout_add (5000, stop_timeout, NULL);
424 g_file_create_async (data->file, 0, 0, NULL, created_cb, data);
426 g_main_loop_run (data->loop);
428 g_assert_cmpint (data->monitor_created, ==, 1);
429 g_assert_cmpint (data->monitor_deleted, ==, 1);
430 g_assert_cmpint (data->monitor_changed, >, 0);
432 g_assert (!g_file_monitor_is_cancelled (data->monitor));
433 g_file_monitor_cancel (data->monitor);
434 g_assert (g_file_monitor_is_cancelled (data->monitor));
436 g_main_loop_unref (data->loop);
437 g_object_unref (data->monitor);
438 g_object_unref (data->ostream);
439 g_object_unref (data->istream);
440 g_object_unref (data->file);
441 g_free (data->monitor_path);
442 g_free (data->buffer);
447 main (int argc, char *argv[])
451 g_test_init (&argc, &argv, NULL);
453 g_test_add_func ("/file/basic", test_basic);
454 g_test_add_func ("/file/parent", test_parent);
455 g_test_add_func ("/file/child", test_child);
456 g_test_add_func ("/file/type", test_type);
457 g_test_add_data_func ("/file/async-create-delete/0", GINT_TO_POINTER (0), test_create_delete);
458 g_test_add_data_func ("/file/async-create-delete/1", GINT_TO_POINTER (1), test_create_delete);
459 g_test_add_data_func ("/file/async-create-delete/10", GINT_TO_POINTER (10), test_create_delete);
460 g_test_add_data_func ("/file/async-create-delete/25", GINT_TO_POINTER (25), test_create_delete);
461 g_test_add_data_func ("/file/async-create-delete/4096", GINT_TO_POINTER (4096), test_create_delete);
463 return g_test_run ();