This is an automated email from the ASF dual-hosted git repository. fgerlits pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/nifi-minifi-cpp.git
commit cc9ea913ecdc243a5c9c5cbcb754adae2c9f76c7 Author: Gabor Gyimesi <[email protected]> AuthorDate: Mon Feb 10 17:17:01 2025 +0100 MINIFICPP-2475 Fix CivetWeb build dependencies - CivetWeb lib is built for Prometheus, Loki and Civetweb extensions - CivetWeb lib is built for tests separately if no extension needs the library - Tests only link to CivetWeb library instead of minifi-civetweb extension - Tests requiring processors and C2 receivers from CivetWeb extension are moved under CivetWeb extension - ListenHTTP processor from CivetWeb extension is removed from InvokeHTTPTests Signed-off-by: Ferenc Gerlits <[email protected]> Closes #1929 --- CMakeLists.txt | 2 +- cmake/CivetWeb.cmake | 6 + extensions/civetweb/CMakeLists.txt | 2 +- .../civetweb/tests}/C2VerifyServeResults.cpp | 0 extensions/civetweb/tests/CMakeLists.txt | 4 +- .../civetweb/tests}/HttpPostIntegrationTest.cpp | 3 - extensions/elasticsearch/tests/CMakeLists.txt | 7 +- extensions/grafana-loki/tests/CMakeLists.txt | 7 +- extensions/splunk/tests/CMakeLists.txt | 7 +- .../standard-processors/tests/CMakeLists.txt | 4 +- .../tests/integration/InvokeHTTPTests.cpp | 145 ++++++++++++--------- libminifi/test/integration/C2NullConfiguration.cpp | 2 - .../test/integration/C2VerifyHeartbeatAndStop.cpp | 2 - .../C2VerifyLightweightHeartbeatAndStop.cpp | 2 - .../C2VerifyResourceConsumptionInHeartbeat.cpp | 2 - libminifi/test/integration/CMakeLists.txt | 2 +- libminifi/test/libtest/CMakeLists.txt | 4 + libminifi/test/libtest/integration/CMakeLists.txt | 4 +- libminifi/test/unit/CertificateUtilsTests.cpp | 4 +- 19 files changed, 115 insertions(+), 94 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1e156b1aa..298e189c9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -349,7 +349,7 @@ if (ENABLE_ALL OR ENABLE_AZURE) list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/libxml2/dummy") endif() -if (ENABLE_ALL OR ENABLE_PROMETHEUS OR ENABLE_CIVET) +if (ENABLE_ALL OR ENABLE_PROMETHEUS OR ENABLE_GRAFANA_LOKI OR ENABLE_CIVET) include(GetCivetWeb) get_civetweb() list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/civetweb/dummy") diff --git a/cmake/CivetWeb.cmake b/cmake/CivetWeb.cmake index 7ab39e9a8..d2622de1c 100644 --- a/cmake/CivetWeb.cmake +++ b/cmake/CivetWeb.cmake @@ -14,6 +14,9 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +if(TARGET civetweb::civetweb-cpp) + return() +endif() include(FetchContent) @@ -43,3 +46,6 @@ target_compile_definitions(civetweb-c-library PRIVATE SOCKET_TIMEOUT_QUANTUM=200 add_library(civetweb::c-library ALIAS civetweb-c-library) add_library(civetweb::civetweb-cpp ALIAS civetweb-cpp) + +set(CIVETWEB_INCLUDE_DIR "${civetweb_SOURCE_DIR}/include") +set(CIVETWEB_INCLUDE_DIRS "${CIVETWEB_INCLUDE_DIR}") diff --git a/extensions/civetweb/CMakeLists.txt b/extensions/civetweb/CMakeLists.txt index c6f45d280..eb7e5f30d 100644 --- a/extensions/civetweb/CMakeLists.txt +++ b/extensions/civetweb/CMakeLists.txt @@ -30,7 +30,7 @@ target_include_directories(minifi-civet-extensions BEFORE PUBLIC ${CMAKE_SOURCE_DIR}/libminifi/include ${CMAKE_SOURCE_DIR}/libminifi/include/core ${CMAKE_SOURCE_DIR}/thirdparty/ - ${civetweb_SOURCE_DIR}/include + ${CIVETWEB_INCLUDE_DIRS}/include ./include) target_link_libraries(minifi-civet-extensions ${LIBMINIFI} Threads::Threads civetweb::civetweb-cpp) diff --git a/libminifi/test/integration/C2VerifyServeResults.cpp b/extensions/civetweb/tests/C2VerifyServeResults.cpp similarity index 100% rename from libminifi/test/integration/C2VerifyServeResults.cpp rename to extensions/civetweb/tests/C2VerifyServeResults.cpp diff --git a/extensions/civetweb/tests/CMakeLists.txt b/extensions/civetweb/tests/CMakeLists.txt index 6d9ad431a..c4041361e 100644 --- a/extensions/civetweb/tests/CMakeLists.txt +++ b/extensions/civetweb/tests/CMakeLists.txt @@ -27,8 +27,9 @@ FOREACH(testfile ${CIVETWEB_INTEGRATION_TESTS}) target_link_libraries(${testfilename} minifi-civet-extensions) target_link_libraries(${testfilename} minifi-standard-processors) + target_compile_definitions(${testfilename} PRIVATE TEST_RESOURCES="${TEST_RESOURCES}") - createTests("${testfilename}") + createIntegrationTests("${testfilename}") target_link_libraries(${testfilename} Catch2WithMain) MATH(EXPR CIVETWEB-EXTENSIONS_TEST_COUNT "${CIVETWEB-EXTENSIONS_TEST_COUNT}+1") add_test(NAME "${testfilename}" COMMAND "${testfilename}" WORKING_DIRECTORY ${TEST_DIR}) @@ -42,4 +43,5 @@ FOREACH(testfile ${CIVETWEB_INTEGRATION_TESTS}) ) set_tests_properties("${testfilename}" PROPERTIES LABELS "civetweb") ENDFOREACH() + message("-- Finished building ${CIVETWEB-EXTENSIONS_TEST_COUNT} civetweb related test file(s)...") diff --git a/libminifi/test/integration/HttpPostIntegrationTest.cpp b/extensions/civetweb/tests/HttpPostIntegrationTest.cpp similarity index 94% rename from libminifi/test/integration/HttpPostIntegrationTest.cpp rename to extensions/civetweb/tests/HttpPostIntegrationTest.cpp index b07b8e0c2..601b19d96 100644 --- a/libminifi/test/integration/HttpPostIntegrationTest.cpp +++ b/extensions/civetweb/tests/HttpPostIntegrationTest.cpp @@ -19,7 +19,6 @@ #include <string> #include <iostream> #include "processors/InvokeHTTP.h" -#include "processors/ListenHTTP.h" #include "processors/LogAttribute.h" #include "unit/TestBase.h" #include "core/logging/Logger.h" @@ -47,8 +46,6 @@ class HttpTestHarness : public HTTPIntegrationBase { LogTestController::getInstance().setDebug<core::ProcessContext>(); LogTestController::getInstance().setTrace<minifi::processors::InvokeHTTP>(); LogTestController::getInstance().setDebug<minifi::http::HTTPClient>(); - LogTestController::getInstance().setDebug<minifi::processors::ListenHTTP>(); - LogTestController::getInstance().setDebug<minifi::processors::ListenHTTP::Handler>(); LogTestController::getInstance().setDebug<minifi::processors::LogAttribute>(); LogTestController::getInstance().setDebug<core::Processor>(); LogTestController::getInstance().setDebug<minifi::ThreadedSchedulingAgent>(); diff --git a/extensions/elasticsearch/tests/CMakeLists.txt b/extensions/elasticsearch/tests/CMakeLists.txt index 6fbd8b07b..a39986de8 100644 --- a/extensions/elasticsearch/tests/CMakeLists.txt +++ b/extensions/elasticsearch/tests/CMakeLists.txt @@ -25,13 +25,10 @@ FOREACH(testfile ${ELASTICSEARCH_TESTS}) add_minifi_executable("${testfilename}" "${testfile}") target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/extensions/standard-processors") target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/extensions/elasticsearch") - target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/extensions/civetweb/") + target_include_directories(${testfilename} BEFORE PRIVATE "${CIVETWEB_INCLUDE_DIRS}") createTests("${testfilename}") - target_link_libraries(${testfilename} Catch2WithMain) - target_link_libraries(${testfilename} minifi-elasticsearch) - target_link_libraries(${testfilename} minifi-civet-extensions) - target_link_libraries(${testfilename} minifi-standard-processors) + target_link_libraries(${testfilename} Catch2WithMain civetweb::civetweb-cpp minifi-elasticsearch minifi-standard-processors) MATH(EXPR ELASTICSEARCH_TEST_COUNT "${ELASTICSEARCH_TEST_COUNT}+1") add_test(NAME "${testfilename}" COMMAND "${testfilename}" WORKING_DIRECTORY ${TEST_DIR}) set_tests_properties("${testfilename}" PROPERTIES LABELS "elasticsearch;memchecked") diff --git a/extensions/grafana-loki/tests/CMakeLists.txt b/extensions/grafana-loki/tests/CMakeLists.txt index 8c1738358..b9764ebea 100644 --- a/extensions/grafana-loki/tests/CMakeLists.txt +++ b/extensions/grafana-loki/tests/CMakeLists.txt @@ -31,13 +31,10 @@ FOREACH(testfile ${GRAFANA_LOKI_TESTS}) if (ENABLE_GRPC_FOR_LOKI) target_include_directories(${testfilename} SYSTEM PRIVATE BEFORE "${CMAKE_BINARY_DIR}/grafana-loki-protobuf-generated") endif() - target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/extensions/civetweb/") + target_include_directories(${testfilename} BEFORE PRIVATE "${CIVETWEB_INCLUDE_DIRS}") createTests("${testfilename}") - target_link_libraries(${testfilename} Catch2WithMain) - target_link_libraries(${testfilename} minifi-grafana-loki) - target_link_libraries(${testfilename} minifi-civet-extensions) - target_link_libraries(${testfilename} minifi-standard-processors) + target_link_libraries(${testfilename} Catch2WithMain civetweb::civetweb-cpp minifi-grafana-loki minifi-standard-processors) MATH(EXPR GRAFANA_LOKI_TEST_COUNT "${GRAFANA_LOKI_TEST_COUNT}+1") add_test(NAME "${testfilename}" COMMAND "${testfilename}" WORKING_DIRECTORY ${TEST_DIR}) set_tests_properties("${testfilename}" PROPERTIES LABELS "grafana-loki;memchecked") diff --git a/extensions/splunk/tests/CMakeLists.txt b/extensions/splunk/tests/CMakeLists.txt index f00d2740b..24849389d 100644 --- a/extensions/splunk/tests/CMakeLists.txt +++ b/extensions/splunk/tests/CMakeLists.txt @@ -25,13 +25,10 @@ FOREACH(testfile ${SPLUNK_TESTS}) add_minifi_executable("${testfilename}" "${testfile}") target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/extensions/standard-processors") target_include_directories(${testfilename} PRIVATE BEFORE "${CMAKE_SOURCE_DIR}/extensions/splunk") - target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/extensions/civetweb/") + target_include_directories(${testfilename} BEFORE PRIVATE "${CIVETWEB_INCLUDE_DIRS}") createTests("${testfilename}") - target_link_libraries(${testfilename} Catch2WithMain) - target_link_libraries(${testfilename} minifi-splunk) - target_link_libraries(${testfilename} minifi-civet-extensions) - target_link_libraries(${testfilename} minifi-standard-processors) + target_link_libraries(${testfilename} Catch2WithMain civetweb::civetweb-cpp minifi-splunk minifi-standard-processors) MATH(EXPR SPLUNK_TEST_COUNT "${SPLUNK_TEST_COUNT}+1") add_test(NAME "${testfilename}" COMMAND "${testfilename}" WORKING_DIRECTORY ${TEST_DIR}) ENDFOREACH() diff --git a/extensions/standard-processors/tests/CMakeLists.txt b/extensions/standard-processors/tests/CMakeLists.txt index 4eff16145..edef43a46 100644 --- a/extensions/standard-processors/tests/CMakeLists.txt +++ b/extensions/standard-processors/tests/CMakeLists.txt @@ -33,7 +33,7 @@ FOREACH(testfile ${PROCESSOR_UNIT_TESTS}) target_include_directories(${testfilename} BEFORE PRIVATE "../") target_include_directories(${testfilename} BEFORE PRIVATE "../processors") target_include_directories(${testfilename} BEFORE PRIVATE ./include) - target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/extensions/civetweb/") + target_include_directories(${testfilename} BEFORE PRIVATE "${CIVETWEB_INCLUDE_DIRS}") target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/extensions/expression-language/") createTests("${testfilename}") target_link_libraries(${testfilename} Catch2WithMain) @@ -62,7 +62,7 @@ FOREACH(testfile ${PROCESSOR_INTEGRATION_TESTS}) target_include_directories(${testfilename} BEFORE PRIVATE "../http/") target_include_directories(${testfilename} BEFORE PRIVATE "../protocols/") target_include_directories(${testfilename} BEFORE PRIVATE "../sitetosite/") - target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/extensions/civetweb/") + target_include_directories(${testfilename} BEFORE PRIVATE "${CIVETWEB_INCLUDE_DIRS}") target_include_directories(${testfilename} BEFORE PRIVATE ./include) createIntegrationTests("${testfilename}") target_link_libraries(${testfilename}) diff --git a/extensions/standard-processors/tests/integration/InvokeHTTPTests.cpp b/extensions/standard-processors/tests/integration/InvokeHTTPTests.cpp index 7f230251f..1307ce8b0 100644 --- a/extensions/standard-processors/tests/integration/InvokeHTTPTests.cpp +++ b/extensions/standard-processors/tests/integration/InvokeHTTPTests.cpp @@ -18,12 +18,12 @@ #include <array> #include <memory> #include <string> +#include <unordered_map> #include "unit/TestBase.h" #include "unit/Catch.h" #include "core/Core.h" #include "http/HTTPClient.h" #include "InvokeHTTP.h" -#include "processors/ListenHTTP.h" #include "core/FlowFile.h" #include "unit/ProvenanceTestHelper.h" #include "core/Processor.h" @@ -33,62 +33,84 @@ #include "unit/SingleProcessorTestController.h" #include "integration/ConnectionCountingServer.h" #include "unit/TestUtils.h" +#include "integration/TestServer.h" +#include "utils/StringUtils.h" namespace org::apache::nifi::minifi::test { +class TestHandler : public CivetHandler { + public: + bool handleGet(CivetServer*, struct mg_connection* conn) override { + storeHeaders(conn); + mg_printf(conn, "HTTP/1.1 200 OK\r\n"); + return true; + } + + bool handlePost(CivetServer* /*server*/, struct mg_connection *conn) override { + storeHeaders(conn); + mg_printf(conn, "HTTP/1.1 200 OK\r\nContent-Type: " + "text/plain\r\nContent-Length: 0\r\nConnection: close\r\n\r\n"); + return true; + } + + [[nodiscard]] const std::unordered_map<std::string, std::string>& getHeaders() const { + return headers_; + } + + private: + void storeHeaders(struct mg_connection* conn) { + headers_.clear(); + auto req_info = mg_get_request_info(conn); + for (int i = 0; i < req_info->num_headers; ++i) { + auto header = &req_info->http_headers[i]; + headers_[std::string(header->name)] = std::string(header->value); + } + } + + std::unordered_map<std::string, std::string> headers_; +}; + class TestHTTPServer { public: - explicit TestHTTPServer(TestController& test_controller) { - LogTestController::getInstance().setDebug<org::apache::nifi::minifi::processors::ListenHTTP>(); - LogTestController::getInstance().setDebug<org::apache::nifi::minifi::processors::LogAttribute>(); - - test_plan_ = test_controller.createPlan(); - - listen_http_ = dynamic_cast<processors::ListenHTTP*>(test_plan_->addProcessor("ListenHTTP", PROCESSOR_NAME)); - log_attribute_ = dynamic_cast<processors::LogAttribute*>(test_plan_->addProcessor("LogAttribute", "LogAttribute", core::Relationship("success", "description"), true)); - REQUIRE(listen_http_); - REQUIRE(log_attribute_); - log_attribute_->setProperty(processors::LogAttribute::LogPayload.name, "true"); - test_plan_->setProperty(listen_http_, org::apache::nifi::minifi::processors::ListenHTTP::BasePath, "testytesttest"); - test_plan_->setProperty(listen_http_, org::apache::nifi::minifi::processors::ListenHTTP::Port, "8681"); - test_plan_->setProperty(listen_http_, org::apache::nifi::minifi::processors::ListenHTTP::HeadersAsAttributesRegex, ".*"); - test_plan_->runProcessor(listen_http_); - test_plan_->runProcessor(log_attribute_); - thread_ = std::thread{[this] { - while (running_) { - if (listen_http_->isWorkAvailable()) { - test_plan_->runProcessor(listen_http_); - test_plan_->runProcessor(log_attribute_); - } - } - }}; + TestHTTPServer() : server_(std::make_unique<TestServer>("8681", "/testytesttest", &handler_)) { } TestHTTPServer(const TestHTTPServer&) = delete; TestHTTPServer(TestHTTPServer&&) = delete; TestHTTPServer& operator=(const TestHTTPServer&) = delete; TestHTTPServer& operator=(TestHTTPServer&&) = delete; + ~TestHTTPServer() = default; - static constexpr const char* PROCESSOR_NAME = "my_http_server"; static constexpr const char* URL = "http://localhost:8681/testytesttest"; - ~TestHTTPServer() { - running_ = false; - thread_.join(); + [[nodiscard]] const std::unordered_map<std::string, std::string>& getHeaders() const { + return handler_.getHeaders(); + } + + [[nodiscard]] std::vector<std::string> getHeaderKeys() const { + std::vector<std::string> keys; + for (const auto& [key, _] : handler_.getHeaders()) { + keys.push_back(key); + } + return keys; + } + + [[nodiscard]] bool noInvalidHeaderPresent() const { + auto header_keys = getHeaderKeys(); + return std::none_of(header_keys.begin(), header_keys.end(), [] (const auto& key) { + return minifi::utils::string::startsWith(key, "invalid"); + }); } private: - processors::ListenHTTP* listen_http_ = nullptr; - processors::LogAttribute* log_attribute_ = nullptr; - std::shared_ptr<TestPlan> test_plan_; - std::thread thread_; - std::atomic_bool running_{true}; + TestHandler handler_; + std::unique_ptr<TestServer> server_; }; TEST_CASE("HTTPTestsPenalizeNoRetry", "[httptest1]") { using minifi::processors::InvokeHTTP; TestController testController; - TestHTTPServer http_server(testController); + TestHTTPServer http_server; LogTestController::getInstance().setInfo<minifi::core::ProcessSession>(); @@ -120,7 +142,7 @@ TEST_CASE("InvokeHTTP fails with when flow contains invalid attribute names in H test::SingleProcessorTestController test_controller{std::make_unique<InvokeHTTP>("InvokeHTTP")}; auto invokehttp = test_controller.getProcessor(); - TestHTTPServer http_server(test_controller); + TestHTTPServer http_server; LogTestController::getInstance().setDebug<InvokeHTTP>(); @@ -133,6 +155,7 @@ TEST_CASE("InvokeHTTP fails with when flow contains invalid attribute names in H auto file_contents = result.at(InvokeHTTP::RelFailure); REQUIRE(file_contents.size() == 1); REQUIRE(test_controller.plan->getContent(file_contents[0]) == "data"); + REQUIRE(http_server.getHeaders().empty()); } TEST_CASE("InvokeHTTP succeeds when the flow file contains an attribute that would be invalid as an HTTP header, and the policy is FAIL, but the attribute is not matched", @@ -141,7 +164,7 @@ TEST_CASE("InvokeHTTP succeeds when the flow file contains an attribute that wou test::SingleProcessorTestController test_controller{std::make_unique<InvokeHTTP>("InvokeHTTP")}; auto invokehttp = test_controller.getProcessor(); - TestHTTPServer http_server(test_controller); + TestHTTPServer http_server; LogTestController::getInstance().setDebug<InvokeHTTP>(); @@ -154,8 +177,8 @@ TEST_CASE("InvokeHTTP succeeds when the flow file contains an attribute that wou REQUIRE(result.at(InvokeHTTP::RelFailure).empty()); const auto& success_contents = result.at(InvokeHTTP::Success); REQUIRE(success_contents.size() == 1); - REQUIRE(utils::verifyLogLinePresenceInPollTime(1s, "key:valid-header value:value2")); - REQUIRE_FALSE(LogTestController::getInstance().contains("key:invalid")); + REQUIRE(http_server.getHeaders().at("valid-header") == "value2"); + REQUIRE(http_server.noInvalidHeaderPresent()); } TEST_CASE("InvokeHTTP replaces invalid characters of attributes", "[httptest1]") { @@ -163,7 +186,7 @@ TEST_CASE("InvokeHTTP replaces invalid characters of attributes", "[httptest1]") test::SingleProcessorTestController test_controller{std::make_unique<InvokeHTTP>("InvokeHTTP")}; auto invokehttp = test_controller.getProcessor(); - TestHTTPServer http_server(test_controller); + TestHTTPServer http_server; LogTestController::getInstance().setTrace<InvokeHTTP>(); @@ -175,8 +198,8 @@ TEST_CASE("InvokeHTTP replaces invalid characters of attributes", "[httptest1]") auto file_contents = result.at(InvokeHTTP::Success); REQUIRE(file_contents.size() == 1); REQUIRE(test_controller.plan->getContent(file_contents[0]) == "data"); - REQUIRE(utils::verifyLogLinePresenceInPollTime(1s, "key:invalid-header value:value")); - REQUIRE(utils::verifyLogLinePresenceInPollTime(1s, "key:X-MiNiFi-Empty-Attribute-Name value:value2")); + REQUIRE(http_server.getHeaders().at("invalid-header") == "value"); + REQUIRE(http_server.getHeaders().at("X-MiNiFi-Empty-Attribute-Name") == "value2"); } TEST_CASE("InvokeHTTP drops invalid attributes from HTTP headers", "[httptest1]") { @@ -184,7 +207,7 @@ TEST_CASE("InvokeHTTP drops invalid attributes from HTTP headers", "[httptest1]" test::SingleProcessorTestController test_controller{std::make_unique<InvokeHTTP>("InvokeHTTP")}; auto invokehttp = test_controller.getProcessor(); - TestHTTPServer http_server(test_controller); + TestHTTPServer http_server; LogTestController::getInstance().setTrace<InvokeHTTP>(); @@ -197,8 +220,8 @@ TEST_CASE("InvokeHTTP drops invalid attributes from HTTP headers", "[httptest1]" auto file_contents = result.at(InvokeHTTP::Success); REQUIRE(file_contents.size() == 1); REQUIRE(test_controller.plan->getContent(file_contents[0]) == "data"); - REQUIRE(utils::verifyLogLinePresenceInPollTime(1s, "key:legit-header value:value1")); - REQUIRE_FALSE(LogTestController::getInstance().contains("key:invalid", 0s)); + REQUIRE(http_server.getHeaders().at("legit-header") == "value1"); + REQUIRE(http_server.noInvalidHeaderPresent()); } TEST_CASE("InvokeHTTP empty Attributes to Send means no attributes are sent", "[httptest1]") { @@ -206,7 +229,7 @@ TEST_CASE("InvokeHTTP empty Attributes to Send means no attributes are sent", "[ test::SingleProcessorTestController test_controller{std::make_unique<InvokeHTTP>("InvokeHTTP")}; auto invokehttp = test_controller.getProcessor(); - TestHTTPServer http_server(test_controller); + TestHTTPServer http_server; LogTestController::getInstance().setTrace<InvokeHTTP>(); @@ -219,8 +242,9 @@ TEST_CASE("InvokeHTTP empty Attributes to Send means no attributes are sent", "[ auto file_contents = result.at(InvokeHTTP::Success); REQUIRE(file_contents.size() == 1); REQUIRE(test_controller.plan->getContent(file_contents[0]) == "data"); - REQUIRE_FALSE(LogTestController::getInstance().contains("key:legit-header value:value1")); - REQUIRE_FALSE(LogTestController::getInstance().contains("key:invalid", 0s)); + auto header_keys = http_server.getHeaderKeys(); + REQUIRE_FALSE(http_server.getHeaders().contains("legit-header")); + REQUIRE(http_server.noInvalidHeaderPresent()); } TEST_CASE("InvokeHTTP DateHeader", "[InvokeHTTP]") { @@ -228,7 +252,7 @@ TEST_CASE("InvokeHTTP DateHeader", "[InvokeHTTP]") { test::SingleProcessorTestController test_controller{std::make_unique<InvokeHTTP>("InvokeHTTP")}; auto invoke_http = test_controller.getProcessor(); - TestHTTPServer http_server(test_controller); + TestHTTPServer http_server; LogTestController::getInstance().setTrace<InvokeHTTP>(); @@ -250,7 +274,11 @@ TEST_CASE("InvokeHTTP DateHeader", "[InvokeHTTP]") { auto file_contents = result.at(InvokeHTTP::Success); REQUIRE(file_contents.size() == 1); REQUIRE(test_controller.plan->getContent(file_contents[0]) == "data"); - REQUIRE(utils::verifyEventHappenedInPollTime(1s, [&] {return LogTestController::getInstance().contains("key:Date", 0ms) == date_header;})); + if (date_header) { + REQUIRE(http_server.getHeaders().contains("Date")); + } else { + REQUIRE_FALSE(http_server.getHeaders().contains("Date")); + } } TEST_CASE("InvokeHTTP Attributes to Send uses full string matching, not substring", "[httptest1]") { @@ -258,7 +286,7 @@ TEST_CASE("InvokeHTTP Attributes to Send uses full string matching, not substrin test::SingleProcessorTestController test_controller{std::make_unique<InvokeHTTP>("InvokeHTTP")}; auto invokehttp = test_controller.getProcessor(); - TestHTTPServer http_server(test_controller); + TestHTTPServer http_server; LogTestController::getInstance().setTrace<InvokeHTTP>(); @@ -271,9 +299,9 @@ TEST_CASE("InvokeHTTP Attributes to Send uses full string matching, not substrin auto file_contents = result.at(InvokeHTTP::Success); REQUIRE(file_contents.size() == 1); REQUIRE(test_controller.plan->getContent(file_contents[0]) == "data"); - REQUIRE(utils::verifyLogLinePresenceInPollTime(1s, "key:header value:value2")); - REQUIRE_FALSE(LogTestController::getInstance().contains("key:header1 value:value1")); - REQUIRE_FALSE(LogTestController::getInstance().contains("key:invalid", 0s)); + REQUIRE(http_server.getHeaders().at("header") == "value2"); + REQUIRE_FALSE(http_server.getHeaders().contains("header1")); + REQUIRE(http_server.noInvalidHeaderPresent()); } TEST_CASE("HTTPTestsResponseBodyinAttribute", "[InvokeHTTP]") { @@ -383,10 +411,10 @@ TEST_CASE("InvokeHTTP: invalid characters are removed from outgoing HTTP headers }; SingleProcessorTestController controller{std::make_unique<InvokeHTTP>("InvokeHTTP")}; - const TestHTTPServer http_server(controller); auto* const invoke_http = controller.getProcessor<InvokeHTTP>(); + const TestHTTPServer http_server; invoke_http->setProperty(InvokeHTTP::Method.name, "POST"); - invoke_http->setProperty(InvokeHTTP::URL.name, http_server.URL); + invoke_http->setProperty(InvokeHTTP::URL.name, TestHTTPServer::URL); invoke_http->setProperty(InvokeHTTP::AttributesToSend.name, ".*"); const auto result = controller.trigger(InputFlowFileData{.content = test_content, .attributes = { {std::string{InvokeHTTP::STATUS_MESSAGE}, std::string{test_attr_value_in}}, @@ -396,8 +424,9 @@ TEST_CASE("InvokeHTTP: invalid characters are removed from outgoing HTTP headers CHECK(result.at(InvokeHTTP::RelRetry).empty()); CHECK(!result.at(InvokeHTTP::Success).empty()); CHECK(!result.at(InvokeHTTP::RelResponse).empty()); - CHECK(utils::verifyLogLinePresenceInPollTime(1s, fmt::format("key:{} value:{}", InvokeHTTP::STATUS_MESSAGE, test_attr_value_out))); - CHECK(utils::verifyLogLinePresenceInPollTime(1s, fmt::format("Payload:\n{}\n----", test_content))); + CHECK(controller.plan->getContent(result.at(InvokeHTTP::Success)[0]) == test_content); + auto headers = http_server.getHeaders(); + CHECK(headers.at(std::string{InvokeHTTP::STATUS_MESSAGE}) == test_attr_value_out); } } // namespace org::apache::nifi::minifi::test diff --git a/libminifi/test/integration/C2NullConfiguration.cpp b/libminifi/test/integration/C2NullConfiguration.cpp index e78e62841..ec1664d66 100644 --- a/libminifi/test/integration/C2NullConfiguration.cpp +++ b/libminifi/test/integration/C2NullConfiguration.cpp @@ -23,7 +23,6 @@ #include "core/logging/Logger.h" #include "core/ProcessGroup.h" #include "integration/TestServer.h" -#include "protocols/RESTReceiver.h" #include "c2/C2Agent.h" #include "processors/LogAttribute.h" #include "integration/HTTPIntegrationBase.h" @@ -42,7 +41,6 @@ class VerifyC2Server : public HTTPIntegrationBase { void testSetup() override { LogTestController::getInstance().setDebug<minifi::http::HTTPClient>(); LogTestController::getInstance().setDebug<processors::InvokeHTTP>(); - LogTestController::getInstance().setDebug<c2::RESTReceiver>(); LogTestController::getInstance().setDebug<c2::C2Agent>(); LogTestController::getInstance().setDebug<processors::LogAttribute>(); LogTestController::getInstance().setDebug<core::ProcessSession>(); diff --git a/libminifi/test/integration/C2VerifyHeartbeatAndStop.cpp b/libminifi/test/integration/C2VerifyHeartbeatAndStop.cpp index 3eb4eb710..700e02e75 100644 --- a/libminifi/test/integration/C2VerifyHeartbeatAndStop.cpp +++ b/libminifi/test/integration/C2VerifyHeartbeatAndStop.cpp @@ -19,7 +19,6 @@ #include "c2/C2Agent.h" #include "protocols/RESTProtocol.h" #include "protocols/RESTSender.h" -#include "protocols/RESTReceiver.h" #include "integration/HTTPIntegrationBase.h" #include "integration/HTTPHandlers.h" #include "unit/TestUtils.h" @@ -34,7 +33,6 @@ class VerifyC2Heartbeat : public VerifyC2Base { LogTestController::getInstance().setTrace<minifi::c2::C2Agent>(); LogTestController::getInstance().setDebug<minifi::c2::RESTSender>(); LogTestController::getInstance().setDebug<minifi::c2::RESTProtocol>(); - LogTestController::getInstance().setDebug<minifi::c2::RESTReceiver>(); VerifyC2Base::testSetup(); } diff --git a/libminifi/test/integration/C2VerifyLightweightHeartbeatAndStop.cpp b/libminifi/test/integration/C2VerifyLightweightHeartbeatAndStop.cpp index dae07f1fe..aa26ce524 100644 --- a/libminifi/test/integration/C2VerifyLightweightHeartbeatAndStop.cpp +++ b/libminifi/test/integration/C2VerifyLightweightHeartbeatAndStop.cpp @@ -21,7 +21,6 @@ #include "c2/C2Agent.h" #include "protocols/RESTProtocol.h" #include "protocols/RESTSender.h" -#include "protocols/RESTReceiver.h" #include "integration/HTTPIntegrationBase.h" #include "integration/HTTPHandlers.h" #include "unit/TestUtils.h" @@ -58,7 +57,6 @@ class VerifyLightWeightC2Heartbeat : public VerifyC2Base { LogTestController::getInstance().setTrace<minifi::c2::C2Agent>(); LogTestController::getInstance().setDebug<minifi::c2::RESTSender>(); LogTestController::getInstance().setDebug<minifi::c2::RESTProtocol>(); - LogTestController::getInstance().setDebug<minifi::c2::RESTReceiver>(); VerifyC2Base::testSetup(); } diff --git a/libminifi/test/integration/C2VerifyResourceConsumptionInHeartbeat.cpp b/libminifi/test/integration/C2VerifyResourceConsumptionInHeartbeat.cpp index bda77d6f8..37e1f07de 100644 --- a/libminifi/test/integration/C2VerifyResourceConsumptionInHeartbeat.cpp +++ b/libminifi/test/integration/C2VerifyResourceConsumptionInHeartbeat.cpp @@ -22,7 +22,6 @@ #include "c2/C2Agent.h" #include "protocols/RESTProtocol.h" #include "protocols/RESTSender.h" -#include "protocols/RESTReceiver.h" #include "integration/HTTPIntegrationBase.h" #include "integration/HTTPHandlers.h" #include "unit/TestUtils.h" @@ -111,7 +110,6 @@ class VerifyResourceConsumptionInHeartbeat : public VerifyC2Base { LogTestController::getInstance().setTrace<minifi::c2::C2Agent>(); LogTestController::getInstance().setDebug<minifi::c2::RESTSender>(); LogTestController::getInstance().setDebug<minifi::c2::RESTProtocol>(); - LogTestController::getInstance().setDebug<minifi::c2::RESTReceiver>(); VerifyC2Base::testSetup(); } diff --git a/libminifi/test/integration/CMakeLists.txt b/libminifi/test/integration/CMakeLists.txt index bd7bf697a..3fb3fd88a 100644 --- a/libminifi/test/integration/CMakeLists.txt +++ b/libminifi/test/integration/CMakeLists.txt @@ -25,7 +25,7 @@ FOREACH(testfile ${INTEGRATION_TESTS}) get_filename_component(testfilename "${testfile}" NAME_WE) add_minifi_executable("${testfilename}" "${TEST_DIR}/integration/${testfile}") createIntegrationTests("${testfilename}") - target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/extensions/civetweb/") + target_include_directories(${testfilename} BEFORE PRIVATE "${CIVETWEB_INCLUDE_DIRS}") target_include_directories(${testfilename} BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/extensions/standard-processors/") target_link_libraries(${testfilename} minifi-standard-processors) target_link_libraries(${testfilename} Catch2WithMain Threads::Threads) diff --git a/libminifi/test/libtest/CMakeLists.txt b/libminifi/test/libtest/CMakeLists.txt index 95ab353f7..7d5bc957b 100644 --- a/libminifi/test/libtest/CMakeLists.txt +++ b/libminifi/test/libtest/CMakeLists.txt @@ -16,5 +16,9 @@ # specific language governing permissions and limitations # under the License. # + +include(GetCivetWeb) +get_civetweb() + add_subdirectory(unit) add_subdirectory(integration) diff --git a/libminifi/test/libtest/integration/CMakeLists.txt b/libminifi/test/libtest/integration/CMakeLists.txt index 7225eb4b2..dabf16203 100644 --- a/libminifi/test/libtest/integration/CMakeLists.txt +++ b/libminifi/test/libtest/integration/CMakeLists.txt @@ -18,6 +18,6 @@ # file(GLOB SOURCES "*.cpp") add_minifi_library(libminifi-integrationtest STATIC ${SOURCES}) -target_link_libraries(libminifi-integrationtest libminifi-unittest minifi-civet-extensions) +target_link_libraries(libminifi-integrationtest libminifi-unittest civetweb::civetweb-cpp) target_include_directories(libminifi-integrationtest BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/libminifi/include/" "${CMAKE_SOURCE_DIR}/libminifi/test/libtest/") -target_include_directories(libminifi-integrationtest BEFORE PRIVATE "${CMAKE_SOURCE_DIR}/extensions/civetweb/") +target_include_directories(libminifi-integrationtest BEFORE PRIVATE "${CIVETWEB_INCLUDE_DIRS}") diff --git a/libminifi/test/unit/CertificateUtilsTests.cpp b/libminifi/test/unit/CertificateUtilsTests.cpp index 912eebb07..3700a7513 100644 --- a/libminifi/test/unit/CertificateUtilsTests.cpp +++ b/libminifi/test/unit/CertificateUtilsTests.cpp @@ -30,12 +30,12 @@ TEST_CASE("getCertificateExpiration() works correctly") { using namespace std::literals::chrono_literals; const auto executable_dir = utils::file::get_executable_dir(); - const auto cert_location = executable_dir / "resources" / "goodCA.crt"; + const auto cert_location = executable_dir / "resources" / "ca_A.crt"; size_t num_times_called = 0; utils::tls::processPEMCertificate(cert_location, {}, {[&](utils::tls::X509_unique_ptr cert) { ++num_times_called; - CHECK(utils::tls::getCertificateExpiration(cert) == date::sys_days(date::year_month_day(2053_y / 4 / 30)) + 9h + 3min); + CHECK(utils::tls::getCertificateExpiration(cert) == date::sys_days(date::year_month_day(2033_y / 6 / 26)) + 12h + 26min + 48s); return std::error_code{}; }, {}, {}}); CHECK(num_times_called == 1);
