You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nifi.apache.org by ph...@apache.org on 2019/02/19 11:36:28 UTC

[nifi-minifi-cpp] branch master updated: MINIFICPP-736 - Add timeout to log matching to fix unstable test cases

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

phrocker 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 361184a  MINIFICPP-736 - Add timeout to log matching to fix unstable test cases
361184a is described below

commit 361184ab4754a47f332a7b0ea2ff60d27ccae032
Author: Arpad Boda <ab...@hortonworks.com>
AuthorDate: Thu Feb 14 18:27:44 2019 +0100

    MINIFICPP-736 - Add timeout to log matching to fix unstable test cases
    
    This closes #486.
    
    Signed-off-by: Marc Parisi <ph...@apache.org>
---
 libminifi/test/TestBase.h                          | 28 +++++++++++++++++-----
 .../integration/UpdateAttributeIntegrationTest.cpp |  9 ++++++-
 libminifi/test/unit/ExtractTextTests.cpp           |  2 +-
 libminifi/test/unit/LoggerConfigurationTests.cpp   |  8 +++----
 libminifi/test/unit/LoggerTests.cpp                |  2 +-
 5 files changed, 36 insertions(+), 13 deletions(-)

diff --git a/libminifi/test/TestBase.h b/libminifi/test/TestBase.h
index 42e7798..c12edeb 100644
--- a/libminifi/test/TestBase.h
+++ b/libminifi/test/TestBase.h
@@ -90,14 +90,30 @@ class LogTestController {
     setLevel(name, level);
   }
 
