diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index c92cda9a..70fce844 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -64,6 +64,7 @@ jobs: -Dgtkdoc=disabled \ -Dhttp_backend=curl \ -Dinternal_checks=true \ + -Dinternal_tests=true \ -Dsystem_dbus_proxy=xdg-dbus-proxy \ _build env: @@ -123,6 +124,7 @@ jobs: -Dgtkdoc=disabled \ -Dhttp_backend=soup \ -Dinternal_checks=true \ + -Dinternal_tests=true \ _build env: CFLAGS: -O2 -Wp,-D_FORTIFY_SOURCE=2 diff --git a/common/flatpak-utils-private.h b/common/flatpak-utils-private.h index d87c2ebe..f189f5ae 100644 --- a/common/flatpak-utils-private.h +++ b/common/flatpak-utils-private.h @@ -29,6 +29,11 @@ #include "flatpak-error.h" #include "flatpak-glib-backports-private.h" +#define XCONCATENATE(x, y) x ## y +#define CONCATENATE(x, y) XCONCATENATE(x, y) + +#define FLATPAK_UNIQUE_NAME(base) CONCATENATE(base, __COUNTER__) + #define AUTOFS_SUPER_MAGIC 0x0187 #define FLATPAK_XA_CACHE_VERSION 2 @@ -348,6 +353,21 @@ gboolean running_under_sudo (void); void flatpak_set_debugging (gboolean debugging); gboolean flatpak_is_debugging (void); +#ifdef INCLUDE_INTERNAL_TESTS +typedef void (*flatpak_test_fn) (void); +void flatpak_add_test (const char *path, flatpak_test_fn fn); +#define FLATPAK_INTERNAL_TEST(path, fn) \ + __attribute__((constructor)) static void \ + FLATPAK_UNIQUE_NAME(internal_test_) (void) { \ + flatpak_add_test (path, fn); \ + } +#else +#define FLATPAK_INTERNAL_TEST(path, fn) +#endif + +FLATPAK_EXTERN +void flatpak_add_all_tests (void); + #define FLATPAK_MESSAGE_ID "c7b39b1e006b464599465e105b361485" #endif /* __FLATPAK_UTILS_H__ */ diff --git a/common/flatpak-utils.c b/common/flatpak-utils.c index c333c350..37882320 100644 --- a/common/flatpak-utils.c +++ b/common/flatpak-utils.c @@ -2471,3 +2471,23 @@ flatpak_is_debugging (void) return is_debugging; } + +#ifdef INCLUDE_INTERNAL_TESTS +static GList *flatpak_test_paths = NULL; +static GList *flatpak_test_fns = NULL; + +void flatpak_add_test (const char *path, flatpak_test_fn fn) +{ + flatpak_test_paths = g_list_prepend (flatpak_test_paths, (void *)path); + flatpak_test_fns = g_list_prepend (flatpak_test_fns, fn); +} +#endif + +void flatpak_add_all_tests (void) +{ +#ifdef INCLUDE_INTERNAL_TESTS + for (GList *l1 = flatpak_test_paths, *l2 = flatpak_test_fns; l1 != NULL; l1 = l1->next, l2 = l2->next) { + g_test_add_func (l1->data, l2->data); + } +#endif +} diff --git a/meson.build b/meson.build index 117824ca..21c439e8 100644 --- a/meson.build +++ b/meson.build @@ -360,6 +360,10 @@ cdata.set_quoted('GETTEXT_PACKAGE', 'flatpak') cdata.set('FUSE_USE_VERSION', fuse_api) cdata.set_quoted('FUSERMOUNT', fusermount) +if get_option('internal_tests') + cdata.set('INCLUDE_INTERNAL_TESTS', 1) +endif + if get_option('system_bubblewrap') == '' cdata.set_quoted('HELPER', get_option('prefix') / get_option('libexecdir') / 'flatpak-bwrap') else diff --git a/meson_options.txt b/meson_options.txt index 31797b1f..fe32c4f9 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -74,6 +74,12 @@ option( description : 'enable internal checking', value : false, ) +option( + 'internal_tests', + type : 'boolean', + description : 'include internal tests in binary', + value : false, +) option( 'libzstd', type : 'feature', diff --git a/tests/testlibrary.c b/tests/testlibrary.c index b6537bb5..dc284bec 100644 --- a/tests/testlibrary.c +++ b/tests/testlibrary.c @@ -13,6 +13,8 @@ #include "can-use-fuse.h" #include "testlib.h" +void flatpak_add_all_tests (void); + static char *testdir; static char *flatpak_runtimedir; static char *flatpak_systemdir; @@ -5128,6 +5130,8 @@ main (int argc, char *argv[]) g_test_add_func ("/library/installation-unused-refs-excludes-pins", test_installation_unused_refs_excludes_pins); g_test_add_func ("/library/installation-unused-refs-across-installations", test_installation_unused_refs_across_installations); + flatpak_add_all_tests (); + global_setup (); res = g_test_run ();