Tests close layer handles when necessary
authorCharles Giessen <charles@lunarg.com>
Tue, 15 Mar 2022 05:19:13 +0000 (23:19 -0600)
committerCharles Giessen <46324611+charles-lunarg@users.noreply.github.com>
Tue, 15 Mar 2022 05:31:26 +0000 (23:31 -0600)
The fs::FolderManager can't close objects that are in use, thus if the tests
keep open a binary then the destructor will fail to delete the file. This
commit manually cleans out the FrameworkEnvironment's loaded layers to prevent
this from happening.

tests/framework/test_util.cpp
tests/loader_layer_tests.cpp

index 5c1bbcf..f0b041a 100644 (file)
@@ -349,7 +349,7 @@ int create_folder(path const& path) {
 #endif
 }
 
-int delete_folder(path const& folder) {
+int delete_folder_contents(path const& folder) {
 #if defined(WIN32)
     if (INVALID_FILE_ATTRIBUTES == GetFileAttributes(folder.c_str()) && GetLastError() == ERROR_FILE_NOT_FOUND) {
         // nothing to delete
@@ -371,7 +371,6 @@ int delete_folder(path const& folder) {
             }
         } while (::FindNextFile(hFind, &fd));
         ::FindClose(hFind);
-        _rmdir(folder.c_str());
     }
     return 0;
 #else
@@ -399,13 +398,23 @@ int delete_folder(path const& folder) {
         ret = ret2;
     }
     closedir(dir);
-
-    if (!ret) ret = rmdir(folder.c_str());
     return ret;
 #endif
 }
 
+int delete_folder(path const& folder) {
+    int ret = delete_folder_contents(folder);
+    if (ret != 0) return ret;
+#if defined(WIN32)
+    _rmdir(folder.c_str());
+    return 0;
+#else
+    return rmdir(folder.c_str());
+#endif
+}
+
 FolderManager::FolderManager(path root_path, std::string name, DebugMode debug) : debug(debug), folder(root_path / name) {
+    delete_folder_contents(folder);
     create_folder(folder);
 }
 FolderManager::~FolderManager() {
index 5241ea1..743e63b 100644 (file)
@@ -955,6 +955,7 @@ TEST_F(OverrideMetaLayer, BasicOverridePaths) {
     FillDebugUtilsCreateDetails(inst.create_info, env->debug_log);
     inst.CheckCreate();
     ASSERT_TRUE(env->debug_log.find(std::string("Insert instance layer ") + regular_layer_name));
+    env->layers.clear();
 }
 
 TEST_F(OverrideMetaLayer, BasicOverridePathsIgnoreOtherLayers) {
@@ -995,6 +996,7 @@ TEST_F(OverrideMetaLayer, BasicOverridePathsIgnoreOtherLayers) {
     FillDebugUtilsCreateDetails(inst.create_info, env->debug_log);
     inst.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT);
     ASSERT_FALSE(env->debug_log.find(std::string("Insert instance layer ") + regular_layer_name));
+    env->layers.clear();
 }
 
 TEST_F(OverrideMetaLayer, OverridePathsInteractionWithVK_LAYER_PATH) {
@@ -1041,6 +1043,7 @@ TEST_F(OverrideMetaLayer, OverridePathsInteractionWithVK_LAYER_PATH) {
     inst.CheckCreate(VK_ERROR_LAYER_NOT_PRESENT);
     ASSERT_FALSE(env->debug_log.find(std::string("Insert instance layer ") + env_var_layer_name));
 
+    env->layers.clear();
     remove_env_var("VK_LAYER_PATH");
 }
 
@@ -1084,6 +1087,7 @@ TEST_F(OverrideMetaLayer, OverridePathsEnableImplicitLayerInDefaultPaths) {
     ASSERT_FALSE(env->debug_log.find(std::string("Insert instance layer ") + implicit_layer_name));
     ASSERT_TRUE(
         env->debug_log.find("Removing meta-layer VK_LAYER_LUNARG_override from instance layer list since it appears invalid."));
+    env->layers.clear();
 }
 
 TEST_F(OverrideMetaLayer, ManifestFileFormatVersionTooOld) {
@@ -1115,6 +1119,7 @@ TEST_F(OverrideMetaLayer, ManifestFileFormatVersionTooOld) {
     inst.CheckCreate();
     ASSERT_TRUE(env->debug_log.find(std::string("Insert instance layer ") + regular_layer_name));
     ASSERT_TRUE(env->debug_log.find("Indicating meta-layer-specific override paths, but using older JSON file version."));
+    env->layers.clear();
 }
 
 // This test makes sure that any layer calling GetPhysicalDeviceProperties2 inside of CreateInstance