Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/KhronosGroup/Vulkan-Loader.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Giessen <charles@lunarg.com>2022-04-14 20:33:06 +0300
committerCharles Giessen <46324611+charles-lunarg@users.noreply.github.com>2022-04-14 22:18:54 +0300
commit71bd6240afaef2c199b47f26d715091fa6fdf4f8 (patch)
treefb995d20246383612d73e78df56d26cebd49ae5e
parentf503824ff8cbecfe39fb96ac89cbe959355dc311 (diff)
Add app_key OverrideMetaLayer tests
-rw-r--r--tests/framework/test_util.cpp1
-rw-r--r--tests/framework/test_util.h96
-rw-r--r--tests/loader_layer_tests.cpp97
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) {