Add TestLayerDetails helper struct
authorCharles Giessen <charles@lunarg.com>
Tue, 25 Jan 2022 02:03:21 +0000 (19:03 -0700)
committerCharles Giessen <46324611+charles-lunarg@users.noreply.github.com>
Tue, 25 Jan 2022 19:32:56 +0000 (12:32 -0700)
Increasingly it is common to need more control over what the framework
environment does when adding layers. While only a refactor, this change
makes it easier to extend the functionality by adding data to the
TestLayerDetails struct.

The code to check whether the lib_path specified in add_layer_impl was
improved by using the `.stem()` functionality of the fs::path abstraction.

size_t was replaced with uint32_t where the compiler gave warnings.

tests/framework/test_environment.cpp
tests/framework/test_environment.h
tests/framework/test_util.cpp
tests/framework/test_util.h
tests/loader_regression_tests.cpp

index a7cdcd7b16b5115a02b70ecf6e012482b68c209f..6dc74dd3bfb40c7aa193b24c962d7a363992de4d 100644 (file)
@@ -205,31 +205,21 @@ void FrameworkEnvironment::add_icd(TestICDDetails icd_details) noexcept {
     }
 }
 void FrameworkEnvironment::add_implicit_layer(ManifestLayer layer_manifest, const std::string& json_name) noexcept {
-    add_layer_impl(layer_manifest, json_name, implicit_layer_folder, ManifestCategory::implicit_layer);
+    add_layer_impl(TestLayerDetails{layer_manifest, json_name}, implicit_layer_folder, ManifestCategory::implicit_layer);
 }
 void FrameworkEnvironment::add_explicit_layer(ManifestLayer layer_manifest, const std::string& json_name) noexcept {
-    add_layer_impl(layer_manifest, json_name, explicit_layer_folder, ManifestCategory::explicit_layer);
+    add_layer_impl(TestLayerDetails{layer_manifest, json_name}, explicit_layer_folder, ManifestCategory::explicit_layer);
+}
+void FrameworkEnvironment::add_implicit_layer(TestLayerDetails layer_details) noexcept {
+    add_layer_impl(layer_details, implicit_layer_folder, ManifestCategory::implicit_layer);
+}
+void FrameworkEnvironment::add_explicit_layer(TestLayerDetails layer_details) noexcept {
+    add_layer_impl(layer_details, explicit_layer_folder, ManifestCategory::explicit_layer);
 }
 
