From 00139755ff3a8da10311cf74a41eb93424f4136c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Tue, 22 Sep 2015 15:13:31 +0800 Subject: [PATCH] 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(-) create mode 100644 src/tests/unit-tests.c 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 . + */ + +#include +#include + +#include +#include + +#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 (); +}