summaryrefslogtreecommitdiff
path: root/tests/libtracker-data/tracker-db-journal-test.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/libtracker-data/tracker-db-journal-test.c')
-rw-r--r--tests/libtracker-data/tracker-db-journal-test.c405
1 files changed, 405 insertions, 0 deletions
diff --git a/tests/libtracker-data/tracker-db-journal-test.c b/tests/libtracker-data/tracker-db-journal-test.c
new file mode 100644
index 000000000..184c6ab46
--- /dev/null
+++ b/tests/libtracker-data/tracker-db-journal-test.c
@@ -0,0 +1,405 @@
+/*
+ * Copyright (C) 2008, Nokia <ivan.frade@nokia.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This 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
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+
+#include <glib/gstdio.h>
+
+#include <libtracker-data/tracker-db-journal.h>
+
+#ifndef DISABLE_JOURNAL
+
+static void
+test_init_and_shutdown (void)
+{
+ GError *error = NULL;
+ gboolean result;
+ gchar *path;
+ GFile *data_location, *child;
+ TrackerDBJournal *writer;
+
+ path = g_build_filename (TOP_BUILDDIR, "tests", "libtracker-db", NULL);
+ data_location = g_file_new_for_path (path);
+ g_free (path);
+
+ child = g_file_get_child (data_location, "tracker-store.journal");
+ path = g_file_get_path (child);
+ g_unlink (path);
+ g_object_unref (child);
+
+ /* check double init/shutdown */
+ tracker_db_journal_set_rotating (FALSE, G_MAXSIZE, NULL);
+ writer = tracker_db_journal_new (data_location, FALSE, &error);
+ g_assert_no_error (error);
+ g_assert_nonnull (writer);
+
+ result = tracker_db_journal_free (writer, &error);
+ g_assert_no_error (error);
+ g_assert (result == TRUE);
+
+ tracker_db_journal_set_rotating (FALSE, G_MAXSIZE, NULL);
+ writer = tracker_db_journal_new (data_location, FALSE, &error);
+ g_assert_no_error (error);
+ g_assert_nonnull (writer);
+
+ result = tracker_db_journal_free (writer, &error);
+ g_assert_no_error (error);
+ g_assert (result == TRUE);
+
+ g_object_unref (data_location);
+ g_free (path);
+}
+
+static void
+test_write_functions (void)
+{
+ gchar *path;
+ gsize initial_size, actual_size;
+ gboolean result;
+ GError *error = NULL;
+ GFile *data_location, *child;
+ TrackerDBJournal *writer;
+
+ path = g_build_filename (TOP_BUILDDIR, "tests", "libtracker-db", NULL);
+ data_location = g_file_new_for_path (path);
+ g_free (path);
+
+ child = g_file_get_child (data_location, "tracker-store.journal");
+ path = g_file_get_path (child);
+ g_unlink (path);
+ g_object_unref (child);
+
+ tracker_db_journal_set_rotating (FALSE, G_MAXSIZE, NULL);
+ writer = tracker_db_journal_new (data_location, FALSE, &error);
+ g_object_unref (data_location);
+ g_assert_no_error (error);
+
+ /* Size is 8 due to header */
+ actual_size = tracker_db_journal_get_size (writer);
+ g_assert_cmpint (actual_size, ==, 8);
+
+ /* Check with rollback, nothing is added */
+ initial_size = tracker_db_journal_get_size (writer);
+ result = tracker_db_journal_start_transaction (writer, time (NULL));
+ g_assert_cmpint (result, ==, TRUE);
+ result = tracker_db_journal_append_resource (writer, 10, "http://resource");
+ g_assert_cmpint (result, ==, TRUE);
+ result = tracker_db_journal_append_resource (writer, 11, "http://predicate");
+ g_assert_cmpint (result, ==, TRUE);
+ result = tracker_db_journal_append_delete_statement (writer, 0, 10, 11, "test");
+ g_assert_cmpint (result, ==, TRUE);
+ result = tracker_db_journal_rollback_transaction (writer);
+ g_assert_cmpint (result, ==, TRUE);
+ actual_size = tracker_db_journal_get_size (writer);
+ g_assert_cmpint (initial_size, ==, actual_size);
+
+ /* Check with commit, somethign is added */
+ result = tracker_db_journal_start_transaction (writer, time (NULL));
+ g_assert_cmpint (result, ==, TRUE);
+ result = tracker_db_journal_append_resource (writer, 12, "http://resource");
+ g_assert_cmpint (result, ==, TRUE);
+ result = tracker_db_journal_append_resource (writer, 13, "http://predicate");
+ g_assert_cmpint (result, ==, TRUE);
+ result = tracker_db_journal_append_resource (writer, 14, "http://resource");
+ g_assert_cmpint (result, ==, TRUE);
+ result = tracker_db_journal_append_delete_statement_id (writer, 0, 12, 13, 14);
+ g_assert_cmpint (result, ==, TRUE);
+ result = tracker_db_journal_commit_db_transaction (writer, &error);
+ g_assert_no_error (error);
+ g_assert_cmpint (result, ==, TRUE);
+ actual_size = tracker_db_journal_get_size (writer);
+ g_assert_cmpint (initial_size, !=, actual_size);
+
+ /* Test insert statement */
+ result = tracker_db_journal_start_transaction (writer, time (NULL));
+ g_assert_cmpint (result, ==, TRUE);
+ result = tracker_db_journal_append_resource (writer, 15, "http://resource");
+ g_assert_cmpint (result, ==, TRUE);
+ result = tracker_db_journal_append_resource (writer, 16, "http://predicate");
+ g_assert_cmpint (result, ==, TRUE);
+ result = tracker_db_journal_append_insert_statement (writer, 0, 15, 16, "test");
+ g_assert_cmpint (result, ==, TRUE);
+ result = tracker_db_journal_commit_db_transaction (writer, &error);
+ g_assert_no_error (error);
+ g_assert_cmpint (result, ==, TRUE);
+
+ /* Test insert id */
+ result = tracker_db_journal_start_transaction (writer, time (NULL));
+ g_assert_cmpint (result, ==, TRUE);
+ result = tracker_db_journal_append_resource (writer, 17, "http://resource");
+ g_assert_cmpint (result, ==, TRUE);
+ result = tracker_db_journal_append_resource (writer, 18, "http://predicate");
+ g_assert_cmpint (result, ==, TRUE);
+ result = tracker_db_journal_append_resource (writer, 19, "http://resource");
+ g_assert_cmpint (result, ==, TRUE);
+ result = tracker_db_journal_append_insert_statement_id (writer, 0, 17, 18, 19);
+ g_assert_cmpint (result, ==, TRUE);
+ result = tracker_db_journal_commit_db_transaction (writer, &error);
+ g_assert_no_error (error);
+ g_assert_cmpint (result, ==, TRUE);
+
+ /* Test fsync */
+ result = tracker_db_journal_fsync (writer);
+ g_assert_cmpint (result, ==, TRUE);
+
+ tracker_db_journal_free (writer, &error);
+ g_assert_no_error (error);
+
+ g_free (path);
+}
+
+static void
+test_read_functions (void)
+{
+ GError *error = NULL;
+ gchar *path;
+ gboolean result;
+ TrackerDBJournalEntryType type;
+ gint id, s_id, p_id, o_id;
+ const gchar *uri, *str;
+ GFile *data_location;
+ TrackerDBJournalReader *reader;
+
+ path = g_build_filename (TOP_BUILDDIR, "tests", "libtracker-db", NULL);
+ data_location = g_file_new_for_path (path);
+ g_free (path);
+
+ /* NOTE: we don't unlink here so we can use the data from the write tests */
+
+ /* Create an iterator */
+ reader = tracker_db_journal_reader_new (data_location, &error);
+ g_object_unref (data_location);
+ g_assert_no_error (error);
+ g_assert_nonnull (reader);
+
+ type = tracker_db_journal_reader_get_entry_type (reader);
+ g_assert_cmpint (type, ==, TRACKER_DB_JOURNAL_START);
+
+ /* First transaction */
+ result = tracker_db_journal_reader_next (reader, &error);
+ g_assert_no_error (error);
+ g_assert_cmpint (result, ==, TRUE);
+
+ type = tracker_db_journal_reader_get_entry_type (reader);
+ g_assert_cmpint (type, ==, TRACKER_DB_JOURNAL_START_TRANSACTION);
+
+ result = tracker_db_journal_reader_next (reader, &error);
+ g_assert_no_error (error);
+ g_assert_cmpint (result, ==, TRUE);
+
+ type = tracker_db_journal_reader_get_entry_type (reader);
+ g_assert_cmpint (type, ==, TRACKER_DB_JOURNAL_RESOURCE);
+
+ result = tracker_db_journal_reader_get_resource (reader, &id, &uri);
+ g_assert_cmpint (result, ==, TRUE);
+ g_assert_cmpint (id, ==, 12);
+ g_assert_cmpstr (uri, ==, "http://resource");
+
+ result = tracker_db_journal_reader_next (reader, &error);
+ g_assert_no_error (error);
+ g_assert_cmpint (result, ==, TRUE);
+
+ type = tracker_db_journal_reader_get_entry_type (reader);
+ g_assert_cmpint (type, ==, TRACKER_DB_JOURNAL_RESOURCE);
+
+ result = tracker_db_journal_reader_get_resource (reader, &id, &uri);
+ g_assert_cmpint (result, ==, TRUE);
+ g_assert_cmpint (id, ==, 13);
+ g_assert_cmpstr (uri, ==, "http://predicate");
+
+ result = tracker_db_journal_reader_next (reader, &error);
+ g_assert_no_error (error);
+ g_assert_cmpint (result, ==, TRUE);
+
+ type = tracker_db_journal_reader_get_entry_type (reader);
+ g_assert_cmpint (type, ==, TRACKER_DB_JOURNAL_RESOURCE);
+
+ result = tracker_db_journal_reader_get_resource (reader, &id, &uri);
+ g_assert_cmpint (result, ==, TRUE);
+ g_assert_cmpint (id, ==, 14);
+ g_assert_cmpstr (uri, ==, "http://resource");
+
+ result = tracker_db_journal_reader_next (reader, &error);
+ g_assert_no_error (error);
+ g_assert_cmpint (result, ==, TRUE);
+
+ type = tracker_db_journal_reader_get_entry_type (reader);
+ g_assert_cmpint (type, ==, TRACKER_DB_JOURNAL_DELETE_STATEMENT_ID);
+
+ result = tracker_db_journal_reader_get_statement_id (reader, NULL, &s_id, &p_id, &o_id);
+ g_assert_cmpint (result, ==, TRUE);
+ g_assert_cmpint (s_id, ==, 12);
+ g_assert_cmpint (p_id, ==, 13);
+ g_assert_cmpint (o_id, ==, 14);
+
+ result = tracker_db_journal_reader_next (reader, &error);
+ g_assert_no_error (error);
+ g_assert_cmpint (result, ==, TRUE);
+
+ type = tracker_db_journal_reader_get_entry_type (reader);
+ g_assert_cmpint (type, ==, TRACKER_DB_JOURNAL_END_TRANSACTION);
+
+ /* Second transaction */
+ result = tracker_db_journal_reader_next (reader, &error);
+ g_assert_no_error (error);
+ g_assert_cmpint (result, ==, TRUE);
+
+ type = tracker_db_journal_reader_get_entry_type (reader);
+ g_assert_cmpint (type, ==, TRACKER_DB_JOURNAL_START_TRANSACTION);
+
+ result = tracker_db_journal_reader_next (reader, &error);
+ g_assert_no_error (error);
+ g_assert_cmpint (result, ==, TRUE);
+
+ type = tracker_db_journal_reader_get_entry_type (reader);
+ g_assert_cmpint (type, ==, TRACKER_DB_JOURNAL_RESOURCE);
+
+ result = tracker_db_journal_reader_get_resource (reader, &id, &uri);
+ g_assert_cmpint (result, ==, TRUE);
+ g_assert_cmpint (id, ==, 15);
+ g_assert_cmpstr (uri, ==, "http://resource");
+
+ result = tracker_db_journal_reader_next (reader, &error);
+ g_assert_no_error (error);
+ g_assert_cmpint (result, ==, TRUE);
+
+ type = tracker_db_journal_reader_get_entry_type (reader);
+ g_assert_cmpint (type, ==, TRACKER_DB_JOURNAL_RESOURCE);
+
+ result = tracker_db_journal_reader_get_resource (reader, &id, &uri);
+ g_assert_cmpint (result, ==, TRUE);
+ g_assert_cmpint (id, ==, 16);
+ g_assert_cmpstr (uri, ==, "http://predicate");
+
+ result = tracker_db_journal_reader_next (reader, &error);
+ g_assert_no_error (error);
+ g_assert_cmpint (result, ==, TRUE);
+
+ type = tracker_db_journal_reader_get_entry_type (reader);
+ g_assert_cmpint (type, ==, TRACKER_DB_JOURNAL_INSERT_STATEMENT);
+
+ result = tracker_db_journal_reader_get_statement (reader, NULL, &s_id, &p_id, &str);
+ g_assert_cmpint (result, ==, TRUE);
+ g_assert_cmpint (s_id, ==, 15);
+ g_assert_cmpint (p_id, ==, 16);
+ g_assert_cmpstr (str, ==, "test");
+
+ result = tracker_db_journal_reader_next (reader, &error);
+ g_assert_no_error (error);
+ g_assert_cmpint (result, ==, TRUE);
+
+ type = tracker_db_journal_reader_get_entry_type (reader);
+ g_assert_cmpint (type, ==, TRACKER_DB_JOURNAL_END_TRANSACTION);
+
+ /* Third transaction */
+ result = tracker_db_journal_reader_next (reader, &error);
+ g_assert_no_error (error);
+ g_assert_cmpint (result, ==, TRUE);
+
+ type = tracker_db_journal_reader_get_entry_type (reader);
+ g_assert_cmpint (type, ==, TRACKER_DB_JOURNAL_START_TRANSACTION);
+
+ result = tracker_db_journal_reader_next (reader, &error);
+ g_assert_no_error (error);
+ g_assert_cmpint (result, ==, TRUE);
+
+ type = tracker_db_journal_reader_get_entry_type (reader);
+ g_assert_cmpint (type, ==, TRACKER_DB_JOURNAL_RESOURCE);
+
+ result = tracker_db_journal_reader_get_resource (reader, &id, &uri);
+ g_assert_cmpint (result, ==, TRUE);
+ g_assert_cmpint (id, ==, 17);
+ g_assert_cmpstr (uri, ==, "http://resource");
+
+ result = tracker_db_journal_reader_next (reader, &error);
+ g_assert_no_error (error);
+ g_assert_cmpint (result, ==, TRUE);
+
+ type = tracker_db_journal_reader_get_entry_type (reader);
+ g_assert_cmpint (type, ==, TRACKER_DB_JOURNAL_RESOURCE);
+
+ result = tracker_db_journal_reader_get_resource (reader, &id, &uri);
+ g_assert_cmpint (result, ==, TRUE);
+ g_assert_cmpint (id, ==, 18);
+ g_assert_cmpstr (uri, ==, "http://predicate");
+
+ result = tracker_db_journal_reader_next (reader, &error);
+ g_assert_no_error (error);
+ g_assert_cmpint (result, ==, TRUE);
+
+ type = tracker_db_journal_reader_get_entry_type (reader);
+ g_assert_cmpint (type, ==, TRACKER_DB_JOURNAL_RESOURCE);
+
+ result = tracker_db_journal_reader_get_resource (reader, &id, &uri);
+ g_assert_cmpint (result, ==, TRUE);
+ g_assert_cmpint (id, ==, 19);
+ g_assert_cmpstr (uri, ==, "http://resource");
+
+ result = tracker_db_journal_reader_next (reader, &error);
+ g_assert_no_error (error);
+ g_assert_cmpint (result, ==, TRUE);
+
+ type = tracker_db_journal_reader_get_entry_type (reader);
+ g_assert_cmpint (type, ==, TRACKER_DB_JOURNAL_INSERT_STATEMENT_ID);
+
+ result = tracker_db_journal_reader_get_statement_id (reader, NULL, &s_id, &p_id, &o_id);
+ g_assert_cmpint (result, ==, TRUE);
+ g_assert_cmpint (s_id, ==, 17);
+ g_assert_cmpint (p_id, ==, 18);
+ g_assert_cmpint (o_id, ==, 19);
+
+ result = tracker_db_journal_reader_next (reader, &error);
+ g_assert_no_error (error);
+ g_assert_cmpint (result, ==, TRUE);
+
+ type = tracker_db_journal_reader_get_entry_type (reader);
+ g_assert_cmpint (type, ==, TRACKER_DB_JOURNAL_END_TRANSACTION);
+
+ tracker_db_journal_reader_free (reader);
+}
+
+#endif /* DISABLE_JOURNAL */
+
+int
+main (int argc, char **argv)
+{
+ gchar *path;
+ int result;
+
+ g_test_init (&argc, &argv, NULL);
+
+#ifndef DISABLE_JOURNAL
+ /* None of these tests make sense in case of disabled journal */
+ g_test_add_func ("/libtracker-db/tracker-db-journal/write-functions",
+ test_write_functions);
+ g_test_add_func ("/libtracker-db/tracker-db-journal/read-functions",
+ test_read_functions);
+ g_test_add_func ("/libtracker-db/tracker-db-journal/init-and-shutdown",
+ test_init_and_shutdown);
+#endif /* DISABLE_JOURNAL */
+
+ result = g_test_run ();
+
+ /* Clean up */
+ path = g_build_filename (TOP_BUILDDIR, "tests", "libtracker-db", "tracker-store.journal", NULL);
+ g_unlink (path);
+ g_free (path);
+
+ return result;
+}