diff options
author | Charles Giessen <charles@lunarg.com> | 2022-04-14 20:33:06 +0300 |
---|---|---|
committer | Charles Giessen <46324611+charles-lunarg@users.noreply.github.com> | 2022-04-14 22:18:54 +0300 |
commit | 71bd6240afaef2c199b47f26d715091fa6fdf4f8 (patch) | |
tree | fb995d20246383612d73e78df56d26cebd49ae5e | |
parent | f503824ff8cbecfe39fb96ac89cbe959355dc311 (diff) |
Add app_key OverrideMetaLayer tests
-rw-r--r-- | tests/framework/test_util.cpp | 1 | ||||
-rw-r--r-- | tests/framework/test_util.h | 96 | ||||
-rw-r--r-- | tests/loader_layer_tests.cpp | 97 |
3 files changed, 193 insertions, 1 deletions
diff --git a/tests/framework/test_util.cpp b/tests/framework/test_util.cpp index 4f98a950f..3acc64050 100644 --- a/tests/framework/test_util.cpp +++ b/tests/framework/test_util.cpp @@ -174,6 +174,7 @@ std::string ManifestLayer::LayerDescription::get_manifest_str() const { print_vector_of_strings(out, "component_layers", component_layers); print_vector_of_strings(out, "blacklisted_layers", blacklisted_layers); print_vector_of_strings(out, "override_paths", override_paths); + print_vector_of_strings(out, "app_keys", app_keys); print_list_of_t(out, "pre_instance_functions", pre_instance_functions); out += "\n\t}"; diff --git a/tests/framework/test_util.h b/tests/framework/test_util.h index 1640f160a..19fad0370 100644 --- a/tests/framework/test_util.h +++ b/tests/framework/test_util.h @@ -574,6 +574,7 @@ struct ManifestLayer { BUILDER_VECTOR(LayerDescription, std::string, blacklisted_layers, blacklisted_layer) BUILDER_VECTOR(LayerDescription, std::string, override_paths, override_path) BUILDER_VECTOR(LayerDescription, FunctionOverride, pre_instance_functions, pre_instance_function) + BUILDER_VECTOR(LayerDescription, std::string, app_keys, app_key) std::string get_manifest_str() const; VkLayerProperties get_layer_properties() const; @@ -855,4 +856,97 @@ inline bool contains(std::vector<VkExtensionProperties> const& vec, const char* inline bool contains(std::vector<VkLayerProperties> const& vec, const char* name) { return std::any_of(std::begin(vec), std::end(vec), [name](VkLayerProperties const& elem) { return string_eq(name, elem.layerName); }); -}
\ No newline at end of file +} + +#if defined(__linux__) + +// find application path + name. Path cannot be longer than 1024, returns NULL if it is greater than that. +static inline std::string test_platform_executable_path() { + std::string buffer; + buffer.resize(1024); + ssize_t count = readlink("/proc/self/exe", &buffer[0], buffer.size()); + if (count == -1) return NULL; + if (count == 0) return NULL; + buffer[count] = '\0'; + buffer.resize(count); + return buffer; +} +#elif defined(__APPLE__) // defined(__linux__) +#include <libproc.h> +static inline std::string test_platform_executable_path() { + std::string buffer; + buffer.resize(1024); + pid_t pid = getpid(); + int ret = proc_pidpath(pid, &buffer[0], buffer.size()); + if (ret <= 0) return NULL; + buffer[ret] = '\0'; + buffer.resize(ret); + return buffer; +} +#elif defined(__DragonFly__) || defined(__FreeBSD__) || defined(__NetBSD__) +#include <sys/sysctl.h> +static inline std::string test_platform_executable_path() { + int mib[] = { + CTL_KERN, +#if defined(__NetBSD__) + KERN_PROC_ARGS, + -1, + KERN_PROC_PATHNAME, +#else + KERN_PROC, + KERN_PROC_PATHNAME, + -1, +#endif + }; + std::string buffer; + buffer.resize(1024); + size_t size = buffer.size(); + if (sysctl(mib, sizeof(mib) / sizeof(mib[0]), &buffer[0], &size, NULL, 0) < 0) { + return NULL; + } + buffer.resize(size); + + return buffer; +} +#elif defined(__Fuchsia__) +static inline std::string test_platform_executable_path() { return {}; } +#elif defined(__QNXNTO__) + +#define SYSCONFDIR "/etc" + +#include <fcntl.h> +#include <sys/stat.h> + +static inline std::string test_platform_executable_path() { + std::string buffer; + buffer.resize(1024); + int fd = open("/proc/self/exefile", O_RDONLY); + size_t rdsize; + + if (fd == -1) { + return NULL; + } + + rdsize = read(fd, &buffer[0], buffer.size()); + if (rdsize == size) { + return NULL; + } + buffer[rdsize] = 0x00; + close(fd); + buffer.resize(rdsize); + + return buffer; +} +#endif // defined (__QNXNTO__) +#if defined(WIN32) +static inline std::string test_platform_executable_path() { + std::string buffer; + buffer.resize(1024); + DWORD ret = GetModuleFileName(NULL, static_cast<LPSTR>(&buffer[0]), (DWORD)buffer.size()); + if (ret == 0) return NULL; + if (ret > buffer.size()) return NULL; + buffer.resize(ret); + buffer[ret] = '\0'; + return buffer; +} +#endif
\ No newline at end of file diff --git a/tests/loader_layer_tests.cpp b/tests/loader_layer_tests.cpp index 9f3b0d787..be5e18b6d 100644 --- a/tests/loader_layer_tests.cpp +++ b/tests/loader_layer_tests.cpp @@ -1146,6 +1146,103 @@ TEST(OverrideMetaLayer, ManifestFileFormatVersionTooOld) { env.layers.clear(); } +// app_key contains test executable name, should activate the override layer +TEST(OverrideMetaLayer, AppKeysDoesContainCurrentApplication) { + FrameworkEnvironment env; + env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)); + env.get_test_icd().add_physical_device({}); + + const char* regular_layer_name = "VK_LAYER_TestLayer"; + env.add_explicit_layer( + ManifestLayer{} + .set_file_format_version(ManifestVersion(1, 2, 0)) + .add_layer( + ManifestLayer::LayerDescription{}.set_name(regular_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), + "regular_test_layer.json"); + + std::string cur_path = test_platform_executable_path(); + + env.add_implicit_layer(ManifestLayer{} + .set_file_format_version(ManifestVersion(1, 2, 0)) + .add_layer(ManifestLayer::LayerDescription{} + .set_name(lunarg_meta_layer_name) + .add_component_layers({regular_layer_name}) + .set_disable_environment("DisableMeIfYouCan") + .add_app_key(cur_path)), + "meta_test_layer.json"); + { // global functions + uint32_t layer_count = 0; + EXPECT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceLayerProperties(&layer_count, nullptr)); + EXPECT_EQ(layer_count, 2U); + + std::array<VkLayerProperties, 2> layer_props; + EXPECT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceLayerProperties(&layer_count, layer_props.data())); + EXPECT_EQ(layer_count, 2U); + EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, layer_props)); + } + { + // instance + InstWrapper inst{env.vulkan_functions}; + inst.CheckCreate(); + VkPhysicalDevice phys_dev = inst.GetPhysDev(); + + uint32_t count = 0; + env.vulkan_functions.vkEnumerateDeviceLayerProperties(phys_dev, &count, nullptr); + EXPECT_EQ(2U, count); + std::array<VkLayerProperties, 2> layer_props; + env.vulkan_functions.vkEnumerateDeviceLayerProperties(phys_dev, &count, layer_props.data()); + EXPECT_EQ(2U, count); + EXPECT_TRUE(check_permutation({regular_layer_name, lunarg_meta_layer_name}, layer_props)); + } +} + +// app_key contains random strings, should not activate the override layer +TEST(OverrideMetaLayer, AppKeysDoesNotContainCurrentApplication) { + FrameworkEnvironment env; + env.add_icd(TestICDDetails(TEST_ICD_PATH_VERSION_2_EXPORT_ICD_GPDPA)); + env.get_test_icd().add_physical_device({}); + + const char* regular_layer_name = "VK_LAYER_TestLayer"; + env.add_explicit_layer( + ManifestLayer{} + .set_file_format_version(ManifestVersion(1, 2, 0)) + .add_layer( + ManifestLayer::LayerDescription{}.set_name(regular_layer_name).set_lib_path(TEST_LAYER_PATH_EXPORT_VERSION_2)), + "regular_test_layer.json"); + + env.add_implicit_layer(ManifestLayer{} + .set_file_format_version(ManifestVersion(1, 2, 0)) + .add_layer(ManifestLayer::LayerDescription{} + .set_name(lunarg_meta_layer_name) + .add_component_layers({regular_layer_name}) + .set_disable_environment("DisableMeIfYouCan") + .add_app_keys({"/Hello", "Hi", "./../Uh-oh", "C:/Windows/Only"})), + "meta_test_layer.json"); + { // global functions + uint32_t layer_count = 0; + EXPECT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceLayerProperties(&layer_count, nullptr)); + EXPECT_EQ(layer_count, 1U); + + std::array<VkLayerProperties, 2> layer_props; + EXPECT_EQ(VK_SUCCESS, env.vulkan_functions.vkEnumerateInstanceLayerProperties(&layer_count, layer_props.data())); + EXPECT_EQ(layer_count, 1U); + EXPECT_TRUE(string_eq(layer_props[0].layerName, regular_layer_name)); + } + { + // instance + InstWrapper inst{env.vulkan_functions}; + inst.CheckCreate(); + VkPhysicalDevice phys_dev = inst.GetPhysDev(); + + uint32_t count = 0; + env.vulkan_functions.vkEnumerateDeviceLayerProperties(phys_dev, &count, nullptr); + EXPECT_EQ(0U, count); + std::array<VkLayerProperties, 2> layer_props; + env.vulkan_functions.vkEnumerateDeviceLayerProperties(phys_dev, &count, layer_props.data()); + EXPECT_EQ(0U, count); + } +} + // This test makes sure that any layer calling GetPhysicalDeviceProperties2 inside of CreateInstance // succeeds and doesn't crash. TEST(LayerCreateInstance, GetPhysicalDeviceProperties2) { |