summaryrefslogtreecommitdiff
path: root/tests/core/tracker-service-test.c
diff options
context:
space:
mode:
authorCarlos Garnacho <carlosg@gnome.org>2022-04-03 14:36:10 +0200
committerCarlos Garnacho <carlosg@gnome.org>2022-04-03 18:46:57 +0200
commit26decd7b7cefa7e76a1a86a8ca8b21aff1cb9904 (patch)
treef6d4de8c0d4a743b547626d49273e84a74cce496 /tests/core/tracker-service-test.c
parentaa2785c8d3a8b76d08efec75a1c5ba2fb45d5d14 (diff)
downloadtracker-26decd7b7cefa7e76a1a86a8ca8b21aff1cb9904.tar.gz
tests: Rename libtracker-data tests to 'core'
Abandon the static library name for these tests.
Diffstat (limited to 'tests/core/tracker-service-test.c')
-rw-r--r--tests/core/tracker-service-test.c311
1 files changed, 311 insertions, 0 deletions
diff --git a/tests/core/tracker-service-test.c b/tests/core/tracker-service-test.c
new file mode 100644
index 000000000..6b75d71d7
--- /dev/null
+++ b/tests/core/tracker-service-test.c
@@ -0,0 +1,311 @@
+/*
+ * Copyright (C) 2020, Red Hat Inc.
+ *
+ * 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 <string.h>
+#include <locale.h>
+
+#include <glib/gstdio.h>
+#include <gio/gio.h>
+
+#include <libtracker-sparql/tracker-sparql.h>
+
+typedef struct _TestInfo TestInfo;
+
+struct _TestInfo {
+ const gchar *test_name;
+ gboolean expect_query_error;
+ gboolean local_connection;
+};
+
+const TestInfo tests[] = {
+ { "service/service-query-1", FALSE },
+ { "service/service-after-triples-1", FALSE },
+ { "service/service-before-triples-1", FALSE },
+ { "service/service-local-filter-1", FALSE },
+ { "service/service-union-with-local-1", FALSE },
+ { "service/service-union-with-local-2", FALSE },
+ { "service/service-union-with-local-3", FALSE },
+ { "service/service-var-1", FALSE },
+ { "service/service-var-2", FALSE },
+ { "service/service-empty-1", FALSE },
+ { "service/service-empty-2", FALSE },
+};
+
+static GDBusConnection *dbus_conn = NULL;
+static TrackerSparqlConnection *local = NULL;
+static TrackerSparqlConnection *remote = NULL;
+static TrackerEndpointDBus *endpoint = NULL;
+static GMainLoop *endpoint_loop = NULL;
+
+static void
+check_result (TrackerSparqlCursor *cursor,
+ const TestInfo *test_info,
+ const gchar *results_filename,
+ GError *error)
+{
+ GString *test_results;
+ gchar *results;
+ GError *nerror = NULL;
+
+ if (test_info->expect_query_error) {
+ g_assert_true (error != NULL);
+ } else {
+ g_assert_no_error (error);
+ }
+
+ g_file_get_contents (results_filename, &results, NULL, &nerror);
+ g_assert_no_error (nerror);
+ g_clear_error (&nerror);
+
+ /* compare results with reference output */
+
+ test_results = g_string_new ("");
+
+ if (cursor) {
+ gint col;
+
+ while (tracker_sparql_cursor_next (cursor, NULL, &error)) {
+ GString *row_str = g_string_new (NULL);
+
+ for (col = 0; col < tracker_sparql_cursor_get_n_columns (cursor); col++) {
+ const gchar *str;
+
+ if (col > 0) {
+ g_string_append (row_str, "\t");
+ }
+
+ str = tracker_sparql_cursor_get_string (cursor, col, NULL);
+
+ /* Hack to avoid misc properties that might tamper with
+ * test reproduceability in DESCRIBE and other unrestricted
+ * queries.
+ */
+ if (g_strcmp0 (str, TRACKER_PREFIX_NRL "modified") == 0 ||
+ g_strcmp0 (str, TRACKER_PREFIX_NRL "added") == 0) {
+ g_string_free (row_str, TRUE);
+ row_str = NULL;
+ break;
+ }
+
+ if (str != NULL) {
+ /* bound variable */
+ g_string_append_printf (row_str, "\"%s\"", str);
+ }
+ }
+
+ if (row_str) {
+ g_string_append (test_results, row_str->str);
+ g_string_free (row_str, TRUE);
+ g_string_append (test_results, "\n");
+ }
+ }
+ } else if (test_info->expect_query_error) {
+ g_assert_true (error != NULL && error->domain == TRACKER_SPARQL_ERROR);
+ g_string_free (test_results, TRUE);
+ g_free (results);
+ return;
+ }
+
+ g_assert_no_error (error);
+
+ if (strcmp (results, test_results->str) != 0) {
+ /* print result difference */
+ gchar *quoted_results;
+ gchar *command_line;
+ gchar *quoted_command_line;
+ gchar *shell;
+ gchar *diff;
+
+ quoted_results = g_shell_quote (test_results->str);
+ command_line = g_strdup_printf ("echo -n %s | diff -u %s -", quoted_results, results_filename);
+ quoted_command_line = g_shell_quote (command_line);
+ shell = g_strdup_printf ("sh -c %s", quoted_command_line);
+ g_spawn_command_line_sync (shell, &diff, NULL, NULL, &error);
+ g_assert_no_error (error);
+
+ g_error ("%s", diff);
+
+ g_free (quoted_results);
+ g_free (command_line);
+ g_free (quoted_command_line);
+ g_free (shell);
+ g_free (diff);
+ }
+
+ g_string_free (test_results, TRUE);
+ g_free (results);
+}
+
+static gpointer
+thread_func (gpointer user_data)
+{
+ GMainContext *context;
+ GError *error = NULL;
+
+ context = g_main_context_new ();
+ g_main_context_push_thread_default (context);
+
+ endpoint_loop = g_main_loop_new (context, FALSE);
+
+ endpoint = tracker_endpoint_dbus_new (user_data, dbus_conn, NULL, NULL, &error);
+ g_assert_no_error (error);
+
+ if (!endpoint)
+ return NULL;
+
+ g_main_loop_run (endpoint_loop);
+
+ return NULL;
+}
+
+static void
+test_sparql_query (TestInfo *test_info,
+ gconstpointer context)
+{
+ TrackerSparqlCursor *cursor;
+ GError *error = NULL;
+ gchar *query, *query_filename, *service_query;
+ gchar *results_filename;
+ gchar *prefix, *test_prefix, *uri;
+ GFile *ontology;
+ GThread *thread;
+
+ /* initialization */
+ prefix = g_build_filename (TOP_SRCDIR, "tests", "core", NULL);
+ test_prefix = g_build_filename (prefix, test_info->test_name, NULL);
+ g_free (prefix);
+
+ ontology = g_file_new_for_path (TEST_ONTOLOGIES_DIR);
+ local = tracker_sparql_connection_new (0, NULL, ontology, NULL, &error);
+ g_assert_no_error (error);
+ g_object_unref (ontology);
+
+ remote = tracker_sparql_connection_new (0, NULL, ontology, NULL, &error);
+ g_assert_no_error (error);
+
+ thread = g_thread_new (NULL, thread_func, remote);
+ while (!endpoint) {
+ g_usleep (100);
+ }
+
+ tracker_sparql_connection_map_connection (local,
+ "other-connection",
+ remote);
+
+ query_filename = g_strconcat (test_prefix, ".rq", NULL);
+ g_file_get_contents (query_filename, &query, NULL, &error);
+ g_assert_no_error (error);
+ g_free (query_filename);
+
+ results_filename = g_strconcat (test_prefix, ".out", NULL);
+ g_free (test_prefix);
+
+ if (test_info->local_connection) {
+ uri = g_strdup_printf ("private:other-connection");
+ } else {
+ uri = g_strdup_printf ("dbus:%s",
+ g_dbus_connection_get_unique_name (dbus_conn));
+ }
+
+ /* perform actual query */
+ service_query = g_strdup_printf (query, uri);
+ cursor = tracker_sparql_connection_query (local, service_query, NULL, &error);
+ g_free (service_query);
+ g_free (query);
+ g_free (uri);
+
+ check_result (cursor, test_info, results_filename, error);
+ g_free (results_filename);
+ g_clear_object (&cursor);
+
+ /* cleanup */
+ g_main_loop_quit (endpoint_loop);
+ g_main_loop_unref (endpoint_loop);
+ endpoint_loop = NULL;
+
+ g_clear_object (&local);
+ g_clear_object (&remote);
+ g_clear_object (&endpoint);
+ g_thread_unref (thread);
+}
+
+static void
+setup (TestInfo *info,
+ gconstpointer context)
+{
+ const TestInfo *test = context;
+
+ *info = *test;
+}
+
+static void
+setup_local (TestInfo *info,
+ gconstpointer context)
+{
+ const TestInfo *test = context;
+
+ *info = *test;
+ info->local_connection = TRUE;
+}
+
+static void
+teardown (TestInfo *info,
+ gconstpointer context)
+{
+}
+
+int
+main (int argc, char **argv)
+{
+ GError *error = NULL;
+ gint result;
+ guint i;
+
+ setlocale (LC_COLLATE, "en_US.utf8");
+
+ g_test_init (&argc, &argv, NULL);
+
+ dbus_conn = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
+ g_assert_no_error (error);
+
+ /* add DBus test cases */
+ for (i = 0; i < G_N_ELEMENTS (tests); i++) {
+ gchar *testpath;
+
+ testpath = g_strconcat ("/core/dbus/", tests[i].test_name, NULL);
+ g_test_add (testpath, TestInfo, &tests[i], setup, test_sparql_query, teardown);
+ g_free (testpath);
+ }
+
+ /* add local test cases */
+ for (i = 0; i < G_N_ELEMENTS (tests); i++) {
+ gchar *testpath;
+
+ testpath = g_strconcat ("/core/local/", tests[i].test_name, NULL);
+ g_test_add (testpath, TestInfo, &tests[i], setup_local, test_sparql_query, teardown);
+ g_free (testpath);
+ }
+
+ /* run tests */
+ result = g_test_run ();
+
+ return result;
+}