tests: Add headless start test case

Test that mutter starts properly when there are no monitors connected
yet, and that things work when a monitor is eventually connected.

https://bugzilla.gnome.org/show_bug.cgi?id=730551
This commit is contained in:
Jonas Ådahl 2017-08-18 14:27:42 +08:00
parent 5b37901b57
commit 3f6a2d02fd
4 changed files with 232 additions and 5 deletions

1
.gitignore vendored
View File

@ -55,6 +55,7 @@ mutter-restart-helper
mutter-test-client
mutter-test-runner
mutter-test-unit-tests
mutter-test-headless-start-test
mutter-all.test
org.gnome.mutter.gschema.valid
org.gnome.mutter.gschema.xml

View File

@ -2,6 +2,13 @@
if HAVE_WAYLAND
test_programs = \
mutter-test-client \
mutter-test-runner \
mutter-test-unit-tests \
mutter-test-headless-start-test \
$(NULL)
if BUILDOPT_INSTALL_TESTS
stackingdir = $(pkgdatadir)/tests/stacking
dist_stacking_DATA = \
@ -19,9 +26,9 @@ installedtestsdir = $(datadir)/installed-tests/mutter
installedtests_DATA = mutter-all.test
installedtestsbindir = $(libexecdir)/installed-tests/mutter
installedtestsbin_PROGRAMS = mutter-test-client mutter-test-runner mutter-test-unit-tests
installedtestsbin_PROGRAMS = $(test_programs)
else
noinst_PROGRAMS += mutter-test-client mutter-test-runner mutter-test-unit-tests
noinst_PROGRAMS += $(test_programs)
endif
EXTRA_DIST += tests/mutter-all.test.in
@ -52,7 +59,17 @@ mutter_test_unit_tests_SOURCES = \
$(NULL)
mutter_test_unit_tests_LDADD = $(MUTTER_LIBS) libmutter-$(LIBMUTTER_API_VERSION).la
.PHONY: run-tests run-test-runner-tests run-unit-tests
mutter_test_headless_start_test_SOURCES = \
tests/headless-start-test.c \
tests/headless-start-test.h \
tests/meta-backend-test.c \
tests/meta-backend-test.h \
tests/meta-monitor-manager-test.c \
tests/meta-monitor-manager-test.h \
$(NULL)
mutter_test_headless_start_test_LDADD = $(MUTTER_LIBS) libmutter-$(LIBMUTTER_API_VERSION).la
.PHONY: run-tests run-test-runner-tests run-unit-tests run-headless-start-test
run-test-runner-tests: mutter-test-client mutter-test-runner
./mutter-test-runner $(dist_stacking_DATA)
@ -60,7 +77,10 @@ run-test-runner-tests: mutter-test-client mutter-test-runner
run-unit-tests: mutter-test-unit-tests
./mutter-test-unit-tests
run-tests: run-test-runner-tests run-unit-tests
run-headless-start-test: mutter-test-headless-start-test
./mutter-test-headless-start-test
run-tests: run-test-runner-tests run-unit-tests run-headless-start-test
endif

View File

