/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */ /* test-file-tracker.c: File tracker tests Copyright (C) 2007 Stefan Walter The Gnome Keyring Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The Gnome Keyring Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the Gnome Library; see the file COPYING.LIB. If not, . Author: Stef Walter */ #include "config.h" #include #include #include #include #include "egg/egg-file-tracker.h" #include #define DATA "test-data" #define SUBDIR "test-subdir" #define WILDCARD "*.woo?" typedef struct { EggFileTracker *the_tracker; gchar *test_dir; gchar *test_file; guint n_files_added; gchar* last_file_added; guint n_files_changed; gchar* last_file_changed; guint n_files_removed; gchar* last_file_removed; } Test; static void file_added (EggFileTracker *tracker, const gchar *path, gpointer user_data) { Test *test = user_data; g_assert ("should be a non-null path" && path != NULL); ++test->n_files_added; g_free (test->last_file_added); test->last_file_added = g_strdup (path); } static void file_changed (EggFileTracker *tracker, const gchar *path, gpointer user_data) { Test *test = user_data; g_assert ("should be a non-null path" && path != NULL); ++test->n_files_changed; g_free (test->last_file_changed); test->last_file_changed = g_strdup (path); } static void file_removed (EggFileTracker *tracker, const gchar *path, gpointer user_data) { Test *test = user_data; g_assert ("should be a non-null path" && path != NULL); ++test->n_files_removed; g_free (test->last_file_removed); test->last_file_removed = g_strdup (path); } static void file_reset_stats (Test *test) { g_free (test->last_file_removed); g_free (test->last_file_added); g_free (test->last_file_changed); test->last_file_removed = test->last_file_added = test->last_file_changed = NULL; test->n_files_added = test->n_files_changed = test->n_files_removed = 0; } static void setup (Test *test, gconstpointer unused) { /* Make a test directory */ test->test_dir = g_build_filename ("/tmp", SUBDIR, NULL); test->the_tracker = egg_file_tracker_new (test->test_dir, WILDCARD, NULL); g_signal_connect (test->the_tracker, "file-added", G_CALLBACK (file_added), test); g_signal_connect (test->the_tracker, "file-removed", G_CALLBACK (file_removed), test); g_signal_connect (test->the_tracker, "file-changed", G_CALLBACK (file_changed), test); /* Mtime must change so wait between tests */ sleep (1); test->test_file = g_build_filename (test->test_dir, "my-file.woof", NULL); g_unlink (test->test_file); } static void teardown (Test *test, gconstpointer unused) { file_reset_stats (test); g_object_unref (test->the_tracker); g_free (test->test_dir); g_free (test->test_file); } static void test_file_watch (Test *test, gconstpointer unused) { /* A watch for an non-existant directory, should have no responses */ egg_file_tracker_refresh (test->the_tracker, FALSE); g_assert_cmpint (0, ==, test->n_files_added); g_assert_cmpint (0, ==, test->n_files_changed); g_assert_cmpint (0, ==, test->n_files_removed); g_mkdir_with_parents (test->test_dir, 0700); /* Should still have no responses even though it exists */ egg_file_tracker_refresh (test->the_tracker, FALSE); g_assert_cmpint (0, ==, test->n_files_added); g_assert_cmpint (0, ==, test->n_files_changed); g_assert_cmpint (0, ==, test->n_files_removed); } static void test_watch_file (Test *test, gconstpointer unused) { gboolean ret; /* Make sure things are clean */ egg_file_tracker_refresh (test->the_tracker, FALSE); test->n_files_added = test->n_files_changed = test->n_files_removed = 0; test->last_file_added = test->last_file_changed = test->last_file_removed = 0; ret = g_file_set_contents (test->test_file, DATA, strlen (DATA), NULL); g_assert (ret); /* Now make sure that file is located */ egg_file_tracker_refresh (test->the_tracker, FALSE); g_assert_cmpint (1, ==, test->n_files_added); g_assert_cmpint (0, ==, test->n_files_changed); g_assert_cmpint (0, ==, test->n_files_removed); /* The added one should match our file */ g_assert_cmpstr (test->last_file_added, ==, test->test_file); file_reset_stats (test); sleep (1); /* Shouldn't find the file again */ egg_file_tracker_refresh (test->the_tracker, FALSE); g_assert_cmpint (0, ==, test->n_files_added); g_assert_cmpint (0, ==, test->n_files_changed); g_assert_cmpint (0, ==, test->n_files_removed); /* But we should find the file if forced to */ egg_file_tracker_refresh (test->the_tracker, TRUE); g_assert_cmpint (0, ==, test->n_files_added); g_assert_cmpint (1, ==, test->n_files_changed); g_assert_cmpint (0, ==, test->n_files_removed); g_assert_cmpstr (test->last_file_changed, ==, test->test_file); file_reset_stats (test); ret = g_file_set_contents (test->test_file, DATA, strlen (DATA), NULL); g_assert (ret); /* File was updated */ egg_file_tracker_refresh (test->the_tracker, FALSE); g_assert_cmpint (0, ==, test->n_files_added); g_assert_cmpint (1, ==, test->n_files_changed); g_assert_cmpint (0, ==, test->n_files_removed); g_assert_cmpstr (test->last_file_changed, ==, test->test_file); file_reset_stats (test); g_unlink (test->test_file); /* Now file should be removed */ egg_file_tracker_refresh (test->the_tracker, FALSE); g_assert_cmpint (0, ==, test->n_files_added); g_assert_cmpint (0, ==, test->n_files_changed); g_assert_cmpint (1, ==, test->n_files_removed); g_assert_cmpstr (test->last_file_removed, ==, test->test_file); } static void test_nomatch (Test *test, gconstpointer unused) { gchar *file = g_build_filename (test->test_dir, "my-file.toot", NULL); gboolean ret; /* Mtime must change so wait between tests */ sleep (1); ret = g_file_set_contents (file, DATA, strlen (DATA), NULL); g_assert (ret); file_reset_stats (test); /* Now make sure that file is not located */ egg_file_tracker_refresh (test->the_tracker, FALSE); g_assert_cmpint (0, ==, test->n_files_added); g_assert_cmpint (0, ==, test->n_files_changed); g_assert_cmpint (0, ==, test->n_files_removed); g_unlink (file); g_free (file); } int main (int argc, char **argv) { #if !GLIB_CHECK_VERSION(2,35,0) g_type_init (); #endif g_test_init (&argc, &argv, NULL); g_test_add ("/egg/file-tracker/file_watch", Test, NULL, setup, test_file_watch, teardown); g_test_add ("/egg/file-tracker/watch_file", Test, NULL, setup, test_watch_file, teardown); g_test_add ("/egg/file-tracker/nomatch", Test, NULL, setup, test_nomatch, teardown); return g_test_run (); }