You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by ab...@apache.org on 2020/06/17 15:01:24 UTC

[nifi-minifi-cpp] branch master updated: MINIFICPP-1234 - Fix some archive tests on Windows.

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

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


The following commit(s) were added to refs/heads/master by this push:
     new b107c86  MINIFICPP-1234 - Fix some archive tests on Windows.
b107c86 is described below

commit b107c86e794a77ac1dec15eb8aa3f103301662de
Author: Adam Debreceni <ad...@protonmail.com>
AuthorDate: Fri May 22 15:01:16 2020 +0200

    MINIFICPP-1234 - Fix some archive tests on Windows.
    
    Signed-off-by: Arpad Boda <ab...@apache.org>
    
    This closes #808
---
 extensions/libarchive/ArchiveMetadata.cpp          |  2 +-
 libminifi/include/utils/file/FileManager.h         | 51 +++++-----------------
 libminifi/include/utils/file/FileUtils.h           | 25 +++++++----
 libminifi/test/archive-tests/CMakeLists.txt        |  9 +---
 libminifi/test/archive-tests/FocusArchiveTests.cpp | 24 ++++------
 .../test/archive-tests/ManipulateArchiveTests.cpp  | 17 +++-----
 6 files changed, 46 insertions(+), 82 deletions(-)