@ -0,0 +1,203 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* Copyright (C) 2017 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 "config.h"
#include "backends/meta-monitor-manager-private.h"
#include "compositor/meta-plugin-manager.h"
#include "core/main-private.h"
#include "meta/main.h"
#include "tests/meta-backend-test.h"
#include "tests/meta-monitor-manager-test.h"
#include "wayland/meta-wayland.h"
#define ALL_TRANSFORMS ((1 << (META_MONITOR_TRANSFORM_FLIPPED_270 + 1)) - 1)
static gboolean
run_tests (gpointer data)
{
MetaBackend *backend = meta_get_backend ();
MetaSettings *settings = meta_backend_get_settings (backend);
gboolean ret;
meta_settings_override_experimental_features (settings);
meta_settings_enable_experimental_feature (
settings,
META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER);
ret = g_test_run ();
meta_quit (ret != 0);
return FALSE;
}
static void
meta_test_headless_start (void)
{
MetaBackend *backend = meta_get_backend ();
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);
g_assert_cmpint ((int) monitor_manager->n_modes,
==,
0);
g_assert_cmpint ((int) monitor_manager->n_outputs,
==,
0);
g_assert_cmpint ((int) monitor_manager->n_crtcs,
==,
0);
g_assert_null (monitor_manager->monitors);
g_assert_null (monitor_manager->logical_monitors);
g_assert_cmpint (monitor_manager->screen_width,
==,
META_MONITOR_MANAGER_MIN_SCREEN_WIDTH);
g_assert_cmpint (monitor_manager->screen_height,
==,
META_MONITOR_MANAGER_MIN_SCREEN_HEIGHT);
}
static void
meta_test_headless_monitor_getters (void)
{
MetaDisplay *display;
MetaScreen *screen;
int index;
display = meta_get_display ();
screen = display->screen;
index = meta_screen_get_monitor_index_for_rect (screen,
&(MetaRectangle) { 0 });
g_assert_cmpint (index, ==, -1);
}
static void
meta_test_headless_monitor_connect (void)
{
MetaBackend *backend = meta_get_backend ();
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);
MetaMonitorManagerTest *monitor_manager_test =
META_MONITOR_MANAGER_TEST (monitor_manager);
MetaMonitorTestSetup *test_setup;
MetaCrtcMode **modes;
MetaCrtc **possible_crtcs;
GList *logical_monitors;
ClutterActor *stage;
test_setup = g_new0 (MetaMonitorTestSetup, 1);
test_setup->n_modes = 1;
test_setup->modes = g_new0 (MetaCrtcMode, test_setup->n_modes);
test_setup->modes[0] = (MetaCrtcMode) {
.mode_id = 1,
.width = 1024,
.height = 768,
.refresh_rate = 60.0
};
test_setup->n_crtcs = 1;
test_setup->crtcs = g_new0 (MetaCrtc, test_setup->n_crtcs);
test_setup->crtcs[0] = (MetaCrtc) {
.crtc_id = 1,
.all_transforms = ALL_TRANSFORMS
};
modes = g_new0 (MetaCrtcMode *, 1);
modes[0] = &test_setup->modes[0];
possible_crtcs = g_new0 (MetaCrtc *, 1);
possible_crtcs[0] = &test_setup->crtcs[0];
test_setup->n_outputs = 1;
test_setup->outputs = g_new0 (MetaOutput, test_setup->n_outputs);
test_setup->outputs[0] = (MetaOutput) {
.winsys_id = 1,
.name = g_strdup ("DP-1"),
.vendor = g_strdup ("MetaProduct's Inc."),
.product = g_strdup ("MetaMonitor"),
.serial = g_strdup ("0x987654"),
.preferred_mode = modes[0],
.n_modes = 1,
.modes = modes,
.n_possible_crtcs = 1,
.possible_crtcs = possible_crtcs,
.backlight = -1,
.connector_type = META_CONNECTOR_TYPE_DisplayPort
};
meta_monitor_manager_test_emulate_hotplug (monitor_manager_test, test_setup);
logical_monitors =
meta_monitor_manager_get_logical_monitors (monitor_manager);
g_assert_cmpint (g_list_length (logical_monitors), ==, 1);
g_assert_cmpint (monitor_manager->screen_width, ==, 1024);
g_assert_cmpint (monitor_manager->screen_height, ==, 768);
stage = meta_backend_get_stage (backend);
g_assert_cmpint (clutter_actor_get_width (stage), ==, 1024);
g_assert_cmpint (clutter_actor_get_height (stage), ==, 768);
}
static MetaMonitorTestSetup *
create_headless_test_setup (void)
{
return g_new0 (MetaMonitorTestSetup, 1);
}
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=");
MetaMonitorTestSetup *initial_test_setup;
initial_test_setup = create_headless_test_setup ();
meta_monitor_manager_test_init_test_setup (initial_test_setup);
g_test_add_func ("/headless-start/start", meta_test_headless_start);
g_test_add_func ("/headless-start/monitor-getters",
meta_test_headless_monitor_getters);
g_test_add_func ("/headless-start/connect",
meta_test_headless_monitor_connect);
}
int
main (int argc, char *argv[])
{
init_tests (argc, argv);
meta_plugin_manager_load ("default");
meta_override_compositor_configuration (META_COMPOSITOR_TYPE_WAYLAND,
META_TYPE_BACKEND_TEST);
meta_wayland_override_display_name ("mutter-test-display");
meta_init ();
meta_register_with_session ();
g_idle_add (run_tests, NULL);
return meta_run ();
}

View File

@ -372,7 +372,10 @@ meta_monitor_manager_test_calculate_monitor_mode_scale (MetaMonitorManager *mana
output = meta_monitor_get_main_output (monitor);
output_test = output->driver_private;
return output_test->scale;
if (output_test)
return output_test->scale;
else
return 1;
}
static float *