summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonas Ådahl <jadahl@gmail.com>2015-09-22 15:13:31 +0800
committerJonas Ådahl <jadahl@gmail.com>2016-02-26 17:52:01 +0800
commit00139755ff3a8da10311cf74a41eb93424f4136c (patch)
tree94670d4c83eb53a69d028f3abbcee85959aa04f7
parent95dd681d4714ebf60f75ad214d832e9623b8313d (diff)
downloadmutter-00139755ff3a8da10311cf74a41eb93424f4136c.tar.gz
tests: Add unit tests framework runner
Separate from meta-test-runner which runs metatests testing window manager operations, a new test program (mutter-unit-tests) is introduced. This is meant to run unit test like tests on various units in mutter. An initial test testing the order of MetaLater callback invokation was added. https://bugzilla.gnome.org/show_bug.cgi?id=755605
-rw-r--r--src/Makefile-tests.am16
-rw-r--r--src/tests/unit-tests.c147
2 files changed, 159 insertions, 4 deletions
diff --git a/src/Makefile-tests.am b/src/Makefile-tests.am
index 05c842850..043ef382e 100644
--- a/src/Makefile-tests.am
+++ b/src/Makefile-tests.am
@@ -19,9 +19,9 @@ installedtestsdir = $(datadir)/installed-tests/mutter
installedtests_DATA = mutter-all.test
installedtestsbindir = $(libexecdir)/installed-tests/mutter
-installedtestsbin_PROGRAMS = mutter-test-client mutter-test-runner
+installedtestsbin_PROGRAMS = mutter-test-client mutter-test-runner mutter-test-unit-tests
else
-noinst_PROGRAMS += mutter-test-client mutter-test-runner
+noinst_PROGRAMS += mutter-test-client mutter-test-runner mutter-test-unit-tests
endif
EXTRA_DIST += tests/mutter-all.test.in
@@ -32,11 +32,19 @@ mutter_test_client_LDADD = $(MUTTER_LIBS) libmutter.la
mutter_test_runner_SOURCES = tests/test-runner.c
mutter_test_runner_LDADD = $(MUTTER_LIBS) libmutter.la
-.PHONY: run-tests
+mutter_test_unit_tests_SOURCES = tests/unit-tests.c
+mutter_test_unit_tests_LDADD = $(MUTTER_LIBS) libmutter.la
-run-tests: mutter-test-client mutter-test-runner
+.PHONY: run-tests run-test-runner-tests run-unit-tests
+
+run-test-runner-tests: mutter-test-client mutter-test-runner
./mutter-test-runner $(dist_stacking_DATA)
+run-unit-tests: mutter-test-unit-tests
+ ./mutter-test-unit-tests
+
+run-tests: run-test-runner-tests run-unit-tests
+
endif
# Some random test programs for bits of the code
diff --git a/src/tests/unit-tests.c b/src/tests/unit-tests.c
new file mode 100644
index 000000000..9d67defb3
--- /dev/null
+++ b/src/tests/unit-tests.c
@@ -0,0 +1,147 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+
+/*
+ * Copyright (C) 2015 Red Hat, Inc.
+ *
+ * This program 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 program 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 program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <glib.h>
+#include <stdlib.h>
+
+#include <meta/main.h>
+#include <meta/util.h>
+
+#include "compositor/meta-plugin-manager.h"
+
+typedef struct _MetaTestLaterOrderCallbackData
+{
+ GMainLoop *loop; /* Loop to terminate when done. */
+ int callback_num; /* Callback number integer. */
+ int *expected_callback_num; /* Pointer to the expected callback number. */
+} MetaTestLaterOrderCallbackData;
+
+static gboolean
+test_later_order_callback (gpointer user_data)
+{
+ MetaTestLaterOrderCallbackData *data = user_data;
+
+ g_assert_cmpint (data->callback_num, ==, *data->expected_callback_num);
+
+ if (*data->expected_callback_num == 0)
+ g_main_loop_quit (data->loop);
+ else
+ (*data->expected_callback_num)--;
+
+ return FALSE;
+}
+
+static void
+meta_test_util_later_order (void)
+{
+ GMainLoop *loop;
+ int expected_callback_num;
+ int i;
+ const int num_callbacks = 3;
+ MetaTestLaterOrderCallbackData callback_data[num_callbacks];
+
+ loop = g_main_loop_new (NULL, FALSE);
+
+ /* Schedule three BEFORE_DRAW callbacks each with its own number associated
+ * with it.
+ */
+ for (i = 0; i < num_callbacks; i++)
+ {
+ callback_data[i] = (MetaTestLaterOrderCallbackData) {
+ .loop = loop,
+ .callback_num = i,
+ .expected_callback_num = &expected_callback_num,
+ };
+ meta_later_add (META_LATER_BEFORE_REDRAW,
+ test_later_order_callback,
+ &callback_data[i],
+ NULL);
+ }
+
+ /* Check that the callbacks are invoked in the opposite order that they were
+ * scheduled. Each callback will decrease the number by 1 after it checks the
+ * validity.
+ */
+ expected_callback_num = num_callbacks - 1;
+ g_main_loop_run (loop);
+ g_assert_cmpint (expected_callback_num, ==, 0);
+ g_main_loop_unref (loop);
+}
+
+static gboolean
+run_tests (gpointer data)
+{
+ gboolean ret;
+
+ ret = g_test_run ();
+
+ meta_quit (ret != 0);
+
+ return FALSE;
+}
+
+static void
+init_tests (int argc, char **argv)
+{
+ g_test_init (&argc, &argv, NULL);
+ g_test_bug_base ("http://bugzilla.gnome.org/show_bug.cgi?id=");
+
+ g_test_add_func ("/util/meta-later/order", meta_test_util_later_order);
+}
+
+int
+main (int argc, char *argv[])
+{
+ GOptionContext *ctx;
+ GError *error = NULL;
+
+ ctx = g_option_context_new (NULL);
+
+ if (!g_option_context_parse (ctx,
+ &argc, &argv, &error))
+ {
+ g_printerr ("%s", error->message);
+ return 1;
+ }
+
+ g_option_context_free (ctx);
+
+ char *fake_args[] = { NULL, "--wayland" };
+ fake_args[0] = argv[0];
+ char **fake_argv = fake_args;
+ int fake_argc = 2;
+
+ ctx = meta_get_option_context ();
+ if (!g_option_context_parse (ctx, &fake_argc, &fake_argv, &error))
+ {
+ g_printerr ("mutter: %s\n", error->message);
+ exit (1);
+ }
+ g_option_context_free (ctx);
+
+ meta_plugin_manager_load ("default");
+
+ meta_init ();
+ meta_register_with_session ();
+
+ init_tests (argc, argv);
+ g_idle_add (run_tests, NULL);
+
+ return meta_run ();
+}