diff --git a/test/libmpv_common.h b/test/libmpv_common.h new file mode 100644 index 0000000000..584353a8b0 --- /dev/null +++ b/test/libmpv_common.h @@ -0,0 +1,90 @@ +/* + * This file is part of mpv. + * + * mpv is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * mpv 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with mpv. If not, see . + */ + +#include +#include +#include +#include +#include +#include +#include + +// Stolen from osdep/compiler.h +#ifdef __GNUC__ +#define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format(printf, a1, a2))) +#define MP_NORETURN __attribute__((noreturn)) +#else +#define PRINTF_ATTRIBUTE(a1, a2) +#define MP_NORETURN +#endif + +// Broken crap with __USE_MINGW_ANSI_STDIO +#if defined(__MINGW32__) && defined(__GNUC__) && !defined(__clang__) +#undef PRINTF_ATTRIBUTE +#define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (gnu_printf, a1, a2))) +#endif + +// Global handle. +static mpv_handle *ctx; +MP_NORETURN PRINTF_ATTRIBUTE(1, 2) + +static inline void fail(const char *fmt, ...) +{ + if (fmt) { + va_list va; + va_start(va, fmt); + vfprintf(stderr, fmt, va); + va_end(va); + } + exit(1); +} + +static inline void exit_cleanup(void) +{ + mpv_destroy(ctx); +} + +static inline mpv_event *wrap_wait_event(void) +{ + while (1) { + mpv_event *ev = mpv_wait_event(ctx, 1); + if (ev->event_id == MPV_EVENT_NONE) + continue; + + if (ev->event_id == MPV_EVENT_LOG_MESSAGE) { + mpv_event_log_message *msg = (mpv_event_log_message*)ev->data; + printf("[%s:%s] %s", msg->prefix, msg->level, msg->text); + if (msg->log_level <= MPV_LOG_LEVEL_ERROR) + fail("error was logged"); + } else { + return ev; + } + } +} + +static inline void check_api_error(int status) +{ + if (status < 0) + fail("mpv API error: %s\n", mpv_error_string(status)); +} + +static inline void initialize(void) +{ + check_api_error(mpv_set_option_string(ctx, "vo", "null")); + check_api_error(mpv_request_log_messages(ctx, "debug")); + check_api_error(mpv_initialize(ctx)); +} diff --git a/test/libmpv_test_file_loading.c b/test/libmpv_test_file_loading.c new file mode 100644 index 0000000000..10d324e0a8 --- /dev/null +++ b/test/libmpv_test_file_loading.c @@ -0,0 +1,64 @@ +/* + * This file is part of mpv. + * + * mpv is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * mpv 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with mpv. If not, see . + */ + +#include "libmpv_common.h" + +static void test_file_loading(char *file) +{ + const char *cmd[] = {"loadfile", file, NULL}; + check_api_error(mpv_command(ctx, cmd)); + bool loaded = false; + bool finished = false; + while (!finished) { + mpv_event *event = wrap_wait_event(); + switch (event->event_id) { + case MPV_EVENT_FILE_LOADED: + // make sure it loads before exiting + loaded = true; + break; + case MPV_EVENT_END_FILE: + if (loaded) + finished = true; + break; + } + } + if (!finished) + fail("Unable to load test file!\n"); +} + +int main(int argc, char *argv[]) +{ + if (argc != 2) + return 1; + atexit(exit_cleanup); + + ctx = mpv_create(); + if (!ctx) + return 1; + + initialize(); + + const char *fmt = "================ TEST: %s ================\n"; + printf(fmt, "test_file_loading"); + test_file_loading(argv[1]); + printf("================ SHUTDOWN ================\n"); + + mpv_command_string(ctx, "quit"); + while (wrap_wait_event()->event_id != MPV_EVENT_SHUTDOWN) {} + + return 0; +} diff --git a/test/libmpv_test_lavfi_complex.c b/test/libmpv_test_lavfi_complex.c new file mode 100644 index 0000000000..1a04741c64 --- /dev/null +++ b/test/libmpv_test_lavfi_complex.c @@ -0,0 +1,70 @@ +/* + * This file is part of mpv. + * + * mpv is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * mpv 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with mpv. If not, see . + */ + +#include "libmpv_common.h" + +static void test_lavfi_complex(char *file) +{ + const char *cmd[] = {"loadfile", file, NULL}; + check_api_error(mpv_command(ctx, cmd)); + bool finished = false; + bool loaded = false; + while (!finished) { + mpv_event *event = wrap_wait_event(); + switch (event->event_id) { + case MPV_EVENT_FILE_LOADED: + // Add file as external and toggle lavfi-complex on. + if (!loaded) { + check_api_error(mpv_set_property_string(ctx, "external-files", file)); + const char *add_cmd[] = {"video-add", file, "auto", NULL}; + check_api_error(mpv_command(ctx, add_cmd)); + check_api_error(mpv_set_property_string(ctx, "lavfi-complex", "[vid1] [vid2] vstack [vo]")); + } + loaded = true; + break; + case MPV_EVENT_END_FILE: + if (loaded) + finished = true; + break; + } + } + if (!finished) + fail("Lavfi complex failed!\n"); +} + +int main(int argc, char *argv[]) +{ + if (argc != 2) + return 1; + atexit(exit_cleanup); + + ctx = mpv_create(); + if (!ctx) + return 1; + + initialize(); + + const char *fmt = "================ TEST: %s ================\n"; + printf(fmt, "test_lavfi_complex"); + test_lavfi_complex(argv[1]); + printf("================ SHUTDOWN ================\n"); + + mpv_command_string(ctx, "quit"); + while (wrap_wait_event()->event_id != MPV_EVENT_SHUTDOWN) {} + + return 0; +} diff --git a/test/libmpv_test.c b/test/libmpv_test_options.c similarity index 60% rename from test/libmpv_test.c rename to test/libmpv_test_options.c index 2c72c8c9a9..777ccf8dc3 100644 --- a/test/libmpv_test.c +++ b/test/libmpv_test_options.c @@ -15,27 +15,7 @@ * License along with mpv. If not, see . */ -#include -#include -#include -#include -#include -#include - -// Stolen from osdep/compiler.h -#ifdef __GNUC__ -#define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format(printf, a1, a2))) -#define MP_NORETURN __attribute__((noreturn)) -#else -#define PRINTF_ATTRIBUTE(a1, a2) -#define MP_NORETURN -#endif - -// Broken crap with __USE_MINGW_ANSI_STDIO -#if defined(__MINGW32__) && defined(__GNUC__) && !defined(__clang__) -#undef PRINTF_ATTRIBUTE -#define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (gnu_printf, a1, a2))) -#endif +#include "libmpv_common.h" // Dummy values for test_options_and_properties static const char *str = "string"; @@ -43,54 +23,6 @@ static int flag = 1; static int64_t int_ = 20; static double double_ = 1.5; -// Global handle. -static mpv_handle *ctx; - -MP_NORETURN PRINTF_ATTRIBUTE(1, 2) -static void fail(const char *fmt, ...) -{ - if (fmt) { - va_list va; - va_start(va, fmt); - vfprintf(stderr, fmt, va); - va_end(va); - } - exit(1); -} - - -static void exit_cleanup(void) -{ - if (ctx) - mpv_destroy(ctx); -} - -static mpv_event *wrap_wait_event(void) -{ - while (1) { - mpv_event *ev = mpv_wait_event(ctx, 1); - - if (ev->event_id == MPV_EVENT_NONE) { - continue; - } else if (ev->event_id == MPV_EVENT_LOG_MESSAGE) { - mpv_event_log_message *msg = (mpv_event_log_message*)ev->data; - printf("[%s:%s] %s", msg->prefix, msg->level, msg->text); - if (msg->log_level <= MPV_LOG_LEVEL_ERROR) - fail("error was logged"); - } else { - return ev; - } - } -} - -static void check_api_error(int status) -{ - if (status < 0) - fail("mpv API error: %s\n", mpv_error_string(status)); -} - -/****/ - static void check_double(const char *property, double expect) { double result_double; @@ -169,60 +101,6 @@ static void set_options_and_properties(const char *options[], const char *proper } } -/****/ - -static void test_file_loading(char *file) -{ - const char *cmd[] = {"loadfile", file, NULL}; - check_api_error(mpv_command(ctx, cmd)); - int loaded = 0; - int finished = 0; - while (!finished) { - mpv_event *event = wrap_wait_event(); - switch (event->event_id) { - case MPV_EVENT_FILE_LOADED: - // make sure it loads before exiting - loaded = 1; - break; - case MPV_EVENT_END_FILE: - if (loaded) - finished = 1; - break; - } - } - if (!finished) - fail("Unable to load test file!\n"); -} - -static void test_lavfi_complex(char *file) -{ - const char *cmd[] = {"loadfile", file, NULL}; - check_api_error(mpv_command(ctx, cmd)); - int finished = 0; - int loaded = 0; - while (!finished) { - mpv_event *event = wrap_wait_event(); - switch (event->event_id) { - case MPV_EVENT_FILE_LOADED: - // Add file as external and toggle lavfi-complex on. - if (!loaded) { - check_api_error(mpv_set_property_string(ctx, "external-files", file)); - const char *add_cmd[] = {"video-add", file, "auto", NULL}; - check_api_error(mpv_command(ctx, add_cmd)); - check_api_error(mpv_set_property_string(ctx, "lavfi-complex", "[vid1] [vid2] vstack [vo]")); - } - loaded = 1; - break; - case MPV_EVENT_END_FILE: - if (loaded) - finished = 1; - break; - } - } - if (!finished) - fail("Lavfi complex failed!\n"); -} - // Ensure that setting options/properties work correctly and // have the expected values. static void test_options_and_properties(void) @@ -255,8 +133,6 @@ static void test_options_and_properties(void) set_options_and_properties(options, properties, formats); - check_api_error(mpv_initialize(ctx)); - check_results(options, formats); check_results(properties, formats); @@ -273,7 +149,7 @@ static void test_options_and_properties(void) int main(int argc, char *argv[]) { - if (argc != 2) + if (argc != 1) return 1; atexit(exit_cleanup); @@ -281,21 +157,13 @@ int main(int argc, char *argv[]) if (!ctx) return 1; - check_api_error(mpv_set_option_string(ctx, "vo", "null")); - // load osc too to see if it works - check_api_error(mpv_set_option_string(ctx, "osc", "yes")); - check_api_error(mpv_request_log_messages(ctx, "debug")); + initialize(); const char *fmt = "================ TEST: %s ================\n"; - printf(fmt, "test_options_and_properties"); test_options_and_properties(); - printf(fmt, "test_file_loading"); - test_file_loading(argv[1]); - printf(fmt, "test_lavfi_complex"); - test_lavfi_complex(argv[1]); - printf("================ SHUTDOWN ================\n"); + mpv_command_string(ctx, "quit"); while (wrap_wait_event()->event_id != MPV_EVENT_SHUTDOWN) {} diff --git a/test/meson.build b/test/meson.build index 9becfa9819..258a3f341d 100644 --- a/test/meson.build +++ b/test/meson.build @@ -116,14 +116,23 @@ paths = executable('paths', 'paths.c', include_directories: incdir, test('paths', paths) if get_option('libmpv') - exe = executable('libmpv-test', 'libmpv_test.c', - include_directories: incdir, link_with: libmpv) file = join_paths(source_root, 'etc', 'mpv-icon-8bit-16x16.png') - test('libmpv', exe, args: file, timeout: 60, should_fail: not features['lua'], suite: 'libmpv') + + exe = executable('libmpv-test-file-loading', 'libmpv_test_file_loading.c', + include_directories: incdir, link_with: libmpv) + test('libmpv-test-file-loading', exe, args: file, suite: 'libmpv') + + exe = executable('libmpv-test-lavfi-complex', 'libmpv_test_lavfi_complex.c', + include_directories: incdir, link_with: libmpv) + test('libmpv-test-lavfi-complex', exe, args: file, suite: 'libmpv') + + exe = executable('libmpv-test-options', 'libmpv_test_options.c', + include_directories: incdir, link_with: libmpv) + test('libmpv-test-options', exe, suite: 'libmpv') exe = executable('libmpv-encode', 'libmpv_encode.c', include_directories: incdir, link_with: libmpv) - test('libmpv-encode', exe, timeout: 30, suite: 'libmpv') + test('libmpv-encode', exe, suite: 'libmpv') mpvlib = libmpv shared = get_option('default_library') == 'shared'