This is an automated email from the ASF dual-hosted git repository.

martinzink pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git

commit ab396b7aa67e60355c69017bdce6065c852c418b
Author: Gabor Gyimesi <gamezb...@gmail.com>
AuthorDate: Mon Mar 6 09:28:12 2023 +0100

    MINIFICPP-2066 Close handle when querying file owner on Windows
    Closes #1523
    
    Signed-off-by: Martin Zink <martinz...@apache.org>
---
 extensions/http-curl/tests/C2UpdateAssetTest.cpp              | 3 +++
 libminifi/include/utils/file/FileUtils.h                      | 2 ++
 libminifi/test/TestBase.h                                     | 4 ++--
 libminifi/test/keyvalue-tests/PersistentStateStorageTest.cpp  | 5 +++--
 libminifi/test/keyvalue-tests/VolatileMapStateStorageTest.cpp | 2 ++
 libminifi/test/unit/FileStreamTests.cpp                       | 1 +
 6 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/extensions/http-curl/tests/C2UpdateAssetTest.cpp 
b/extensions/http-curl/tests/C2UpdateAssetTest.cpp
index 9c606c989..ac545d180 100644
--- a/extensions/http-curl/tests/C2UpdateAssetTest.cpp
+++ b/extensions/http-curl/tests/C2UpdateAssetTest.cpp
@@ -26,6 +26,7 @@
 #include "HTTPHandlers.h"
 #include "utils/IntegrationTestUtils.h"
 #include "utils/Environment.h"
+#include "utils/file/FileUtils.h"
 
 class FileProvider : public ServerAwareHandler {
  public:
@@ -257,4 +258,6 @@ int main() {
       assert(false);
     }
   }
+
+  std::filesystem::current_path(minifi::utils::file::get_executable_dir());
 }
diff --git a/libminifi/include/utils/file/FileUtils.h 
b/libminifi/include/utils/file/FileUtils.h
index e4fb301d5..db37d861b 100644
--- a/libminifi/include/utils/file/FileUtils.h
+++ b/libminifi/include/utils/file/FileUtils.h
@@ -480,6 +480,8 @@ inline std::optional<std::string> get_file_owner(const 
std::filesystem::path& fi
     return std::nullopt;
   }
 
+  auto close_file_handle = gsl::finally([&file_handle] { 
CloseHandle(file_handle); });
+
   // Get the owner SID of the file.
   return_code = GetSecurityInfo(
     file_handle,
diff --git a/libminifi/test/TestBase.h b/libminifi/test/TestBase.h
index e2118144e..57d9bb159 100644
--- a/libminifi/test/TestBase.h
+++ b/libminifi/test/TestBase.h
@@ -15,7 +15,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
+#undef NDEBUG
 #pragma once
 
 #include <chrono>
@@ -188,7 +188,7 @@ class TempDirectory {
 
   ~TempDirectory() {
     if (is_owner_) {
-      minifi::utils::file::FileUtils::delete_dir(path_, true);
+      assert(minifi::utils::file::FileUtils::delete_dir(path_, true) == 0);
     }
   }
 
diff --git a/libminifi/test/keyvalue-tests/PersistentStateStorageTest.cpp 
b/libminifi/test/keyvalue-tests/PersistentStateStorageTest.cpp
index 6c945ef3c..1d494708d 100644
--- a/libminifi/test/keyvalue-tests/PersistentStateStorageTest.cpp
+++ b/libminifi/test/keyvalue-tests/PersistentStateStorageTest.cpp
@@ -32,6 +32,7 @@
 #include "controllers/keyvalue/AutoPersistor.h"
 #include "unit/ProvenanceTestHelper.h"
 #include "repository/VolatileContentRepository.h"
+#include "utils/file/FileUtils.h"
 
 static std::string config_yaml; // NOLINT
 
@@ -70,6 +71,7 @@ class PersistentStateStorageTestsFixture {
 
   virtual ~PersistentStateStorageTestsFixture() {
     LogTestController::getInstance().reset();
+    std::filesystem::current_path(minifi::utils::file::get_executable_dir());
   }
 
   void loadYaml() {
@@ -108,6 +110,7 @@ class PersistentStateStorageTestsFixture {
   }
 
  protected:
+  TestController testController;
   std::shared_ptr<minifi::Configure> configuration;
   std::shared_ptr<core::Repository> test_repo;
   std::shared_ptr<core::Repository> test_flow_repo;
@@ -119,8 +122,6 @@ class PersistentStateStorageTestsFixture {
 
   std::shared_ptr<core::controller::ControllerServiceNode> 
persistable_key_value_store_service_node;
   std::shared_ptr<minifi::controllers::KeyValueStateStorage> controller;
-
-  TestController testController;
 };
 
 
diff --git a/libminifi/test/keyvalue-tests/VolatileMapStateStorageTest.cpp 
b/libminifi/test/keyvalue-tests/VolatileMapStateStorageTest.cpp
index 6edc57df0..7681bab92 100644
--- a/libminifi/test/keyvalue-tests/VolatileMapStateStorageTest.cpp
+++ b/libminifi/test/keyvalue-tests/VolatileMapStateStorageTest.cpp
@@ -27,6 +27,7 @@
 #include "core/yaml/YamlConfiguration.h"
 #include "unit/ProvenanceTestHelper.h"
 #include "repository/VolatileContentRepository.h"
+#include "utils/file/FileUtils.h"
 
 namespace {
   std::string config_yaml; // NOLINT
@@ -77,6 +78,7 @@ class VolatileMapStateStorageTestFixture {
   }
 
   virtual ~VolatileMapStateStorageTestFixture() {
+    std::filesystem::current_path(minifi::utils::file::get_executable_dir());
     LogTestController::getInstance().reset();
   }
 
diff --git a/libminifi/test/unit/FileStreamTests.cpp 
b/libminifi/test/unit/FileStreamTests.cpp
index c29bddf7e..7032be269 100644
--- a/libminifi/test/unit/FileStreamTests.cpp
+++ b/libminifi/test/unit/FileStreamTests.cpp
@@ -280,6 +280,7 @@ TEST_CASE("Opening file without permission creates error 
logs") {
   minifi::io::FileStream stream(path_to_permissionless_file, 0, true);  // 
write_enabled, because permissionless file only means read-only on Windows
   REQUIRE(test_controller.getLog().getInstance().contains("Error opening 
file", std::chrono::seconds(0)));
   REQUIRE(test_controller.getLog().getInstance().contains("Permission denied", 
std::chrono::seconds(0)));
+  utils::file::FileUtils::set_permissions(path_to_permissionless_file, 0777);
 }
 
 TEST_CASE("Readonly filestream write test") {

Reply via email to