-  bool contains(const std::string &ending) {
-    return contains(log_output, ending);
+  bool contains(const std::string &ending, std::chrono::seconds timeout = std::chrono::seconds(3)) {
+    return contains(log_output, ending, timeout);
   }
 
-  bool contains(const std::ostringstream &stream, const std::string &ending) {
-    std::string str = stream.str();
-    logger_->log_info("Looking for %s in log output.", ending);
-    return (ending.length() > 0 && str.find(ending) != std::string::npos);
+  bool contains(const std::ostringstream &stream, const std::string &ending, std::chrono::seconds timeout = std::chrono::seconds(3) ) {
+    if (ending.length() == 0) {
+      return false;
+    }
+    auto start = std::chrono::system_clock::now();
+    bool found = false;
+    bool timed_out = false;
+    do {
+      std::string str = stream.str();
+      found = (str.find(ending) != std::string::npos);
+      auto now = std::chrono::system_clock::now();
+      timed_out = std::chrono::duration_cast<std::chrono::milliseconds>(now - start) >
+                  std::chrono::duration_cast<std::chrono::milliseconds>(timeout);
+      if(!found && !timed_out) {
+        std::this_thread::sleep_for(std::chrono::milliseconds(200));
+      }
+    } while (!found && !timed_out);
+
+    logger_->log_info("%s %s in log output.", found ? "Successfully found" : "Failed to find", ending);
+    return found;
   }
 
   void reset() {
diff --git a/libminifi/test/expression-language-tests/integration/UpdateAttributeIntegrationTest.cpp b/libminifi/test/expression-language-tests/integration/UpdateAttributeIntegrationTest.cpp
index 5ceecab..6148c65 100644
--- a/libminifi/test/expression-language-tests/integration/UpdateAttributeIntegrationTest.cpp
+++ b/libminifi/test/expression-language-tests/integration/UpdateAttributeIntegrationTest.cpp
@@ -36,6 +36,7 @@
 class TestHarness : public IntegrationBase {
  public:
   TestHarness() {
+    log_entry_found = false;
   }
 
   void testSetup() {
@@ -47,10 +48,16 @@ class TestHarness : public IntegrationBase {
   }
 
   void runAssertions() {
-    assert(LogTestController::getInstance().contains("key:route_check_attr value:good"));
+    assert(log_entry_found);
+  }
+
+  void waitToVerifyProcessor() {
+    // This test takes a while to complete -> wait at most 10 secs
+    log_entry_found = LogTestController::getInstance().contains("key:route_check_attr value:good", std::chrono::seconds(10));
   }
 
  protected:
+  bool log_entry_found;
 };
 
 int main(int argc, char **argv) {
diff --git a/libminifi/test/unit/ExtractTextTests.cpp b/libminifi/test/unit/ExtractTextTests.cpp
index 939248f..f07a8bb 100644
--- a/libminifi/test/unit/ExtractTextTests.cpp
+++ b/libminifi/test/unit/ExtractTextTests.cpp
@@ -113,7 +113,7 @@ TEST_CASE("Test usage of ExtractText", "[extracttextTest]") {
     plan->runNextProcessor();  // ExtractText
     plan->runNextProcessor();  // LogAttribute
 
-    REQUIRE(LogTestController::getInstance().contains(log_check) == false);
+    REQUIRE(LogTestController::getInstance().contains(log_check, std::chrono::seconds(0)) == false);
 
     ss2.str("");
     ss2 << "key:" << TEST_ATTR << " value:" << "Test";
diff --git a/libminifi/test/unit/LoggerConfigurationTests.cpp b/libminifi/test/unit/LoggerConfigurationTests.cpp
index 7850de0..8a1ce9b 100644
--- a/libminifi/test/unit/LoggerConfigurationTests.cpp
+++ b/libminifi/test/unit/LoggerConfigurationTests.cpp
@@ -80,18 +80,18 @@ TEST_CASE("TestLoggerConfiguration::initialize_namespaces", "[test initialize_na
 
   logger = TestLoggerConfiguration::get_logger(root_namespace, stdout_only_warn_class, formatter);
   logger->info(test_log_statement);
-  REQUIRE(false == logTestController.contains(stdout, test_log_statement));
+  REQUIRE(false == logTestController.contains(stdout, test_log_statement, std::chrono::seconds(0)));
   logger->warn(test_log_statement);
   REQUIRE(true == logTestController.contains(stdout, test_log_statement));
-  REQUIRE(false == logTestController.contains(stderr, test_log_statement));
+  REQUIRE(false == logTestController.contains(stderr, test_log_statement, std::chrono::seconds(0)));
   logTestController.resetStream(stdout);
   logTestController.resetStream(stderr);
 
   logger = TestLoggerConfiguration::get_logger(root_namespace, stderr_only_error_class, formatter);
   logger->warn(test_log_statement);
-  REQUIRE(false == logTestController.contains(stderr, test_log_statement));
+  REQUIRE(false == logTestController.contains(stderr, test_log_statement, std::chrono::seconds(0)));
   logger->error(test_log_statement);
-  REQUIRE(false == logTestController.contains(stdout, test_log_statement));
+  REQUIRE(false == logTestController.contains(stdout, test_log_statement, std::chrono::seconds(0)));
   REQUIRE(true == logTestController.contains(stderr, test_log_statement));
   logTestController.resetStream(stdout);
   logTestController.resetStream(stderr);
diff --git a/libminifi/test/unit/LoggerTests.cpp b/libminifi/test/unit/LoggerTests.cpp
index 744071c..60a57c3 100644
--- a/libminifi/test/unit/LoggerTests.cpp
+++ b/libminifi/test/unit/LoggerTests.cpp
@@ -69,7 +69,7 @@ TEST_CASE("Test log Levels change", "[ttl5]") {
   LogTestController::getInstance().setOff<logging::Logger>();
   logger->log_error("hello %s", "world");
 
-  REQUIRE(false == LogTestController::getInstance().contains("[org::apache::nifi::minifi::core::logging::Logger] [error] hello world"));
+  REQUIRE(false == LogTestController::getInstance().contains("[org::apache::nifi::minifi::core::logging::Logger] [error] hello world", std::chrono::seconds(0)));
   LogTestController::getInstance().reset();
 }