[mutter] tests: Add unit tests framework runner



commit 00139755ff3a8da10311cf74a41eb93424f4136c
Author: Jonas Ådahl <jadahl gmail com>
Date:   Tue Sep 22 15:13:31 2015 +0800

    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

 src/Makefile-tests.am  |   16 ++++-
 src/tests/unit-tests.c |  147 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 159 insertions(+), 4 deletions(-)
---
diff --git a/src/Makefile-tests.am b/src/Makefile-tests.am
index 05c8428..043ef38 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 0000000..9d67def
--- /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 ();
+}


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]