1
0
Fork 0

tests: Add backlight sanity test

It currently sanity checks the MetaOutput and MetaMonitor APIs.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3861>
This commit is contained in:
Jonas Ådahl 2024-07-01 15:38:44 +02:00
parent c22816393c
commit 332c4a1bf0
7 changed files with 203 additions and 0 deletions

View file

@ -336,6 +336,7 @@ gboolean meta_parse_monitor_mode (const char *string,
float *out_refresh_rate,
float fallback_refresh_rate);
META_EXPORT_TEST
gboolean meta_monitor_get_backlight_info (MetaMonitor *monitor,
int *backlight_min,
int *backlight_max);
@ -343,5 +344,6 @@ gboolean meta_monitor_get_backlight_info (MetaMonitor *monitor,
void meta_monitor_set_backlight (MetaMonitor *monitor,
int value);
META_EXPORT_TEST
gboolean meta_monitor_get_backlight (MetaMonitor *monitor,
int *value);

View file

@ -258,9 +258,11 @@ META_EXPORT_TEST
gboolean meta_output_get_max_bpc (MetaOutput *output,
unsigned int *max_bpc);
META_EXPORT_TEST
void meta_output_set_backlight (MetaOutput *output,
int backlight);
META_EXPORT_TEST
int meta_output_get_backlight (MetaOutput *output);
MetaPrivacyScreenState meta_output_get_privacy_screen_state (MetaOutput *output);

View file

@ -271,6 +271,11 @@ test_cases += [
'suite': 'unit',
'sources': [ 'monitor-util-tests.c', ],
},
{
'name': 'monitor-backlight',
'suite': 'backend',
'sources': [ 'monitor-backlight-tests.c', ]
},
{
'name': 'stage-views',
'suite': 'compositor',

View file

@ -771,6 +771,8 @@ meta_create_monitor_test_setup (MetaBackend *backend,
output_info->suggested_x = -1;
output_info->suggested_y = -1;
}
output_info->backlight_min = setup->outputs[i].backlight_min;
output_info->backlight_max = setup->outputs[i].backlight_max;
output_info->width_mm = setup->outputs[i].width_mm;
output_info->height_mm = setup->outputs[i].height_mm;
output_info->subpixel_order = META_SUBPIXEL_ORDER_UNKNOWN;

View file

@ -113,6 +113,8 @@ typedef struct _MonitorTestCaseOutput
gboolean hotplug_mode;
int suggested_x;
int suggested_y;
int backlight_min;
int backlight_max;
gboolean has_edid_info;
MetaEdidInfo edid_info;
} MonitorTestCaseOutput;

View file

@ -21,9 +21,50 @@
G_DEFINE_TYPE (MetaOutputTest, meta_output_test, META_TYPE_OUTPUT_NATIVE)
static void
on_backlight_changed (MetaOutput *output)
{
const MetaOutputInfo *info = meta_output_get_info (output);
int value = meta_output_get_backlight (output);
g_assert_cmpint (info->backlight_min, <=, value);
g_assert_cmpint (info->backlight_max, >=, value);
}
static void
meta_output_test_constructed (GObject *object)
{
MetaOutput *output = META_OUTPUT (object);
const MetaOutputInfo *info = meta_output_get_info (output);
if (info->backlight_min != info->backlight_max)
{
int backlight_range = info->backlight_max - info->backlight_min;
meta_output_set_backlight (output,
info->backlight_min + backlight_range / 2);
g_signal_connect (output, "backlight-changed",
G_CALLBACK (on_backlight_changed), NULL);
}
G_OBJECT_CLASS (meta_output_test_parent_class)->constructed (object);
}
static GBytes *
meta_output_test_read_edid (MetaOutputNative *output_native)
{
return NULL;
}
static void
meta_output_test_class_init (MetaOutputTestClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
MetaOutputNativeClass *output_native_class = META_OUTPUT_NATIVE_CLASS (klass);
object_class->constructed = meta_output_test_constructed;
output_native_class->read_edid = meta_output_test_read_edid;
}
static void

View file

@ -0,0 +1,149 @@
/*
* Copyright (C) 2025 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 <stdio.h>
#include "tests/meta-test/meta-context-test.h"
#include "tests/meta-monitor-test-utils.h"
static MonitorTestCaseSetup initial_test_case_setup = {
.modes = {
{
.width = 1024,
.height = 768,
.refresh_rate = 60.0
}
},
.n_modes = 1,
.outputs = {
{
.crtc = 0,
.modes = { 0 },
.n_modes = 1,
.preferred_mode = 0,
.possible_crtcs = { 0 },
.n_possible_crtcs = 1,
.width_mm = 222,
.height_mm = 125,
.is_laptop_panel = TRUE,
.backlight_min = 0,
.backlight_max = 300,
},
{
.crtc = 1,
.modes = { 0 },
.n_modes = 1,
.preferred_mode = 0,
.possible_crtcs = { 1 },
.n_possible_crtcs = 1,
.width_mm = 220,
.height_mm = 124
}
},
.n_outputs = 2,
.crtcs = {
{
.current_mode = 0
},
{
.current_mode = 0
}
},
.n_crtcs = 2
};
static MetaContext *test_context;
static MetaMonitorTestSetup *
create_test_setup (MetaBackend *backend)
{
return meta_create_monitor_test_setup (backend,
&initial_test_case_setup,
MONITOR_TEST_FLAG_NO_STORED);
}
static void
meta_test_backlight_sanity (void)
{
MetaBackend *backend = meta_context_get_backend (test_context);
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);
GList *monitors;
MetaMonitor *first_monitor;
MetaMonitor *second_monitor;
MetaOutput *output;
const MetaOutputInfo *output_info;
int backlight_min;
int backlight_max;
int backlight;
monitors = meta_monitor_manager_get_monitors (monitor_manager);
g_assert_cmpuint (g_list_length (monitors), ==, 2);
first_monitor = g_list_nth_data (monitors, 0);
second_monitor = g_list_nth_data (monitors, 1);
g_assert_true (meta_monitor_get_backlight_info (first_monitor,
&backlight_min,
&backlight_max));
g_assert_cmpint (backlight_min, ==, 0);
g_assert_cmpint (backlight_max, ==, 300);
g_assert_true (meta_monitor_get_backlight (first_monitor, &backlight));
g_assert_cmpint (backlight, >=, 0);
g_assert_cmpuint (g_list_length (meta_monitor_get_outputs (first_monitor)),
==,
1);
output = meta_monitor_get_main_output (first_monitor);
output_info = meta_output_get_info (output);
g_assert_cmpint (meta_output_get_backlight (output), >=, 0);
g_assert_cmpint (output_info->backlight_min, ==, 0);
g_assert_cmpint (output_info->backlight_max, ==, 300);
g_assert_false (meta_monitor_get_backlight_info (second_monitor,
NULL,
NULL));
g_assert_false (meta_monitor_get_backlight (second_monitor, NULL));
g_assert_cmpuint (g_list_length (meta_monitor_get_outputs (second_monitor)),
==,
1);
output = meta_monitor_get_main_output (second_monitor);
output_info = meta_output_get_info (output);
g_assert_cmpint (meta_output_get_backlight (output), ==, -1);
g_assert_cmpint (output_info->backlight_min, ==, 0);
g_assert_cmpint (output_info->backlight_max, ==, 0);
}
int
main (int argc,
char *argv[])
{
g_autoptr (MetaContext) context = NULL;
context = meta_create_test_context (META_CONTEXT_TEST_TYPE_TEST,
META_CONTEXT_TEST_FLAG_TEST_CLIENT);
g_assert (meta_context_configure (context, &argc, &argv, NULL));
test_context = context;
meta_init_monitor_test_setup (create_test_setup);
g_test_add_func ("/backends/backlight/sanity", meta_test_backlight_sanity);
return meta_context_test_run_tests (META_CONTEXT_TEST (context),
META_TEST_RUN_FLAG_NONE);
}