From 7f840b721acfa3b46eefe2ab4f7351262c0a0f03 Mon Sep 17 00:00:00 2001 From: Pekka Paalanen Date: Mon, 11 Nov 2019 15:30:07 +0200 Subject: [PATCH] tests: migrate ivi-layout-test The ivi-layout-test comprises of two halves: the client and the plugin. This migrates the test to the new test harness. In the old harness, the plugin was built as the test in meson.build and it fork & exec'd the client part. In the new harness client tests start from the client program which sets up the compositor in-process, so now the client is built as the test in meson.build and the plugin is just an additional file. Therefore there is not need for the plugin for fork & exec anything anymore, so all that code is removed. Signed-off-by: Pekka Paalanen --- tests/ivi-layout-test-client.c | 17 ++++++-- tests/ivi-layout-test-plugin.c | 76 ++++------------------------------ tests/meson.build | 41 +++++++++--------- 3 files changed, 43 insertions(+), 91 deletions(-) diff --git a/tests/ivi-layout-test-client.c b/tests/ivi-layout-test-client.c index def9482e..b7edf8e8 100644 --- a/tests/ivi-layout-test-client.c +++ b/tests/ivi-layout-test-client.c @@ -34,6 +34,20 @@ #include "weston-test-client-helper.h" #include "ivi-application-client-protocol.h" #include "ivi-test.h" +#include "weston-test-fixture-compositor.h" + +static enum test_result_code +fixture_setup(struct weston_test_harness *harness) +{ + struct compositor_setup setup; + + compositor_setup_defaults(&setup); + setup.shell = SHELL_IVI; + setup.extra_module = "test-ivi-layout.so"; + + return weston_test_harness_execute_as_client(harness, &setup); +} +DECLARE_FIXTURE_SETUP(fixture_setup); struct runner { struct client *client; @@ -171,9 +185,6 @@ ivi_window_destroy(struct ivi_window *wnd) /******************************** tests ********************************/ /* - * This is a test program, launched by ivi-layout-test-plugin.c. Each TEST() - * is forked and exec'd as usual with the weston-test-runner framework. - * * These tests make use of weston_test_runner global interface exposed by * ivi-layout-test-plugin.c. This allows these tests to trigger compositor-side * checks. diff --git a/tests/ivi-layout-test-plugin.c b/tests/ivi-layout-test-plugin.c index 9e7bb3d9..cad2fa52 100644 --- a/tests/ivi-layout-test-plugin.c +++ b/tests/ivi-layout-test-plugin.c @@ -91,8 +91,6 @@ struct test_context { struct test_launcher { struct weston_compositor *compositor; struct test_context context; - char exe[2048]; - struct weston_process process; const struct ivi_layout_interface *layout_interface; }; @@ -181,56 +179,10 @@ bind_runner(struct wl_client *client, void *data, } } -static void -test_client_sigchld(struct weston_process *process, int status) -{ - struct test_launcher *launcher = - container_of(process, struct test_launcher, process); - struct weston_compositor *c = launcher->compositor; - - /* Chain up from weston-test-runner's exit code so that ninja - * knows the exit status and can report e.g. skipped tests. */ - if (WIFEXITED(status)) - weston_compositor_exit_with_code(c, WEXITSTATUS(status)); - else - weston_compositor_exit_with_code(c, EXIT_FAILURE); -} - -static void -idle_launch_client(void *data) -{ - struct test_launcher *launcher = data; - pid_t pid; - sigset_t allsigs; - - pid = fork(); - if (pid == -1) { - weston_log("fatal: failed to fork '%s': %s\n", launcher->exe, - strerror(errno)); - weston_compositor_exit_with_code(launcher->compositor, - EXIT_FAILURE); - return; - } - - if (pid == 0) { - sigfillset(&allsigs); - sigprocmask(SIG_UNBLOCK, &allsigs, NULL); - execl(launcher->exe, launcher->exe, NULL); - weston_log("compositor: executing '%s' failed: %s\n", - launcher->exe, strerror(errno)); - _exit(EXIT_FAILURE); - } - - launcher->process.pid = pid; - launcher->process.cleanup = test_client_sigchld; - weston_watch_process(&launcher->process); -} - WL_EXPORT int wet_module_init(struct weston_compositor *compositor, int *argc, char *argv[]) { - struct wl_event_loop *loop; struct test_launcher *launcher; const struct ivi_layout_interface *iface; @@ -245,13 +197,6 @@ wet_module_init(struct weston_compositor *compositor, if (!launcher) return -1; - if (weston_module_path_from_env("ivi-layout-test-client.ivi", - launcher->exe, - sizeof launcher->exe) == 0) { - weston_log("test setup failure: WESTON_MODULE_MAP not set\n"); - return -1; - } - launcher->compositor = compositor; launcher->layout_interface = iface; @@ -260,9 +205,6 @@ wet_module_init(struct weston_compositor *compositor, launcher, bind_runner) == NULL) return -1; - loop = wl_display_get_event_loop(compositor->wl_display); - wl_event_loop_add_idle(loop, idle_launch_client, launcher); - return 0; } @@ -301,18 +243,15 @@ runner_assert_fail(const char *cond, const char *file, int line, /*************************** tests **********************************/ /* - * This is a controller module: a plugin to ivi-shell.so, i.e. a sub-plugin. + * This is a IVI controller module requiring ivi-shell.so. * This module is specially written to execute tests that target the * ivi_layout API. * - * This module is listed in meson.build which handles - * this module specially by loading it in ivi-shell. - * - * Once Weston init completes, this module launches one test program: - * ivi-layout-test-client.ivi (ivi-layout-test-client.c). - * That program uses the weston-test-runner - * framework to fork and exec each TEST() in ivi-layout-test-client.c with a fresh - * connection to the single compositor instance. + * The test program containing the fixture setup and initiating the tests is + * test-ivi-layout-client (ivi-layout-test-client.c). + * That program uses the weston-test-runner framework to execute each TEST() + * in ivi-layout-test-client.c with a fresh connection to the single + * compositor instance. * * Each TEST() in ivi-layout-test-client.c will bind to weston_test_runner global * interface. A TEST() will set up the client state, and issue @@ -324,8 +263,7 @@ runner_assert_fail(const char *cond, const char *file, int line, * * A RUNNER_TEST() function simply returns when it succeeds. If it fails, * a fatal protocol error is sent to the client from runner_assert() or - * runner_assert_or_return(). This module catches the test program exit - * code and passes it out of Weston to the test harness. + * runner_assert_or_return(). * * A single TEST() in ivi-layout-test-client.c may use multiple RUNNER_TEST()s to * achieve multiple test points over a client action sequence. diff --git a/tests/meson.build b/tests/meson.build index fdfe13cb..b3f8ef26 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -220,30 +220,33 @@ if get_option('shell-ivi') ] tests_weston_plugin += [ ['ivi-layout-internal'], - [ - 'ivi-layout', - [ - 'ivi-layout-test-plugin.c', - weston_test_server_protocol_h, - weston_test_protocol_c, - ], - [ dep_libexec_weston ] - ], ] - exe_ivi_layout_client = executable( - 'ivi-layout-test-client', - 'ivi-layout-test-client.c', - weston_test_client_protocol_h, - weston_test_protocol_c, - ivi_application_client_protocol_h, - ivi_application_protocol_c, + ivi_layout_test_plugin = shared_library( + 'test-ivi-layout', + [ + 'ivi-layout-test-plugin.c', + weston_test_server_protocol_h, + weston_test_protocol_c, + ], include_directories: common_inc, - dependencies: dep_test_client, - install: false + dependencies: [ dep_libweston_private, dep_libexec_weston ], + name_prefix: '', + install: false, ) + env_modmap += 'test-ivi-layout.so=' + ivi_layout_test_plugin.full_path() + ';' - env_modmap += 'ivi-layout-test-client.ivi=@0@;'.format(exe_ivi_layout_client.full_path()) + tests += [ + { + 'name': 'ivi-layout-client', + 'sources': [ + 'ivi-layout-test-client.c', + ivi_application_client_protocol_h, + ivi_application_protocol_c, + ], + 'test_deps': [ ivi_layout_test_plugin ], + }, + ] endif env_test_weston = [