diff --git a/tests/pressure-vessel/adverb-preload.c b/tests/pressure-vessel/adverb-preload.c index aea1c3cd7c5e8b1951c8c93046638959d495bbe0..fbe595a5dbb81fb7ce0487e8269a8ea55820eeca 100644 --- a/tests/pressure-vessel/adverb-preload.c +++ b/tests/pressure-vessel/adverb-preload.c @@ -22,34 +22,50 @@ typedef struct typedef struct { - int unused; + gboolean can_discover_platform; } Config; +static const Config default_config = { + .can_discover_platform = TRUE, +}; + static void setup (Fixture *f, gconstpointer context) { - G_GNUC_UNUSED const Config *config = context; + const Config *config = context; g_autoptr(GError) local_error = NULL; gsize i; + if (config == NULL) + config = &default_config; + f->old_fds = tests_check_fd_leaks_enter (); f->bwrap = flatpak_bwrap_new (flatpak_bwrap_empty_env); - f->lib_temp_dirs = pv_per_arch_dirs_new (&local_error); - if (f->lib_temp_dirs == NULL) + if (config->can_discover_platform) { - g_test_skip (local_error->message); - return; - } + f->lib_temp_dirs = pv_per_arch_dirs_new (&local_error); + + if (f->lib_temp_dirs == NULL) + { + g_test_skip (local_error->message); + return; + } - g_test_message ("Cross-platform module prefix: %s", - f->lib_temp_dirs->libdl_token_path); + g_test_message ("Cross-platform module prefix: %s", + f->lib_temp_dirs->libdl_token_path); - for (i = 0; i < PV_N_SUPPORTED_ARCHITECTURES; i++) - g_test_message ("Concrete path for %s architecture: %s", - pv_multiarch_tuples[i], - f->lib_temp_dirs->abi_paths[i]); + for (i = 0; i < PV_N_SUPPORTED_ARCHITECTURES; i++) + g_test_message ("Concrete path for %s architecture: %s", + pv_multiarch_tuples[i], + f->lib_temp_dirs->abi_paths[i]); + + } + else + { + g_test_message ("Pretending we cannot use $LIB/$PLATFORM"); + } } static void @@ -85,9 +101,6 @@ test_basic (Fixture *f, gboolean ret; gsize i; - if (f->lib_temp_dirs == NULL) - return; - ret = pv_adverb_set_up_preload_modules (f->bwrap, f->lib_temp_dirs, modules, @@ -101,20 +114,35 @@ test_basic (Fixture *f, i = 0; g_string_assign (expected, "LD_AUDIT="); - g_string_append_printf (expected, "%s/libaudit.so", - f->lib_temp_dirs->libdl_token_path); + + if (f->lib_temp_dirs != NULL) + g_string_append_printf (expected, "%s/libaudit.so", + f->lib_temp_dirs->libdl_token_path); + else + g_string_append (expected, "/opt/libaudit.so"); + g_assert_cmpstr (f->bwrap->envp[i], ==, expected->str); i++; /* Order is preserved, independent of whether an ABI is specified */ g_string_assign (expected, "LD_PRELOAD="); - g_string_append_printf (expected, "%s/libpreload.so", - f->lib_temp_dirs->libdl_token_path); + + if (f->lib_temp_dirs != NULL) + g_string_append_printf (expected, "%s/libpreload.so", + f->lib_temp_dirs->libdl_token_path); + else + g_string_append (expected, "/opt/libpreload.so"); + g_string_append_c (expected, ':'); g_string_append (expected, "/opt/unspecified.so"); g_string_append_c (expected, ':'); - g_string_append_printf (expected, "%s/libpreload2.so", - f->lib_temp_dirs->libdl_token_path); + + if (f->lib_temp_dirs != NULL) + g_string_append_printf (expected, "%s/libpreload2.so", + f->lib_temp_dirs->libdl_token_path); + else + g_string_append (expected, "/opt/libpreload2.so"); + g_string_append_c (expected, ':'); g_string_append (expected, "/opt/unspecified2.so"); g_assert_cmpstr (f->bwrap->envp[i], ==, expected->str); @@ -126,6 +154,9 @@ test_basic (Fixture *f, { g_autofree gchar *target = NULL; + if (f->lib_temp_dirs == NULL) + continue; + /* Empty module entries are ignored */ if (modules[i].name[0] == '\0') continue; @@ -172,9 +203,6 @@ test_biarch (Fixture *f, gboolean ret; gsize i; - if (f->lib_temp_dirs == NULL) - return; - ret = pv_adverb_set_up_preload_modules (f->bwrap, f->lib_temp_dirs, modules, @@ -194,8 +222,19 @@ test_biarch (Fixture *f, g_string_assign (expected, "LD_PRELOAD="); g_string_append (expected, "/opt/libpreload.so"); g_string_append_c (expected, ':'); - g_string_append_printf (expected, "%s/libpreload.so", - f->lib_temp_dirs->libdl_token_path); + + if (f->lib_temp_dirs != NULL) + { + g_string_append_printf (expected, "%s/libpreload.so", + f->lib_temp_dirs->libdl_token_path); + } + else + { + g_string_append (expected, "/opt/lib0/libpreload.so"); + g_string_append_c (expected, ':'); + g_string_append (expected, "/opt/lib1/libpreload.so"); + } + g_assert_cmpstr (f->bwrap->envp[i], ==, expected->str); i++; @@ -205,6 +244,9 @@ test_biarch (Fixture *f, { g_autofree gchar *target = NULL; + if (f->lib_temp_dirs == NULL) + continue; + g_string_assign (path, f->lib_temp_dirs->abi_paths[i]); g_string_append_c (path, G_DIR_SEPARATOR); g_string_append (path, "libpreload.so"); @@ -253,9 +295,6 @@ test_gameoverlayrenderer (Fixture *f, G_STATIC_ASSERT (PV_N_SUPPORTED_ARCHITECTURES == 2); - if (f->lib_temp_dirs == NULL) - return; - ret = pv_adverb_set_up_preload_modules (f->bwrap, f->lib_temp_dirs, modules, @@ -271,8 +310,19 @@ test_gameoverlayrenderer (Fixture *f, g_string_assign (expected, "LD_PRELOAD="); g_string_append (expected, "/opt/steam/some-other-abi/gameoverlayrenderer.so"); g_string_append_c (expected, ':'); - g_string_append_printf (expected, "%s/gameoverlayrenderer.so", - f->lib_temp_dirs->libdl_token_path); + + if (f->lib_temp_dirs != NULL) + { + g_string_append_printf (expected, "%s/gameoverlayrenderer.so", + f->lib_temp_dirs->libdl_token_path); + } + else + { + g_string_append (expected, "/opt/steam/ubuntu12_32/gameoverlayrenderer.so"); + g_string_append_c (expected, ':'); + g_string_append (expected, "/opt/steam/ubuntu12_64/gameoverlayrenderer.so"); + } + g_string_append_c (expected, ':'); g_string_append (expected, "/opt/steam/some-other-abi/gameoverlayrenderer.so"); g_assert_cmpstr (f->bwrap->envp[i], ==, expected->str); @@ -284,6 +334,9 @@ test_gameoverlayrenderer (Fixture *f, { g_autofree gchar *target = NULL; + if (f->lib_temp_dirs == NULL) + continue; + g_string_assign (path, f->lib_temp_dirs->abi_paths[i]); g_string_append_c (path, G_DIR_SEPARATOR); g_string_append (path, "gameoverlayrenderer.so"); @@ -347,9 +400,6 @@ test_repetition (Fixture *f, gboolean ret; gsize i; - if (f->lib_temp_dirs == NULL) - return; - ret = pv_adverb_set_up_preload_modules (f->bwrap, f->lib_temp_dirs, modules, @@ -363,30 +413,95 @@ test_repetition (Fixture *f, i = 0; g_string_assign (expected, "LD_PRELOAD="); - g_string_append_printf (expected, "%s/libfirst.so", - f->lib_temp_dirs->libdl_token_path); + + if (f->lib_temp_dirs != NULL) + g_string_append_printf (expected, "%s/libfirst.so", + f->lib_temp_dirs->libdl_token_path); + else + g_string_append (expected, "/opt/lib0/libfirst.so"); + g_string_append_c (expected, ':'); - g_string_append_printf (expected, "%s/same-basename.so", - f->lib_temp_dirs->libdl_token_path); + + if (f->lib_temp_dirs != NULL) + g_string_append_printf (expected, "%s/same-basename.so", + f->lib_temp_dirs->libdl_token_path); + else + g_string_append (expected, "/opt/lib0/one/same-basename.so"); + g_string_append_c (expected, ':'); /* We don't do the per-architecture split if there's a basename * collision */ g_string_append (expected, "/opt/lib0/two/same-basename.so"); g_string_append_c (expected, ':'); - g_string_append_printf (expected, "%s/libpreload.so", - f->lib_temp_dirs->libdl_token_path); + + if (f->lib_temp_dirs != NULL) + { + g_string_append_printf (expected, "%s/libpreload.so", + f->lib_temp_dirs->libdl_token_path); + } + else + { + g_string_append (expected, "/opt/lib0/libpreload.so"); +#if PV_N_SUPPORTED_ARCHITECTURES > 1 + g_string_append_c (expected, ':'); + g_string_append (expected, "/opt/lib1/libpreload.so"); +#endif + } + #if defined(__x86_64__) || defined(__i386__) g_string_append_c (expected, ':'); - g_string_append_printf (expected, "%s/gameoverlayrenderer.so", - f->lib_temp_dirs->libdl_token_path); + + if (f->lib_temp_dirs != NULL) + { + g_string_append_printf (expected, "%s/gameoverlayrenderer.so", + f->lib_temp_dirs->libdl_token_path); + } + else + { + g_string_append (expected, "/opt/steam/ubuntu12_32/gameoverlayrenderer.so"); + g_string_append_c (expected, ':'); + g_string_append (expected, "/opt/steam/ubuntu12_64/gameoverlayrenderer.so"); + } #endif + g_string_append_c (expected, ':'); - g_string_append_printf (expected, "%s/libmiddle.so", - f->lib_temp_dirs->libdl_token_path); + + if (f->lib_temp_dirs != NULL) + g_string_append_printf (expected, "%s/libmiddle.so", + f->lib_temp_dirs->libdl_token_path); + else + g_string_append (expected, "/opt/lib0/libmiddle.so"); + g_string_append_c (expected, ':'); - /* The duplicates don't appear in the search path a second time */ - g_string_append_printf (expected, "%s/liblast.so", - f->lib_temp_dirs->libdl_token_path); + + if (f->lib_temp_dirs != NULL) + { + /* If we are able to split up the modules by architecture, + * then the duplicates don't appear in the search path a second time */ + g_string_append_printf (expected, "%s/liblast.so", + f->lib_temp_dirs->libdl_token_path); + } + else + { + /* If we were unable to split up the modules by architecture, + * we change as little as possible, so in this case we do not + * deduplicate */ + g_string_append (expected, "/opt/lib0/libpreload.so"); + g_string_append_c (expected, ':'); +#if PV_N_SUPPORTED_ARCHITECTURES > 1 + g_string_append (expected, "/opt/lib1/libpreload.so"); + g_string_append_c (expected, ':'); +#endif +#if defined(__x86_64__) || defined(__i386__) + g_string_append (expected, "/opt/steam/ubuntu12_32/gameoverlayrenderer.so"); + g_string_append_c (expected, ':'); + g_string_append (expected, "/opt/steam/ubuntu12_64/gameoverlayrenderer.so"); + g_string_append_c (expected, ':'); +#endif + + g_string_append (expected, "/opt/lib0/liblast.so"); + } + g_assert_cmpstr (f->bwrap->envp[i], ==, expected->str); i++; @@ -398,6 +513,9 @@ test_repetition (Fixture *f, { gsize j; + if (f->lib_temp_dirs == NULL) + continue; + for (j = 0; j < G_N_ELEMENTS (modules); j++) { g_autofree gchar *target = NULL; @@ -434,6 +552,9 @@ test_repetition (Fixture *f, { g_autofree gchar *target = NULL; + if (f->lib_temp_dirs == NULL) + continue; + g_string_assign (path, f->lib_temp_dirs->abi_paths[i]); g_string_append_c (path, G_DIR_SEPARATOR); g_string_append (path, "gameoverlayrenderer.so"); @@ -450,6 +571,10 @@ test_repetition (Fixture *f, #endif } +static const Config cannot_discover_platform = { + .can_discover_platform = FALSE, +}; + int main (int argc, char **argv) @@ -462,14 +587,21 @@ main (int argc, g_setenv ("PRESSURE_VESSEL_TEST_STANDARDIZE_PLATFORM", "1", TRUE); _srt_tests_init (&argc, &argv, NULL); - g_test_add ("/basic", Fixture, NULL, - setup, test_basic, teardown); - g_test_add ("/biarch", Fixture, NULL, - setup, test_biarch, teardown); - g_test_add ("/gameoverlayrenderer", Fixture, NULL, - setup, test_gameoverlayrenderer, teardown); - g_test_add ("/repetition", Fixture, NULL, - setup, test_repetition, teardown); + +#define add_test(name, function) \ + do { \ + g_test_add (name, \ + Fixture, NULL, \ + setup, function, teardown); \ + g_test_add (name "/cannot-discover-platform", \ + Fixture, &cannot_discover_platform, \ + setup, function, teardown); \ + } while (0) + + add_test ("/basic", test_basic); + add_test ("/biarch", test_biarch); + add_test ("/gameoverlayrenderer", test_gameoverlayrenderer); + add_test ("/repetition", test_repetition); return g_test_run (); }