-void FrameworkEnvironment::add_layer_impl(ManifestLayer& layer_manifest, const std::string& json_name,
-                                          fs::FolderManager& folder_manager, ManifestCategory category) {
-    // We have a special case for any of the wrap objects layers so get the string to the path
-    std::string wrap_layer = fs::fixup_backslashes_in_path(fs::path(TEST_LAYER_WRAP_OBJECTS)).str();
-
-    // Strip off ending
-#if defined(WIN32)
-    std::string library_extension = ".dll";
-#elif defined(__APPLE__)
-    std::string library_extension = ".dylib";
-#else
-    std::string library_extension = ".so";
-#endif
-    size_t index = 0;
-    index = wrap_layer.find(library_extension, index);
-    assert(index != std::string::npos);
-    wrap_layer.replace(index, library_extension.size(), "");
-
-    for (auto& layer : layer_manifest.layers) {
+void FrameworkEnvironment::add_layer_impl(TestLayerDetails layer_details, fs::FolderManager& folder_manager,
+                                          ManifestCategory category) {
+    for (auto& layer : layer_details.layer_manifest.layers) {
         size_t cur_layer_index = layers.size();
         if (!layer.lib_path.str().empty()) {
             std::string new_layer_name = layer.name + "_" + std::to_string(cur_layer_index) + "_" + layer.lib_path.filename().str();
@@ -238,16 +228,18 @@ void FrameworkEnvironment::add_layer_impl(ManifestLayer& layer_manifest, const s
 
             // Don't load the layer binary if using any of the wrap objects layers, since it doesn't export the same interface
             // functions
-            if (fs::fixup_backslashes_in_path(layer.lib_path).str().rfind(wrap_layer) != 0) {
+            std::cout << "stem: " << layer.lib_path.stem().str() << "\n";
+            if (layer.lib_path.stem().str().find(fs::path(TEST_LAYER_WRAP_OBJECTS).stem().str()) == std::string::npos) {
                 layers.push_back(TestLayerHandle(new_layer_location));
                 layers.back().reset_layer();
             }
             layer.lib_path = new_layer_location;
         }
     }
-
-    auto layer_loc = folder_manager.write_manifest(json_name, layer_manifest.get_manifest_str());
-    platform_shim->add_manifest(category, layer_loc);
+    if (layer_details.add_to_regular_search_paths) {
+        auto layer_loc = folder_manager.write_manifest(layer_details.json_name, layer_details.layer_manifest.get_manifest_str());
+        platform_shim->add_manifest(category, layer_loc);
+    }
 }
 
 TestICD& FrameworkEnvironment::get_test_icd(int index) noexcept { return icds[index].get_test_icd(); }
index 5b2f18394aa48ae28b4cbd91ba7b72d2f2f1b118..9ddc10fefb59b151e11dea37160cb5493861feb1 100644 (file)
@@ -299,12 +299,23 @@ struct TestICDDetails {
     BUILDER_VALUE(TestICDDetails, bool, is_fake, false);
 };
 
+struct TestLayerDetails {
+    TestLayerDetails(ManifestLayer layer_manifest, const std::string& json_name) noexcept
+        : layer_manifest(layer_manifest), json_name(json_name) {}
+    BUILDER_VALUE(TestLayerDetails, ManifestLayer, layer_manifest, {});
+    BUILDER_VALUE(TestLayerDetails, std::string, json_name, "test_layer");
+    BUILDER_VALUE(TestLayerDetails, bool, add_to_regular_search_paths, true);
+    BUILDER_VALUE(TestLayerDetails, bool, is_fake, false);
+};
+
 struct FrameworkEnvironment {
     FrameworkEnvironment(DebugMode debug_mode = DebugMode::none) noexcept;
 
     void add_icd(TestICDDetails icd_details) noexcept;
     void add_implicit_layer(ManifestLayer layer_manifest, const std::string& json_name) noexcept;
+    void add_implicit_layer(TestLayerDetails layer_details) noexcept;
     void add_explicit_layer(ManifestLayer layer_manifest, const std::string& json_name) noexcept;
+    void add_explicit_layer(TestLayerDetails layer_details) noexcept;
 
     TestICD& get_test_icd(int index = 0) noexcept;
     TestICD& reset_icd(int index = 0) noexcept;
@@ -328,6 +339,5 @@ struct FrameworkEnvironment {
     std::string env_var_vk_icd_filenames;
 
    private:
-    void add_layer_impl(ManifestLayer& layer_manifest, const std::string& json_name, fs::FolderManager& folder_manager,
-                        ManifestCategory category);
+    void add_layer_impl(TestLayerDetails layer_details, fs::FolderManager& folder_manager, ManifestCategory category);
 };
index 193fa6dc5d42bd92cbe392f659d9e10a4b76ec2c..9f0efa87dba6a987ee8c92c9a7276bb3f25a29b5 100644 (file)
@@ -112,7 +112,7 @@ void print_vector_of_strings(std::string& out, const char* object_name, std::vec
         out += std::string(",\n\t\t\"") + object_name + "\": [";
         for (size_t i = 0; i < strings.size(); i++) {
             if (i > 0) out += ",\t\t\t";
-            out += "\"" + strings.at(i) + "\"";
+            out += "\"" + fs::fixup_backslashes_in_path(strings.at(i)) + "\"";
         }
         out += "]";
     }
index 057a387ef0d4c48c8da2b7f592d88a9501253d22..5578edaa60bd4afdbc7de653e4670bc101d2781e 100644 (file)
@@ -198,6 +198,10 @@ struct path {
     std::string& str() { return contents; }
     size_t size() const { return contents.size(); };
 
+    // equality
+    bool operator==(path const& other) const noexcept { return contents == other.contents; }
+    bool operator!=(path const& other) const noexcept { return !(*this == other); }
+
    private:
     std::string contents;
 };
index 366f214d17ca7b40b2b86cca13fa6e215125fa22..4a77169085b181e7d2c16e177a63ddf30814c44b 100644 (file)
@@ -371,7 +371,7 @@ TEST_F(EnumeratePhysicalDevices, TwoCall) {
     env->reset_icd().add_instance_extension(first_ext);
 
     const uint32_t real_device_count = 2;
-    for (size_t i = 0; i < real_device_count; i++) {
+    for (uint32_t i = 0; i < real_device_count; i++) {
         driver.physical_devices.emplace_back(std::string("physical_device_") + std::to_string(i), i + 1);
         driver.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
     }
@@ -397,7 +397,7 @@ TEST_F(EnumeratePhysicalDevices, MatchOneAndTwoCallNumbers) {
     env->reset_icd().add_instance_extension(first_ext);
 
     const uint32_t real_device_count = 3;
-    for (size_t i = 0; i < real_device_count; i++) {
+    for (uint32_t i = 0; i < real_device_count; i++) {
         driver.physical_devices.emplace_back(std::string("physical_device_") + std::to_string(i), i + 1);
         driver.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
     }
@@ -432,7 +432,7 @@ TEST_F(EnumeratePhysicalDevices, TwoCallIncomplete) {
     env->reset_icd().add_instance_extension(first_ext);
 
     const uint32_t real_device_count = 2;
-    for (size_t i = 0; i < real_device_count; i++) {
+    for (uint32_t i = 0; i < real_device_count; i++) {
         driver.physical_devices.emplace_back(std::string("physical_device_") + std::to_string(i), i + 1);
         driver.physical_devices.back().extensions.push_back({VK_EXT_PCI_BUS_INFO_EXTENSION_NAME, 0});
     }