diff --git a/extensions/libarchive/ArchiveMetadata.cpp b/extensions/libarchive/ArchiveMetadata.cpp
index 83e7aa5..7503ab6 100644
--- a/extensions/libarchive/ArchiveMetadata.cpp
+++ b/extensions/libarchive/ArchiveMetadata.cpp
@@ -149,7 +149,7 @@ void ArchiveMetadata::loadJson(const rapidjson::Value& metadataDoc) {
 
 void ArchiveMetadata::seedTempPaths(fileutils::FileManager *file_man, bool keep = false) {
     for (auto& entry : entryMetadata)
-        entry.tmpFileName.assign(file_man->unique_file("/tmp/", keep));
+        entry.tmpFileName.assign(file_man->unique_file(keep));
 }
 
 ArchiveStack ArchiveStack::fromJson(const rapidjson::Value& input) {
diff --git a/libminifi/include/utils/file/FileManager.h b/libminifi/include/utils/file/FileManager.h
index 0239b44..62a18ac 100644
--- a/libminifi/include/utils/file/FileManager.h
+++ b/libminifi/include/utils/file/FileManager.h
@@ -34,6 +34,7 @@
 #include "io/validation.h"
 #include "utils/Id.h"
 #include "utils/StringUtils.h"
+#include "utils/file/FileUtils.h"
 
 #ifndef FILE_SEPARATOR
   #ifdef WIN32
@@ -67,51 +68,23 @@ class FileManager {
     }
   }
   std::string unique_file(const std::string &location, bool keep = false) {
-    if (!IsNullOrEmpty(location)) {
-      std::string file_name = location + FILE_SEPARATOR + non_repeating_string_generator_.generate();
-      while (!verify_not_exist(file_name)) {
-        file_name = location + FILE_SEPARATOR + non_repeating_string_generator_.generate();
-      }
-      if (!keep)
-        unique_files_.push_back(file_name);
-      return file_name;
-    } else {
-      std::string tmpDir = "/tmp";
-#ifdef WIN32
-      TCHAR lpTempPathBuffer[MAX_PATH];
-      GetTempPath(MAX_PATH, lpTempPathBuffer);
-      tmpDir = lpTempPathBuffer;
-#endif
-      std::string file_name = tmpDir + FILE_SEPARATOR + non_repeating_string_generator_.generate();
-      while (!verify_not_exist(file_name)) {
-        file_name = tmpDir + FILE_SEPARATOR + non_repeating_string_generator_.generate();
-      }
-      if (!keep) {
-        unique_files_.push_back(file_name);
-      }
-      return file_name;
+    const std::string& dir = !IsNullOrEmpty(location) ? location : utils::file::FileUtils::get_temp_directory();
+
+    std::string file_name = utils::file::FileUtils::concat_path(dir, non_repeating_string_generator_.generate());
+    while (!verify_not_exist(file_name)) {
+      file_name = utils::file::FileUtils::concat_path(dir, non_repeating_string_generator_.generate());
     }
+    if (!keep)
+      unique_files_.push_back(file_name);
+    return file_name;
   }
 
   std::string unique_file(bool keep = false) {
 #ifdef BOOST_VERSION
     return boost::filesystem::unique_path().native();
-#else
-    std::string tmpDir = "/tmp";
-#ifdef WIN32
-    TCHAR lpTempPathBuffer[MAX_PATH];
-    GetTempPath(MAX_PATH, lpTempPathBuffer);
-    tmpDir = lpTempPathBuffer;
-#endif
-    std::string file_name = tmpDir + FILE_SEPARATOR + non_repeating_string_generator_.generate();
-    while (!verify_not_exist(file_name)) {
-      file_name = tmpDir + FILE_SEPARATOR + non_repeating_string_generator_.generate();
-    }
-    if (!keep) {
-      unique_files_.push_back(file_name);
-    }
-    return file_name;
-#endif
+#else  // BOOST_VERSION
+    return unique_file(std::string{}, keep);
+#endif  // BOOST_VERSION
   }
 
 
diff --git a/libminifi/include/utils/file/FileUtils.h b/libminifi/include/utils/file/FileUtils.h
index f7ecdb6..f67539f 100644
--- a/libminifi/include/utils/file/FileUtils.h
+++ b/libminifi/include/utils/file/FileUtils.h
@@ -129,21 +129,28 @@ class FileUtils {
 
   static std::string create_temp_directory(char* format) {
 #ifdef WIN32
-    char tempBuffer[MAX_PATH];
-    const auto ret = GetTempPath(MAX_PATH, tempBuffer);
-    if (ret <= MAX_PATH && ret != 0) {
-      const std::string tempDirectory = tempBuffer
-          + minifi::utils::IdGenerator::getIdGenerator()->generate().to_string();
-      create_dir(tempDirectory);
-      return tempDirectory;
-    }
-    return {};
+    const std::string tempDirectory = concat_path(get_temp_directory(),
+      minifi::utils::IdGenerator::getIdGenerator()->generate().to_string());
+    create_dir(tempDirectory);
+    return tempDirectory;
 #else
     if (mkdtemp(format) == nullptr) { return ""; }
     return format;
 #endif
   }
 
+  static std::string get_temp_directory() {
+#ifdef WIN32
+    char tempBuffer[MAX_PATH];
+    const auto ret = GetTempPath(MAX_PATH, tempBuffer);
+    if (ret > MAX_PATH || ret == 0)
+      throw std::runtime_error("Couldn't locate temporary directory path");
+    return tempBuffer;
+#else
+    return "/tmp";
+#endif
+  }
+
   static int64_t delete_dir(const std::string &path, bool delete_files_recursively = true) {
 #ifdef BOOST_VERSION
     try {
diff --git a/libminifi/test/archive-tests/CMakeLists.txt b/libminifi/test/archive-tests/CMakeLists.txt
index 9db2fb8..66edea5 100644
--- a/libminifi/test/archive-tests/CMakeLists.txt
+++ b/libminifi/test/archive-tests/CMakeLists.txt
@@ -17,14 +17,7 @@
 # under the License.
 #
 
-if (WIN32)
-	# Currently CompressContent is the only verified working libarchive processor on Windows,
-	# some tests for other libarchive processors fail on Windows.
-	file(GLOB ARCHIVE_INTEGRATION_TESTS  "CompressContentTests.cpp")
-	list(APPEND ARCHIVE_INTEGRATION_TESTS "MergeFileTests.cpp")
-else()
-	file(GLOB ARCHIVE_INTEGRATION_TESTS  "*.cpp")
-endif()
+file(GLOB ARCHIVE_INTEGRATION_TESTS  "*.cpp")
 
 SET(EXTENSIONS_TEST_COUNT 0)
 FOREACH(testfile ${ARCHIVE_INTEGRATION_TESTS})
diff --git a/libminifi/test/archive-tests/FocusArchiveTests.cpp b/libminifi/test/archive-tests/FocusArchiveTests.cpp
index e30d2b9..898132a 100644
--- a/libminifi/test/archive-tests/FocusArchiveTests.cpp
+++ b/libminifi/test/archive-tests/FocusArchiveTests.cpp
@@ -73,11 +73,13 @@ TEST_CASE("FocusArchive", "[testFocusArchive]") {
     std::shared_ptr<TestPlan> plan = testController.createPlan();
     std::shared_ptr<TestRepository> repo = std::make_shared<TestRepository>();
 
-    char dir1[] = "/tmp/gt.XXXXXX";
-    char dir2[] = "/tmp/gt.XXXXXX";
-    char dir3[] = "/tmp/gt.XXXXXX";
+    std::string dir1 = [&] {char format[] = "/tmp/gt.XXXXXX"; return testController.createTempDirectory(format); }();
+    std::string dir2 = [&] {char format[] = "/tmp/gt.XXXXXX"; return testController.createTempDirectory(format); }();
+    std::string dir3 = [&] {char format[] = "/tmp/gt.XXXXXX"; return testController.createTempDirectory(format); }();
 
-    REQUIRE(!testController.createTempDirectory(dir1).empty());
+    REQUIRE(!dir1.empty());
+    REQUIRE(!dir2.empty());
+    REQUIRE(!dir3.empty());
     std::shared_ptr<core::Processor> getfile = plan->addProcessor("GetFile", "getfileCreate2");
     plan->setProperty(getfile, org::apache::nifi::minifi::processors::GetFile::Directory.getName(), dir1);
     plan->setProperty(getfile, org::apache::nifi::minifi::processors::GetFile::KeepSourceFile.getName(), "true");
@@ -85,7 +87,6 @@ TEST_CASE("FocusArchive", "[testFocusArchive]") {
     std::shared_ptr<core::Processor> fprocessor = plan->addProcessor("FocusArchiveEntry", "focusarchiveCreate", core::Relationship("success", "description"), true);
     plan->setProperty(fprocessor, org::apache::nifi::minifi::processors::FocusArchiveEntry::Path.getName(), FOCUSED_FILE);
 
-    REQUIRE(!testController.createTempDirectory(dir2).empty());
     std::shared_ptr<core::Processor> putfile1 = plan->addProcessor("PutFile", "PutFile1", core::Relationship("success", "description"), true);
     plan->setProperty(putfile1, org::apache::nifi::minifi::processors::PutFile::Directory.getName(), dir2);
     plan->setProperty(putfile1, org::apache::nifi::minifi::processors::PutFile::ConflictResolution.getName(),
@@ -93,15 +94,12 @@ TEST_CASE("FocusArchive", "[testFocusArchive]") {
 
     std::shared_ptr<core::Processor> ufprocessor = plan->addProcessor("UnfocusArchiveEntry", "unfocusarchiveCreate", core::Relationship("success", "description"), true);
 
-    REQUIRE(!testController.createTempDirectory(dir3).empty());
     std::shared_ptr<core::Processor> putfile2 = plan->addProcessor("PutFile", "PutFile2", core::Relationship("success", "description"), true);
     plan->setProperty(putfile2, org::apache::nifi::minifi::processors::PutFile::Directory.getName(), dir3);
     plan->setProperty(putfile2, org::apache::nifi::minifi::processors::PutFile::ConflictResolution.getName(),
                       org::apache::nifi::minifi::processors::PutFile::CONFLICT_RESOLUTION_STRATEGY_REPLACE);
 
-    std::stringstream ss1;
-    ss1 << dir1 << "/" << TEST_ARCHIVE_NAME;
-    std::string archive_path_1 = ss1.str();
+    std::string archive_path_1 = utils::file::FileUtils::concat_path(dir1, TEST_ARCHIVE_NAME);
 
     TAE_MAP_T test_archive_map = build_test_archive_map(NUM_FILES, FILE_NAMES, FILE_CONTENT);
     build_test_archive(archive_path_1, test_archive_map);
@@ -112,9 +110,7 @@ TEST_CASE("FocusArchive", "[testFocusArchive]") {
     plan->runNextProcessor();  // FocusArchive
     plan->runNextProcessor();  // PutFile 1 (focused)
 
-    std::stringstream ss2;
-    ss2 << dir2 << "/" << FOCUSED_FILE;
-    std::ifstream ifs(ss2.str().c_str(), std::ios::in | std::ios::binary | std::ios::ate);
+    std::ifstream ifs(utils::file::FileUtils::concat_path(dir2, FOCUSED_FILE), std::ios::in | std::ios::binary | std::ios::ate);
 
     std::ifstream::pos_type size = ifs.tellg();
     int64_t bufsize {size};
@@ -128,8 +124,6 @@ TEST_CASE("FocusArchive", "[testFocusArchive]") {
     plan->runNextProcessor();  // UnfocusArchive
     plan->runNextProcessor();  // PutFile 2 (unfocused)
 
-    std::stringstream ss3;
-    ss3 << dir3 << "/" << TEST_ARCHIVE_NAME;
-    std::string archive_path_2 = ss3.str();
+    std::string archive_path_2 = utils::file::FileUtils::concat_path(dir3, TEST_ARCHIVE_NAME);
     REQUIRE(check_archive_contents(archive_path_2, test_archive_map));
 }
diff --git a/libminifi/test/archive-tests/ManipulateArchiveTests.cpp b/libminifi/test/archive-tests/ManipulateArchiveTests.cpp
index cbb4449..c74a173 100644
--- a/libminifi/test/archive-tests/ManipulateArchiveTests.cpp
+++ b/libminifi/test/archive-tests/ManipulateArchiveTests.cpp
@@ -59,10 +59,12 @@ bool run_archive_test(OrderedTestArchive input_archive, OrderedTestArchive outpu
     std::shared_ptr<TestPlan> plan = testController.createPlan();
     std::shared_ptr<TestRepository> repo = std::make_shared<TestRepository>();
 
-    char dir1[] = "/tmp/gt.XXXXXX";
-    char dir2[] = "/tmp/gt.XXXXXX";
+    std::string dir1 = [&] {char format[] = "/tmp/gt.XXXXXX"; return testController.createTempDirectory(format); }();
+    std::string dir2 = [&] {char format[] = "/tmp/gt.XXXXXX"; return testController.createTempDirectory(format); }();
+
+    REQUIRE(!dir1.empty());
+    REQUIRE(!dir2.empty());
 
-    REQUIRE(!testController.createTempDirectory(dir1).empty());
     std::shared_ptr<core::Processor> getfile = plan->addProcessor("GetFile", "getfileCreate2");
     plan->setProperty(getfile, org::apache::nifi::minifi::processors::GetFile::Directory.getName(), dir1);
     plan->setProperty(getfile, org::apache::nifi::minifi::processors::GetFile::KeepSourceFile.getName(), "true");
@@ -73,15 +75,12 @@ bool run_archive_test(OrderedTestArchive input_archive, OrderedTestArchive outpu
       plan->setProperty(maprocessor, kv.first, kv.second);
     }
 
-    REQUIRE(!testController.createTempDirectory(dir2).empty());
     std::shared_ptr<core::Processor> putfile2 = plan->addProcessor("PutFile", "PutFile2", core::Relationship("success", "description"), true);
     plan->setProperty(putfile2, org::apache::nifi::minifi::processors::PutFile::Directory.getName(), dir2);
     plan->setProperty(putfile2, org::apache::nifi::minifi::processors::PutFile::ConflictResolution.getName(),
                       org::apache::nifi::minifi::processors::PutFile::CONFLICT_RESOLUTION_STRATEGY_REPLACE);
 
-    std::stringstream ss1;
-    ss1 << dir1 << "/" << TEST_ARCHIVE_NAME;
-    std::string archive_path_1 = ss1.str();
+    std::string archive_path_1 = utils::file::FileUtils::concat_path(dir1, TEST_ARCHIVE_NAME);
 
     build_test_archive(archive_path_1, input_archive);
     REQUIRE(check_archive_contents(archive_path_1, input_archive, true));
@@ -90,9 +89,7 @@ bool run_archive_test(OrderedTestArchive input_archive, OrderedTestArchive outpu
     plan->runNextProcessor();  // ManipulateArchive
     plan->runNextProcessor();  // PutFile 2 (manipulated)
 
-    std::stringstream ss2;
-    ss2 << dir2 << "/" << TEST_ARCHIVE_NAME;
-    std::string output_path = ss2.str();
+    std::string output_path = utils::file::FileUtils::concat_path(dir2, TEST_ARCHIVE_NAME);
     return check_archive_contents(output_path, output_archive, check_attributes);
 }