From 9cdac519b92474c13a998a6fa8956c935b2d3e4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mario=20Dom=C3=ADnguez=20L=C3=B3pez?= <116071334+Mario-DL@users.noreply.github.com> Date: Wed, 22 May 2024 14:36:40 +0200 Subject: [PATCH 1/4] Use absolute paths when loading XML files (#4751) * Refs #10173: Add XMLLoadFile unittest Signed-off-by: Mario Dominguez * Refs #10173: Use absolute paths when loading XML files Signed-off-by: Mario Dominguez * Refs #10173: Fix windows.h INTERFACE name collision Signed-off-by: Mario Dominguez * Refs #10173: Avoid MINMAX windows warning as error in unittests Signed-off-by: Mario Dominguez * Refs #10173: Use DEFAULT_FASTDDS_PROFILES for windows Signed-off-by: Mario Dominguez * Refs #10173: Enable internal debug in test Signed-off-by: Mario Dominguez * Refs #10173: Force log info in the test Signed-off-by: Mario Dominguez * Refs #10173: Correct windows FASTDDS_DEFAULT PROFILES env and include fastdds/log instead of fastrtps Signed-off-by: Mario Dominguez --------- Signed-off-by: Mario Dominguez (cherry picked from commit 0919ff294457546c72d5f8810eb61ec48b67e95e) # Conflicts: # include/fastrtps/xmlparser/XMLParserCommon.h # src/cpp/rtps/xmlparser/XMLParser.cpp # src/cpp/rtps/xmlparser/XMLParserCommon.cpp # src/cpp/rtps/xmlparser/XMLProfileManager.cpp # test/unittest/xmlparser/CMakeLists.txt --- include/fastrtps/xmlparser/XMLParser.h | 12 ++ include/fastrtps/xmlparser/XMLParserCommon.h | 8 + .../fastrtps/xmlparser/XMLProfileManager.h | 12 ++ src/cpp/rtps/xmlparser/XMLParser.cpp | 174 ++++++++++++++++++ src/cpp/rtps/xmlparser/XMLParserCommon.cpp | 8 + src/cpp/rtps/xmlparser/XMLProfileManager.cpp | 68 ++++++- test/unittest/dds/status/CMakeLists.txt | 1 + test/unittest/logging/mock/MockConsumer.h | 24 ++- test/unittest/xmlparser/CMakeLists.txt | 99 ++++++++++ test/unittest/xmlparser/XMLLoadFileTests.cpp | 136 ++++++++++++++ 10 files changed, 536 insertions(+), 6 deletions(-) create mode 100644 test/unittest/xmlparser/XMLLoadFileTests.cpp diff --git a/include/fastrtps/xmlparser/XMLParser.h b/include/fastrtps/xmlparser/XMLParser.h index b57a33dd457..5683765c1f9 100644 --- a/include/fastrtps/xmlparser/XMLParser.h +++ b/include/fastrtps/xmlparser/XMLParser.h @@ -108,6 +108,18 @@ class XMLParser const std::string& filename, up_base_node_t& root); + /** + * Load a XML file. + * @param filename Name for the file to be loaded. + * @param root Root node. + * @param is_default Is the default XML file. + * @return XMLP_ret::XML_OK on success, XMLP_ret::XML_ERROR in other case. + */ + static XMLP_ret loadXML( + const std::string& filename, + up_base_node_t& root, + bool is_default); + /** * Load a XML data from buffer. * @param data XML data to load. diff --git a/include/fastrtps/xmlparser/XMLParserCommon.h b/include/fastrtps/xmlparser/XMLParserCommon.h index 7ffd2e9133a..e92d6e70474 100644 --- a/include/fastrtps/xmlparser/XMLParserCommon.h +++ b/include/fastrtps/xmlparser/XMLParserCommon.h @@ -59,6 +59,14 @@ extern const char* SEND_BUFFER_SIZE; extern const char* TTL; extern const char* NON_BLOCKING_SEND; extern const char* WHITE_LIST; +<<<<<<< HEAD:include/fastrtps/xmlparser/XMLParserCommon.h +======= +extern const char* NETWORK_INTERFACE; +extern const char* NETMASK_FILTER; +extern const char* NETWORK_INTERFACES; +extern const char* ALLOWLIST; +extern const char* BLOCKLIST; +>>>>>>> 0919ff294 (Use absolute paths when loading XML files (#4751)):src/cpp/xmlparser/XMLParserCommon.h extern const char* MAX_MESSAGE_SIZE; extern const char* MAX_INITIAL_PEERS_RANGE; extern const char* KEEP_ALIVE_FREQUENCY; diff --git a/include/fastrtps/xmlparser/XMLProfileManager.h b/include/fastrtps/xmlparser/XMLProfileManager.h index a8b2f6885b8..6d670f239c8 100644 --- a/include/fastrtps/xmlparser/XMLProfileManager.h +++ b/include/fastrtps/xmlparser/XMLProfileManager.h @@ -70,6 +70,18 @@ class XMLProfileManager RTPS_DllAPI static XMLP_ret loadXMLFile( const std::string& filename); + /** + * Load a profiles XML file. + * @param filename Name for the file to be loaded. + * @param is_default Flag to indicate if the file is a default profiles file. + * @return XMLP_ret::XML_OK if all profiles are correct, XMLP_ret::XML_NOK if some are and some are not, + * XMLP_ret::XML_ERROR in other case. + */ + + static XMLP_ret loadXMLFile( + const std::string& filename, + bool is_default); + /** * Load a profiles XML string. * @param data Buffer containing the data. diff --git a/src/cpp/rtps/xmlparser/XMLParser.cpp b/src/cpp/rtps/xmlparser/XMLParser.cpp index 8ba659db413..beb2384bafe 100644 --- a/src/cpp/rtps/xmlparser/XMLParser.cpp +++ b/src/cpp/rtps/xmlparser/XMLParser.cpp @@ -16,11 +16,23 @@ #include #include +<<<<<<< HEAD:src/cpp/rtps/xmlparser/XMLParser.cpp #include #include #include #include #include +======= +#include +#include +#include +#include +#ifdef _WIN32 +#include +#else +#include +#endif // _WIN32 +>>>>>>> 0919ff294 (Use absolute paths when loading XML files (#4751)):src/cpp/xmlparser/XMLParser.cpp #include @@ -39,7 +51,36 @@ namespace xmlparser { XMLP_ret XMLParser::loadDefaultXMLFile( up_base_node_t& root) { +<<<<<<< HEAD:src/cpp/rtps/xmlparser/XMLParser.cpp return loadXML(DEFAULT_FASTRTPS_PROFILES, root); +======= + // Use absolute path to ensure that the file is loaded only once +#ifdef _WIN32 + char current_directory[MAX_PATH]; + if (GetCurrentDirectory(MAX_PATH, current_directory) == 0) + { + EPROSIMA_LOG_ERROR(XMLPARSER, "GetCurrentDirectory failed " << GetLastError()); + } + else + { + strcat_s(current_directory, MAX_PATH, DEFAULT_FASTDDS_PROFILES); + return loadXML(current_directory, root, true); + } +#else + char current_directory[PATH_MAX]; + if (getcwd(current_directory, PATH_MAX) == NULL) + { + EPROSIMA_LOG_ERROR(XMLPARSER, "getcwd failed " << std::strerror(errno)); + } + else + { + strcat(current_directory, "/"); + strcat(current_directory, DEFAULT_FASTDDS_PROFILES); + return loadXML(current_directory, root, true); + } +#endif // _WIN32 + return XMLP_ret::XML_ERROR; +>>>>>>> 0919ff294 (Use absolute paths when loading XML files (#4751)):src/cpp/xmlparser/XMLParser.cpp } XMLP_ret XMLParser::parseXML( @@ -282,7 +323,59 @@ XMLP_ret XMLParser::parseXMLTransportData( { sType = p_aux0->GetText(); } +<<<<<<< HEAD:src/cpp/rtps/xmlparser/XMLParser.cpp else +======= + } + + XMLProfileManager::insertTransportById(sId, pDescriptor); + return ret; +} + +XMLP_ret XMLParser::validateXMLTransportElements( + tinyxml2::XMLElement& p_root) +{ + XMLP_ret ret = XMLP_ret::XML_OK; + for (tinyxml2::XMLElement* p_aux0 = p_root.FirstChildElement(); p_aux0 != nullptr; + p_aux0 = p_aux0->NextSiblingElement()) + { + const char* name = p_aux0->Name(); + if (!(strcmp(name, TRANSPORT_ID) == 0 || + strcmp(name, TYPE) == 0 || + strcmp(name, SEND_BUFFER_SIZE) == 0 || + strcmp(name, RECEIVE_BUFFER_SIZE) == 0 || + strcmp(name, MAX_MESSAGE_SIZE) == 0 || + strcmp(name, MAX_INITIAL_PEERS_RANGE) == 0 || + strcmp(name, WHITE_LIST) == 0 || + strcmp(name, NETMASK_FILTER) == 0 || + strcmp(name, NETWORK_INTERFACES) == 0 || + strcmp(name, TTL) == 0 || + strcmp(name, NON_BLOCKING_SEND) == 0 || + strcmp(name, UDP_OUTPUT_PORT) == 0 || + strcmp(name, TCP_WAN_ADDR) == 0 || + strcmp(name, KEEP_ALIVE_FREQUENCY) == 0 || + strcmp(name, KEEP_ALIVE_TIMEOUT) == 0 || + strcmp(name, MAX_LOGICAL_PORT) == 0 || + strcmp(name, LOGICAL_PORT_RANGE) == 0 || + strcmp(name, LOGICAL_PORT_INCREMENT) == 0 || + strcmp(name, LISTENING_PORTS) == 0 || + strcmp(name, CALCULATE_CRC) == 0 || + strcmp(name, CHECK_CRC) == 0 || + strcmp(name, KEEP_ALIVE_THREAD) == 0 || + strcmp(name, ACCEPT_THREAD) == 0 || + strcmp(name, ENABLE_TCP_NODELAY) == 0 || + strcmp(name, TCP_NEGOTIATION_TIMEOUT) == 0 || + strcmp(name, TLS) == 0 || + strcmp(name, SEGMENT_SIZE) == 0 || + strcmp(name, PORT_QUEUE_CAPACITY) == 0 || + strcmp(name, HEALTHY_CHECK_TIMEOUT_MS) == 0 || + strcmp(name, RTPS_DUMP_FILE) == 0 || + strcmp(name, DEFAULT_RECEPTION_THREADS) == 0 || + strcmp(name, RECEPTION_THREADS) == 0 || + strcmp(name, DUMP_THREAD) == 0 || + strcmp(name, PORT_OVERFLOW_POLICY) == 0 || + strcmp(name, SEGMENT_OVERFLOW_POLICY) == 0)) +>>>>>>> 0919ff294 (Use absolute paths when loading XML files (#4751)):src/cpp/xmlparser/XMLParser.cpp { logError(XMLPARSER, "'" << TYPE << "' attribute cannot be empty"); return XMLP_ret::XML_ERROR; @@ -477,7 +570,11 @@ XMLP_ret XMLParser::parseXMLCommonTransportData( p_aux1 != nullptr; p_aux1 = p_aux1->NextSiblingElement()) { address = p_aux1->Name(); +<<<<<<< HEAD:src/cpp/rtps/xmlparser/XMLParser.cpp if (strcmp(address, ADDRESS) == 0) +======= + if (strcmp(address, ADDRESS) == 0 || strcmp(address, NETWORK_INTERFACE) == 0) +>>>>>>> 0919ff294 (Use absolute paths when loading XML files (#4751)):src/cpp/xmlparser/XMLParser.cpp { const char* text = p_aux1->GetText(); if (nullptr != text) @@ -506,7 +603,72 @@ XMLP_ret XMLParser::parseXMLCommonTransportData( strcmp(name, HEALTHY_CHECK_TIMEOUT_MS) == 0 || strcmp(name, HEALTHY_CHECK_TIMEOUT_MS) == 0 || strcmp(name, RTPS_DUMP_FILE) == 0) { +<<<<<<< HEAD:src/cpp/rtps/xmlparser/XMLParser.cpp // Parsed outside of this method +======= + std::string netmask_filter_str; + if (XMLP_ret::XML_OK != getXMLString(p_aux0, &netmask_filter_str, 0)) + { + EPROSIMA_LOG_ERROR(XMLPARSER, "Invalid element found into 'netmask_filter'."); + return XMLP_ret::XML_ERROR; + } + + try + { + p_transport->netmask_filter = fastdds::rtps::network::netmask_filter::string_to_netmask_filter_kind( + netmask_filter_str); + } + catch (const std::invalid_argument& e) + { + EPROSIMA_LOG_ERROR(XMLPARSER, "Invalid element found into 'netmask_filter' : " << e.what()); + return XMLP_ret::XML_ERROR; + } + } + else if (strcmp(name, NETWORK_INTERFACES) == 0) + { + if (XMLP_ret::XML_OK != parseXMLInterfaces(p_aux0, p_transport)) + { + EPROSIMA_LOG_ERROR(XMLPARSER, "Failed to parse 'interfaces' element."); + return XMLP_ret::XML_ERROR; + } + } + } + return XMLP_ret::XML_OK; +} + +XMLP_ret XMLParser::parseXMLInterfaces( + tinyxml2::XMLElement* p_root, + std::shared_ptr p_transport) +{ + /* + + + + + + + */ + tinyxml2::XMLElement* p_aux0 = nullptr; + const char* name = nullptr; + for (p_aux0 = p_root->FirstChildElement(); p_aux0 != nullptr; p_aux0 = p_aux0->NextSiblingElement()) + { + name = p_aux0->Name(); + if (strcmp(name, ALLOWLIST) == 0) + { + if (XMLP_ret::XML_OK != parseXMLAllowlist(p_aux0, p_transport)) + { + EPROSIMA_LOG_ERROR(XMLPARSER, "Failed to parse 'allowlist'."); + return XMLP_ret::XML_ERROR; + } + } + else if (strcmp(name, BLOCKLIST) == 0) + { + if (XMLP_ret::XML_OK != parseXMLBlocklist(p_aux0, p_transport)) + { + EPROSIMA_LOG_ERROR(XMLPARSER, "Failed to parse 'blocklist'."); + return XMLP_ret::XML_ERROR; + } +>>>>>>> 0919ff294 (Use absolute paths when loading XML files (#4751)):src/cpp/xmlparser/XMLParser.cpp } else { @@ -1650,6 +1812,14 @@ XMLP_ret XMLParser::parseXMLConsumer( XMLP_ret XMLParser::loadXML( const std::string& filename, up_base_node_t& root) +{ + return loadXML(filename, root, false); +} + +XMLP_ret XMLParser::loadXML( + const std::string& filename, + up_base_node_t& root, + bool is_default) { if (filename.empty()) { @@ -1660,7 +1830,11 @@ XMLP_ret XMLParser::loadXML( tinyxml2::XMLDocument xmlDoc; if (tinyxml2::XMLError::XML_SUCCESS != xmlDoc.LoadFile(filename.c_str())) { +<<<<<<< HEAD:src/cpp/rtps/xmlparser/XMLParser.cpp if (filename != std::string(DEFAULT_FASTRTPS_PROFILES)) +======= + if (!is_default) +>>>>>>> 0919ff294 (Use absolute paths when loading XML files (#4751)):src/cpp/xmlparser/XMLParser.cpp { logError(XMLPARSER, "Error opening '" << filename << "'"); } diff --git a/src/cpp/rtps/xmlparser/XMLParserCommon.cpp b/src/cpp/rtps/xmlparser/XMLParserCommon.cpp index d4339a436bc..a66213caca7 100644 --- a/src/cpp/rtps/xmlparser/XMLParserCommon.cpp +++ b/src/cpp/rtps/xmlparser/XMLParserCommon.cpp @@ -46,6 +46,14 @@ const char* SEND_BUFFER_SIZE = "sendBufferSize"; const char* TTL = "TTL"; const char* NON_BLOCKING_SEND = "non_blocking_send"; const char* WHITE_LIST = "interfaceWhiteList"; +<<<<<<< HEAD:src/cpp/rtps/xmlparser/XMLParserCommon.cpp +======= +const char* NETWORK_INTERFACE = "interface"; +const char* NETMASK_FILTER = "netmask_filter"; +const char* NETWORK_INTERFACES = "interfaces"; +const char* ALLOWLIST = "allowlist"; +const char* BLOCKLIST = "blocklist"; +>>>>>>> 0919ff294 (Use absolute paths when loading XML files (#4751)):src/cpp/xmlparser/XMLParserCommon.cpp const char* MAX_MESSAGE_SIZE = "maxMessageSize"; const char* MAX_INITIAL_PEERS_RANGE = "maxInitialPeersRange"; const char* KEEP_ALIVE_FREQUENCY = "keep_alive_frequency_ms"; diff --git a/src/cpp/rtps/xmlparser/XMLProfileManager.cpp b/src/cpp/rtps/xmlparser/XMLProfileManager.cpp index 09ec4ee43f7..5c09548af48 100644 --- a/src/cpp/rtps/xmlparser/XMLProfileManager.cpp +++ b/src/cpp/rtps/xmlparser/XMLProfileManager.cpp @@ -20,7 +20,9 @@ #include #ifdef _WIN32 #include -#endif // ifdef _WIN32 +#else +#include +#endif // _WIN32 using namespace eprosima::fastrtps; using namespace ::xmlparser; @@ -166,10 +168,21 @@ void XMLProfileManager::loadDefaultXMLFile() // Try to load the default XML file set with an environment variable. #ifdef _WIN32 char file_path[MAX_PATH]; + char absolute_path[MAX_PATH]; + char current_directory[MAX_PATH]; + char** filename = {nullptr}; size_t size = MAX_PATH; if (getenv_s(&size, file_path, size, DEFAULT_FASTRTPS_ENV_VARIABLE) == 0 && size > 0) { - loadXMLFile(file_path); + // Use absolute path to ensure the file is loaded only once + if (GetFullPathName(file_path, MAX_PATH, absolute_path, filename) == 0) + { + EPROSIMA_LOG_ERROR(XMLPARSER, "GetFullPathName failed " << GetLastError()); + } + else + { + loadXMLFile(absolute_path); + } } // Should take into account '\0' @@ -179,13 +192,36 @@ void XMLProfileManager::loadDefaultXMLFile() // Try to load the default XML file if variable does not exist or is not set to '1' if (!(getenv_s(&size, skip_xml, size, SKIP_DEFAULT_XML_FILE) == 0 && skip_xml[0] == '1')) { +<<<<<<< HEAD:src/cpp/rtps/xmlparser/XMLProfileManager.cpp loadXMLFile(DEFAULT_FASTRTPS_PROFILES); +======= + // Try to load the default XML file. + if (GetCurrentDirectory(MAX_PATH, current_directory) == 0) + { + EPROSIMA_LOG_ERROR(XMLPARSER, "GetCurrentDirectory failed " << GetLastError()); + } + else + { + strcat_s(current_directory, MAX_PATH, "\\"); + strcat_s(current_directory, MAX_PATH, DEFAULT_FASTDDS_PROFILES); + loadXMLFile(current_directory, true); + } +>>>>>>> 0919ff294 (Use absolute paths when loading XML files (#4751)):src/cpp/xmlparser/XMLProfileManager.cpp } #else + char absolute_path[PATH_MAX]; if (const char* file_path = std::getenv(DEFAULT_FASTRTPS_ENV_VARIABLE)) { - loadXMLFile(file_path); + char* res = realpath(file_path, absolute_path); + if (res) + { + loadXMLFile(absolute_path); + } + else + { + EPROSIMA_LOG_ERROR(XMLPARSER, "realpath failed " << std::strerror(errno)); + } } const char* skip_xml = std::getenv(SKIP_DEFAULT_XML_FILE); @@ -193,7 +229,20 @@ void XMLProfileManager::loadDefaultXMLFile() // Try to load the default XML file if variable does not exist or is not set to '1' if (!(skip_xml != nullptr && skip_xml[0] == '1')) { +<<<<<<< HEAD:src/cpp/rtps/xmlparser/XMLProfileManager.cpp loadXMLFile(DEFAULT_FASTRTPS_PROFILES); +======= + if (getcwd(absolute_path, PATH_MAX) == NULL) + { + EPROSIMA_LOG_ERROR(XMLPARSER, "getcwd failed " << std::strerror(errno)); + } + else + { + strcat(absolute_path, "/"); + strcat(absolute_path, DEFAULT_FASTDDS_PROFILES); + loadXMLFile(absolute_path, true); + } +>>>>>>> 0919ff294 (Use absolute paths when loading XML files (#4751)):src/cpp/xmlparser/XMLProfileManager.cpp } #endif // ifdef _WIN32 @@ -279,6 +328,13 @@ XMLP_ret XMLProfileManager::loadXMLNode( XMLP_ret XMLProfileManager::loadXMLFile( const std::string& filename) +{ + return loadXMLFile(filename, false); +} + +XMLP_ret XMLProfileManager::loadXMLFile( + const std::string& filename, + bool is_default) { if (filename.empty()) { @@ -294,10 +350,14 @@ XMLP_ret XMLProfileManager::loadXMLFile( } up_base_node_t root_node; - XMLP_ret loaded_ret = XMLParser::loadXML(filename, root_node); + XMLP_ret loaded_ret = XMLParser::loadXML(filename, root_node, is_default); if (!root_node || loaded_ret != XMLP_ret::XML_OK) { +<<<<<<< HEAD:src/cpp/rtps/xmlparser/XMLProfileManager.cpp if (filename != std::string(DEFAULT_FASTRTPS_PROFILES)) +======= + if (!is_default) +>>>>>>> 0919ff294 (Use absolute paths when loading XML files (#4751)):src/cpp/xmlparser/XMLProfileManager.cpp { logError(XMLPARSER, "Error parsing '" << filename << "'"); } diff --git a/test/unittest/dds/status/CMakeLists.txt b/test/unittest/dds/status/CMakeLists.txt index 2c848d3a802..be51a4d1e50 100644 --- a/test/unittest/dds/status/CMakeLists.txt +++ b/test/unittest/dds/status/CMakeLists.txt @@ -142,6 +142,7 @@ target_compile_definitions(ListenerTests PRIVATE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. $<$:_ENABLE_ATOMIC_ALIGNMENT_FIX> + $<$:NOMINMAX> # avoid conflic with std::min & std::max in visual studio ) target_include_directories(ListenerTests PRIVATE ${Asio_INCLUDE_DIR} diff --git a/test/unittest/logging/mock/MockConsumer.h b/test/unittest/logging/mock/MockConsumer.h index 0337ad23c5d..d39f5038145 100644 --- a/test/unittest/logging/mock/MockConsumer.h +++ b/test/unittest/logging/mock/MockConsumer.h @@ -60,10 +60,20 @@ class MockConsumer : public StdoutConsumer template void wait( - Pred pred) + Pred pred, + std::chrono::seconds timeout = std::chrono::seconds::zero()) { std::unique_lock lock(mMutex); - cv_.wait(lock, pred); + + if (timeout == std::chrono::seconds::zero()) + { + cv_.wait(lock, pred); + } + else + { + cv_.wait_for(lock, timeout, pred); + } + } void wait_for_at_least_entries( @@ -75,6 +85,16 @@ class MockConsumer : public StdoutConsumer }); } + void wait_for_at_least_entries_for( + size_t num_entries, + std::chrono::seconds timeout) + { + return wait([this, num_entries]() -> bool + { + return mEntriesConsumed.size() >= num_entries; + }, timeout); + } + void clear_entries() { std::unique_lock guard(mMutex); diff --git a/test/unittest/xmlparser/CMakeLists.txt b/test/unittest/xmlparser/CMakeLists.txt index 0676b3a2d04..8b14e8133ef 100644 --- a/test/unittest/xmlparser/CMakeLists.txt +++ b/test/unittest/xmlparser/CMakeLists.txt @@ -125,6 +125,7 @@ target_compile_definitions(XMLProfileParserTests PRIVATE ASIO_STANDALONE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. + $<$:NOMINMAX> # avoid conflic with std::min & std::max in visual studio ) target_include_directories(XMLProfileParserTests PRIVATE ${PROJECT_SOURCE_DIR}/test/mock/rtps/Log @@ -213,6 +214,7 @@ target_compile_definitions(XMLParserTests PRIVATE ASIO_STANDALONE $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. + $<$:NOMINMAX> # avoid conflic with std::min & std::max in visual studio ) target_include_directories(XMLParserTests PRIVATE ${PROJECT_SOURCE_DIR}/test/mock/rtps/SharedMemTransportDescriptor @@ -347,4 +349,101 @@ target_link_libraries(XMLEndpointParserTests GTest::gtest ${TINYXML2_LIBRARY} fastcdr ) +<<<<<<< HEAD add_gtest(XMLEndpointParserTests SOURCES XMLEndpointParserTests.cpp) +======= +if(QNX) + target_link_libraries(XMLEndpointParserTests socket) +endif() +gtest_discover_tests(XMLEndpointParserTests) + +###################################### XMLLoadFileTests ###################################################### +set(XMLLOADFILE_SOURCE + XMLLoadFileTests.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/publisher/qos/WriterQos.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/subscriber/qos/ReaderQos.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/topic/TopicDataType.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/xtypes/exception/Exception.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/rtps/attributes/ThreadSettings.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/rtps/common/LocatorWithMask.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/rtps/common/Time_t.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/rtps/flowcontrol/FlowControllerConsts.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/rtps/flowcontrol/ThroughputControllerDescriptor.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/rtps/network/utils/netmask_filter.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/rtps/network/utils/network.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/rtps/transport/network/NetmaskFilterKind.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/rtps/transport/network/NetworkInterface.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/rtps/transport/network/NetworkInterfaceWithFilter.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/rtps/transport/PortBasedTransportDescriptor.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/utils/md5.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/utils/string_convert.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/utils/UnitsParser.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/xmlparser/XMLDynamicParser.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/xmlparser/XMLElementParser.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/xmlparser/XMLParser.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/xmlparser/XMLParserCommon.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/xmlparser/XMLProfileManager.cpp + + # locators + ${PROJECT_SOURCE_DIR}/src/cpp/utils/IPFinder.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/utils/IPLocator.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/utils/SystemInfo.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/utils/UnitsParser.cpp + ) + +# External sources +if(TINYXML2_SOURCE_DIR) + list(APPEND XMLLOADFILE_SOURCE + ${TINYXML2_SOURCE_DIR}/tinyxml2.cpp + ) +endif() + +if(ANDROID) + if (ANDROID_NATIVE_API_LEVEL LESS 24) + list(APPEND XMLLOADFILE_SOURCE + ${ANDROID_IFADDRS_SOURCE_DIR}/ifaddrs.c + ) + endif() +endif() + +add_executable(XMLLoadFileTests ${XMLLOADFILE_SOURCE}) +target_compile_definitions(XMLLoadFileTests PRIVATE + BOOST_ASIO_STANDALONE + ASIO_STANDALONE + $<$:NOMINMAX> # avoid conflict with std::min & std::max in visual studio + $<$>,$>:__DEBUG> + $<$:__INTERNALDEBUG> # Internal debug activated. + HAVE_LOG_NO_INFO=0 FASTDDS_ENFORCE_LOG_INFO # Need LOG_INFO in this test + ) +target_include_directories(XMLLoadFileTests PRIVATE + ${PROJECT_SOURCE_DIR}/test/mock/dds/TypeObjectRegistry + ${PROJECT_SOURCE_DIR}/test/mock/dds/TypeObjectUtils + ${PROJECT_SOURCE_DIR}/test/mock/rtps/RTPSDomainImpl # Dependency of fastdds::xtypes::type_representation + ${PROJECT_SOURCE_DIR}/test/mock/rtps/SharedMemTransportDescriptor + ${PROJECT_SOURCE_DIR}/test/mock/rtps/TCPTransportDescriptor + ${PROJECT_SOURCE_DIR}/test/mock/rtps/TCPv4TransportDescriptor + ${PROJECT_SOURCE_DIR}/test/mock/rtps/TCPv6TransportDescriptor + ${PROJECT_SOURCE_DIR}/test/mock/rtps/UDPTransportDescriptor + ${PROJECT_SOURCE_DIR}/test/mock/rtps/UDPv4TransportDescriptor + ${PROJECT_SOURCE_DIR}/test/mock/rtps/UDPv6TransportDescriptor + ${PROJECT_SOURCE_DIR}/test/mock/rtps/RTPSParticipantAttributes + ${PROJECT_SOURCE_DIR}/include + ${PROJECT_BINARY_DIR}/include + ${PROJECT_SOURCE_DIR}/src/cpp + ${Asio_INCLUDE_DIR} + $<$:${ANDROID_IFADDRS_INCLUDE_DIR}> + ) + +target_link_libraries(XMLLoadFileTests GTest::gtest + $<$:iphlpapi$Shlwapi> + $<$:ws2_32> + ${TINYXML2_LIBRARY} + fastcdr + fastdds::log + fastdds::xtypes::dynamic-types::impl + ) +if(QNX) + target_link_libraries(XMLLoadFileTests socket) +endif() +gtest_discover_tests(XMLLoadFileTests) +>>>>>>> 0919ff294 (Use absolute paths when loading XML files (#4751)) diff --git a/test/unittest/xmlparser/XMLLoadFileTests.cpp b/test/unittest/xmlparser/XMLLoadFileTests.cpp new file mode 100644 index 00000000000..557170d7710 --- /dev/null +++ b/test/unittest/xmlparser/XMLLoadFileTests.cpp @@ -0,0 +1,136 @@ +// Copyright 2024 Proyectos y Sistemas de Mantenimiento SL (eProsima +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include +#include +#ifdef _WIN32 +#include +#else +#include +#include +#endif // ifdef _WIN32 + +#include +#include +#include "../logging/mock/MockConsumer.h" + +#include +#include + +using namespace eprosima::fastdds::dds; +using namespace eprosima::fastrtps; +using namespace ::testing; + +class XMLLoadFileTests : public ::testing::Test +{ +public: + + void helper_block_for_at_least_entries_for( + uint32_t amount, + std::chrono::seconds timeout) + { + mock_consumer_->wait_for_at_least_entries_for( + amount, + timeout); + } + +protected: + + void SetUp() override + { + mock_consumer_ = new eprosima::fastdds::dds::MockConsumer(); + log_consumer_.reset(mock_consumer_); + } + + void TearDown() override + { + //! mock_consumer_ is going to be cleared in log_consumer_ destructor + } + + eprosima::fastdds::dds::MockConsumer* mock_consumer_; + std::unique_ptr log_consumer_; + +private: + + std::mutex xml_mutex_; +}; + +/* + * This test checks that the default XML file is loaded only once when there is a DEFAULT_FASTDDS_PROFILES.xml file + * in the current directory and the environment variable FASTRTPS_DEFAULT_PROFILES_FILE is set pointing to the same + * file. + * 1. Initialize Mock Consumer to consume the LogInfo entry that the library generates when the file has been already + * parsed. Set filters to consume only the desired entry. + * 2. Get current path to set the environment variable to the DEFAULT_FASTDDS_PROFILES.xml file. + * 3. Write the DEFAULT_FASTDDS_PROFILES.xml file in the current directory. + * 4. Load the default XML file. + * 5. Wait for the log entry to be consumed. + */ +TEST_F(XMLLoadFileTests, load_twice_default_xml) +{ + // Register Mock Consumer + Log::ClearConsumers(); + Log::RegisterConsumer(std::move(log_consumer_)); + Log::SetVerbosity(Log::Info); + Log::SetCategoryFilter(std::regex("(XMLPARSER)")); + Log::SetErrorStringFilter(std::regex("(already parsed)")); + + // Current directory +#ifdef _WIN32 + char current_directory[MAX_PATH]; + uint32_t ret = GetCurrentDirectory(MAX_PATH, current_directory); + ASSERT_NE(ret, 0u); + strcat_s(current_directory, MAX_PATH, "\\"); + strcat_s(current_directory, MAX_PATH, xmlparser::DEFAULT_FASTDDS_PROFILES); + // Set environment variable + _putenv_s("FASTDDS_DEFAULT_PROFILES_FILE", current_directory); +#else + char current_directory[PATH_MAX]; + ASSERT_NE(getcwd(current_directory, PATH_MAX), (void*)NULL); + strcat(current_directory, "/"); + strcat(current_directory, xmlparser::DEFAULT_FASTDDS_PROFILES); + // Set environment variable + setenv("FASTDDS_DEFAULT_PROFILES_FILE", current_directory, 1); +#endif // _WIN32 + + // Write DEFAULT_FASTDDS_PROFILES.xml + std::ofstream xmlFile; + xmlFile.open("DEFAULT_FASTDDS_PROFILES.xml"); + xmlFile << ""; + xmlFile << ""; + xmlFile << "truetest_name"; + xmlFile << ""; + xmlFile.close(); + + // Load default XML file + xmlparser::XMLProfileManager::loadDefaultXMLFile(); + + // Log consumer + helper_block_for_at_least_entries_for(1, std::chrono::seconds(2)); + auto consumed_entries = mock_consumer_->ConsumedEntries(); + EXPECT_EQ(consumed_entries.size(), 1u); + + Log::Reset(); + Log::KillThread(); + + std::remove("DEFAULT_FASTDDS_PROFILES.xml"); +} + +int main( + int argc, + char** argv) +{ + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} From 745311a8b24fdffc0f3e3514fd1d795bc3bd8eb7 Mon Sep 17 00:00:00 2001 From: Mario Dominguez Date: Mon, 27 May 2024 12:39:20 +0200 Subject: [PATCH 2/4] Fix conflicts Signed-off-by: Mario Dominguez --- test/unittest/xmlparser/CMakeLists.txt | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/test/unittest/xmlparser/CMakeLists.txt b/test/unittest/xmlparser/CMakeLists.txt index 8b14e8133ef..6ad826920c4 100644 --- a/test/unittest/xmlparser/CMakeLists.txt +++ b/test/unittest/xmlparser/CMakeLists.txt @@ -349,13 +349,8 @@ target_link_libraries(XMLEndpointParserTests GTest::gtest ${TINYXML2_LIBRARY} fastcdr ) -<<<<<<< HEAD + add_gtest(XMLEndpointParserTests SOURCES XMLEndpointParserTests.cpp) -======= -if(QNX) - target_link_libraries(XMLEndpointParserTests socket) -endif() -gtest_discover_tests(XMLEndpointParserTests) ###################################### XMLLoadFileTests ###################################################### set(XMLLOADFILE_SOURCE @@ -383,6 +378,7 @@ set(XMLLOADFILE_SOURCE ${PROJECT_SOURCE_DIR}/src/cpp/xmlparser/XMLParser.cpp ${PROJECT_SOURCE_DIR}/src/cpp/xmlparser/XMLParserCommon.cpp ${PROJECT_SOURCE_DIR}/src/cpp/xmlparser/XMLProfileManager.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/utils/SystemInfo.cpp # locators ${PROJECT_SOURCE_DIR}/src/cpp/utils/IPFinder.cpp @@ -439,11 +435,18 @@ target_link_libraries(XMLLoadFileTests GTest::gtest $<$:ws2_32> ${TINYXML2_LIBRARY} fastcdr - fastdds::log - fastdds::xtypes::dynamic-types::impl ) if(QNX) target_link_libraries(XMLLoadFileTests socket) endif() -gtest_discover_tests(XMLLoadFileTests) ->>>>>>> 0919ff294 (Use absolute paths when loading XML files (#4751)) + +add_gtest(XMLLoadFileTests SOURCES XMLLoadFileTests.cpp) + +if(ANDROID) + set_property(TARGET XMLEndpointParserTests PROPERTY CROSSCOMPILING_EMULATOR "adb;shell;cd;${CMAKE_CURRENT_BINARY_DIR};&&") + set_property(TARGET XMLParserTests PROPERTY CROSSCOMPILING_EMULATOR "adb;shell;cd;${CMAKE_CURRENT_BINARY_DIR};&&") + set_property(TARGET XMLProfileParserTests PROPERTY CROSSCOMPILING_EMULATOR "adb;shell;cd;${CMAKE_CURRENT_BINARY_DIR};&&") + set_property(TARGET XMLTreeTests PROPERTY CROSSCOMPILING_EMULATOR "adb;shell;cd;${CMAKE_CURRENT_BINARY_DIR};&&") + set_property(TARGET XMLLoadFileTests PROPERTY CROSSCOMPILING_EMULATOR "adb;shell;cd;${CMAKE_CURRENT_BINARY_DIR};&&") +endif() + From 9cef5ea62466b19037b75fae04f76a55f4b8aab9 Mon Sep 17 00:00:00 2001 From: Mario Dominguez Date: Mon, 27 May 2024 14:18:52 +0200 Subject: [PATCH 3/4] Fix conflicts Signed-off-by: Mario Dominguez --- include/fastrtps/xmlparser/XMLParserCommon.h | 8 -- src/cpp/rtps/xmlparser/XMLParser.cpp | 81 +------------------- src/cpp/rtps/xmlparser/XMLParserCommon.cpp | 8 -- src/cpp/rtps/xmlparser/XMLProfileManager.cpp | 16 +--- test/unittest/xmlparser/CMakeLists.txt | 61 +++++++++------ test/unittest/xmlparser/XMLLoadFileTests.cpp | 26 +++---- 6 files changed, 53 insertions(+), 147 deletions(-) diff --git a/include/fastrtps/xmlparser/XMLParserCommon.h b/include/fastrtps/xmlparser/XMLParserCommon.h index e92d6e70474..7ffd2e9133a 100644 --- a/include/fastrtps/xmlparser/XMLParserCommon.h +++ b/include/fastrtps/xmlparser/XMLParserCommon.h @@ -59,14 +59,6 @@ extern const char* SEND_BUFFER_SIZE; extern const char* TTL; extern const char* NON_BLOCKING_SEND; extern const char* WHITE_LIST; -<<<<<<< HEAD:include/fastrtps/xmlparser/XMLParserCommon.h -======= -extern const char* NETWORK_INTERFACE; -extern const char* NETMASK_FILTER; -extern const char* NETWORK_INTERFACES; -extern const char* ALLOWLIST; -extern const char* BLOCKLIST; ->>>>>>> 0919ff294 (Use absolute paths when loading XML files (#4751)):src/cpp/xmlparser/XMLParserCommon.h extern const char* MAX_MESSAGE_SIZE; extern const char* MAX_INITIAL_PEERS_RANGE; extern const char* KEEP_ALIVE_FREQUENCY; diff --git a/src/cpp/rtps/xmlparser/XMLParser.cpp b/src/cpp/rtps/xmlparser/XMLParser.cpp index beb2384bafe..8225b2e4e6c 100644 --- a/src/cpp/rtps/xmlparser/XMLParser.cpp +++ b/src/cpp/rtps/xmlparser/XMLParser.cpp @@ -51,9 +51,6 @@ namespace xmlparser { XMLP_ret XMLParser::loadDefaultXMLFile( up_base_node_t& root) { -<<<<<<< HEAD:src/cpp/rtps/xmlparser/XMLParser.cpp - return loadXML(DEFAULT_FASTRTPS_PROFILES, root); -======= // Use absolute path to ensure that the file is loaded only once #ifdef _WIN32 char current_directory[MAX_PATH]; @@ -63,7 +60,7 @@ XMLP_ret XMLParser::loadDefaultXMLFile( } else { - strcat_s(current_directory, MAX_PATH, DEFAULT_FASTDDS_PROFILES); + strcat_s(current_directory, MAX_PATH, DEFAULT_FASTRTPS_PROFILES); return loadXML(current_directory, root, true); } #else @@ -75,12 +72,11 @@ XMLP_ret XMLParser::loadDefaultXMLFile( else { strcat(current_directory, "/"); - strcat(current_directory, DEFAULT_FASTDDS_PROFILES); + strcat(current_directory, DEFAULT_FASTRTPS_PROFILES); return loadXML(current_directory, root, true); } #endif // _WIN32 return XMLP_ret::XML_ERROR; ->>>>>>> 0919ff294 (Use absolute paths when loading XML files (#4751)):src/cpp/xmlparser/XMLParser.cpp } XMLP_ret XMLParser::parseXML( @@ -570,11 +566,7 @@ XMLP_ret XMLParser::parseXMLCommonTransportData( p_aux1 != nullptr; p_aux1 = p_aux1->NextSiblingElement()) { address = p_aux1->Name(); -<<<<<<< HEAD:src/cpp/rtps/xmlparser/XMLParser.cpp if (strcmp(address, ADDRESS) == 0) -======= - if (strcmp(address, ADDRESS) == 0 || strcmp(address, NETWORK_INTERFACE) == 0) ->>>>>>> 0919ff294 (Use absolute paths when loading XML files (#4751)):src/cpp/xmlparser/XMLParser.cpp { const char* text = p_aux1->GetText(); if (nullptr != text) @@ -603,72 +595,7 @@ XMLP_ret XMLParser::parseXMLCommonTransportData( strcmp(name, HEALTHY_CHECK_TIMEOUT_MS) == 0 || strcmp(name, HEALTHY_CHECK_TIMEOUT_MS) == 0 || strcmp(name, RTPS_DUMP_FILE) == 0) { -<<<<<<< HEAD:src/cpp/rtps/xmlparser/XMLParser.cpp // Parsed outside of this method -======= - std::string netmask_filter_str; - if (XMLP_ret::XML_OK != getXMLString(p_aux0, &netmask_filter_str, 0)) - { - EPROSIMA_LOG_ERROR(XMLPARSER, "Invalid element found into 'netmask_filter'."); - return XMLP_ret::XML_ERROR; - } - - try - { - p_transport->netmask_filter = fastdds::rtps::network::netmask_filter::string_to_netmask_filter_kind( - netmask_filter_str); - } - catch (const std::invalid_argument& e) - { - EPROSIMA_LOG_ERROR(XMLPARSER, "Invalid element found into 'netmask_filter' : " << e.what()); - return XMLP_ret::XML_ERROR; - } - } - else if (strcmp(name, NETWORK_INTERFACES) == 0) - { - if (XMLP_ret::XML_OK != parseXMLInterfaces(p_aux0, p_transport)) - { - EPROSIMA_LOG_ERROR(XMLPARSER, "Failed to parse 'interfaces' element."); - return XMLP_ret::XML_ERROR; - } - } - } - return XMLP_ret::XML_OK; -} - -XMLP_ret XMLParser::parseXMLInterfaces( - tinyxml2::XMLElement* p_root, - std::shared_ptr p_transport) -{ - /* - - - - - - - */ - tinyxml2::XMLElement* p_aux0 = nullptr; - const char* name = nullptr; - for (p_aux0 = p_root->FirstChildElement(); p_aux0 != nullptr; p_aux0 = p_aux0->NextSiblingElement()) - { - name = p_aux0->Name(); - if (strcmp(name, ALLOWLIST) == 0) - { - if (XMLP_ret::XML_OK != parseXMLAllowlist(p_aux0, p_transport)) - { - EPROSIMA_LOG_ERROR(XMLPARSER, "Failed to parse 'allowlist'."); - return XMLP_ret::XML_ERROR; - } - } - else if (strcmp(name, BLOCKLIST) == 0) - { - if (XMLP_ret::XML_OK != parseXMLBlocklist(p_aux0, p_transport)) - { - EPROSIMA_LOG_ERROR(XMLPARSER, "Failed to parse 'blocklist'."); - return XMLP_ret::XML_ERROR; - } ->>>>>>> 0919ff294 (Use absolute paths when loading XML files (#4751)):src/cpp/xmlparser/XMLParser.cpp } else { @@ -1830,11 +1757,7 @@ XMLP_ret XMLParser::loadXML( tinyxml2::XMLDocument xmlDoc; if (tinyxml2::XMLError::XML_SUCCESS != xmlDoc.LoadFile(filename.c_str())) { -<<<<<<< HEAD:src/cpp/rtps/xmlparser/XMLParser.cpp - if (filename != std::string(DEFAULT_FASTRTPS_PROFILES)) -======= if (!is_default) ->>>>>>> 0919ff294 (Use absolute paths when loading XML files (#4751)):src/cpp/xmlparser/XMLParser.cpp { logError(XMLPARSER, "Error opening '" << filename << "'"); } diff --git a/src/cpp/rtps/xmlparser/XMLParserCommon.cpp b/src/cpp/rtps/xmlparser/XMLParserCommon.cpp index a66213caca7..d4339a436bc 100644 --- a/src/cpp/rtps/xmlparser/XMLParserCommon.cpp +++ b/src/cpp/rtps/xmlparser/XMLParserCommon.cpp @@ -46,14 +46,6 @@ const char* SEND_BUFFER_SIZE = "sendBufferSize"; const char* TTL = "TTL"; const char* NON_BLOCKING_SEND = "non_blocking_send"; const char* WHITE_LIST = "interfaceWhiteList"; -<<<<<<< HEAD:src/cpp/rtps/xmlparser/XMLParserCommon.cpp -======= -const char* NETWORK_INTERFACE = "interface"; -const char* NETMASK_FILTER = "netmask_filter"; -const char* NETWORK_INTERFACES = "interfaces"; -const char* ALLOWLIST = "allowlist"; -const char* BLOCKLIST = "blocklist"; ->>>>>>> 0919ff294 (Use absolute paths when loading XML files (#4751)):src/cpp/xmlparser/XMLParserCommon.cpp const char* MAX_MESSAGE_SIZE = "maxMessageSize"; const char* MAX_INITIAL_PEERS_RANGE = "maxInitialPeersRange"; const char* KEEP_ALIVE_FREQUENCY = "keep_alive_frequency_ms"; diff --git a/src/cpp/rtps/xmlparser/XMLProfileManager.cpp b/src/cpp/rtps/xmlparser/XMLProfileManager.cpp index 5c09548af48..c31fd8ccbfc 100644 --- a/src/cpp/rtps/xmlparser/XMLProfileManager.cpp +++ b/src/cpp/rtps/xmlparser/XMLProfileManager.cpp @@ -192,9 +192,6 @@ void XMLProfileManager::loadDefaultXMLFile() // Try to load the default XML file if variable does not exist or is not set to '1' if (!(getenv_s(&size, skip_xml, size, SKIP_DEFAULT_XML_FILE) == 0 && skip_xml[0] == '1')) { -<<<<<<< HEAD:src/cpp/rtps/xmlparser/XMLProfileManager.cpp - loadXMLFile(DEFAULT_FASTRTPS_PROFILES); -======= // Try to load the default XML file. if (GetCurrentDirectory(MAX_PATH, current_directory) == 0) { @@ -203,10 +200,9 @@ void XMLProfileManager::loadDefaultXMLFile() else { strcat_s(current_directory, MAX_PATH, "\\"); - strcat_s(current_directory, MAX_PATH, DEFAULT_FASTDDS_PROFILES); + strcat_s(current_directory, MAX_PATH, DEFAULT_FASTRTPS_PROFILES); loadXMLFile(current_directory, true); } ->>>>>>> 0919ff294 (Use absolute paths when loading XML files (#4751)):src/cpp/xmlparser/XMLProfileManager.cpp } #else char absolute_path[PATH_MAX]; @@ -229,9 +225,6 @@ void XMLProfileManager::loadDefaultXMLFile() // Try to load the default XML file if variable does not exist or is not set to '1' if (!(skip_xml != nullptr && skip_xml[0] == '1')) { -<<<<<<< HEAD:src/cpp/rtps/xmlparser/XMLProfileManager.cpp - loadXMLFile(DEFAULT_FASTRTPS_PROFILES); -======= if (getcwd(absolute_path, PATH_MAX) == NULL) { EPROSIMA_LOG_ERROR(XMLPARSER, "getcwd failed " << std::strerror(errno)); @@ -239,10 +232,9 @@ void XMLProfileManager::loadDefaultXMLFile() else { strcat(absolute_path, "/"); - strcat(absolute_path, DEFAULT_FASTDDS_PROFILES); + strcat(absolute_path, DEFAULT_FASTRTPS_PROFILES); loadXMLFile(absolute_path, true); } ->>>>>>> 0919ff294 (Use absolute paths when loading XML files (#4751)):src/cpp/xmlparser/XMLProfileManager.cpp } #endif // ifdef _WIN32 @@ -353,11 +345,7 @@ XMLP_ret XMLProfileManager::loadXMLFile( XMLP_ret loaded_ret = XMLParser::loadXML(filename, root_node, is_default); if (!root_node || loaded_ret != XMLP_ret::XML_OK) { -<<<<<<< HEAD:src/cpp/rtps/xmlparser/XMLProfileManager.cpp - if (filename != std::string(DEFAULT_FASTRTPS_PROFILES)) -======= if (!is_default) ->>>>>>> 0919ff294 (Use absolute paths when loading XML files (#4751)):src/cpp/xmlparser/XMLProfileManager.cpp { logError(XMLPARSER, "Error parsing '" << filename << "'"); } diff --git a/test/unittest/xmlparser/CMakeLists.txt b/test/unittest/xmlparser/CMakeLists.txt index 6ad826920c4..9b6398160a2 100644 --- a/test/unittest/xmlparser/CMakeLists.txt +++ b/test/unittest/xmlparser/CMakeLists.txt @@ -355,36 +355,49 @@ add_gtest(XMLEndpointParserTests SOURCES XMLEndpointParserTests.cpp) ###################################### XMLLoadFileTests ###################################################### set(XMLLOADFILE_SOURCE XMLLoadFileTests.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/rtps/xmlparser/XMLProfileManager.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/rtps/xmlparser/XMLParser.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/rtps/xmlparser/XMLDynamicParser.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/rtps/xmlparser/XMLElementParser.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/rtps/xmlparser/XMLParserCommon.cpp ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/publisher/qos/WriterQos.cpp ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/subscriber/qos/ReaderQos.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/topic/TopicDataType.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/xtypes/exception/Exception.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/rtps/attributes/ThreadSettings.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/rtps/common/LocatorWithMask.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/rtps/common/Time_t.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/rtps/flowcontrol/FlowControllerConsts.cpp ${PROJECT_SOURCE_DIR}/src/cpp/rtps/flowcontrol/ThroughputControllerDescriptor.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/rtps/network/utils/netmask_filter.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/rtps/network/utils/network.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/rtps/transport/network/NetmaskFilterKind.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/rtps/transport/network/NetworkInterface.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/rtps/transport/network/NetworkInterfaceWithFilter.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/rtps/transport/PortBasedTransportDescriptor.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/utils/md5.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/utils/string_convert.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/utils/UnitsParser.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/xmlparser/XMLDynamicParser.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/xmlparser/XMLElementParser.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/xmlparser/XMLParser.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/xmlparser/XMLParserCommon.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/xmlparser/XMLProfileManager.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/utils/SystemInfo.cpp - - # locators + ${PROJECT_SOURCE_DIR}/src/cpp/rtps/flowcontrol/FlowControllerConsts.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/log/Log.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/log/OStreamConsumer.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/log/StdoutConsumer.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/log/StdoutErrConsumer.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/fastdds/log/FileConsumer.cpp ${PROJECT_SOURCE_DIR}/src/cpp/utils/IPFinder.cpp ${PROJECT_SOURCE_DIR}/src/cpp/utils/IPLocator.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/utils/string_convert.cpp + + ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/AnnotationDescriptor.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/DynamicData.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/DynamicDataFactory.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/DynamicType.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/DynamicPubSubType.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/DynamicTypePtr.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/DynamicDataPtr.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/DynamicTypeBuilder.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/DynamicTypeBuilderPtr.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/DynamicTypeBuilderFactory.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/DynamicTypeMember.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/TypeDescriptor.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/MemberDescriptor.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/AnnotationParameterValue.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/TypeIdentifier.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/TypeIdentifierTypes.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/TypeObject.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/TypeObjectFactory.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/TypeObjectHashId.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/TypeNamesGenerator.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/TypesBase.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/dynamic-types/BuiltinAnnotationsTypeObject.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/utils/md5.cpp ${PROJECT_SOURCE_DIR}/src/cpp/utils/SystemInfo.cpp - ${PROJECT_SOURCE_DIR}/src/cpp/utils/UnitsParser.cpp + ${PROJECT_SOURCE_DIR}/src/cpp/rtps/common/Time_t.cpp ) # External sources diff --git a/test/unittest/xmlparser/XMLLoadFileTests.cpp b/test/unittest/xmlparser/XMLLoadFileTests.cpp index 557170d7710..c3bc5940d69 100644 --- a/test/unittest/xmlparser/XMLLoadFileTests.cpp +++ b/test/unittest/xmlparser/XMLLoadFileTests.cpp @@ -22,12 +22,10 @@ #endif // ifdef _WIN32 #include -#include +#include +#include #include "../logging/mock/MockConsumer.h" -#include -#include - using namespace eprosima::fastdds::dds; using namespace eprosima::fastrtps; using namespace ::testing; @@ -67,13 +65,13 @@ class XMLLoadFileTests : public ::testing::Test }; /* - * This test checks that the default XML file is loaded only once when there is a DEFAULT_FASTDDS_PROFILES.xml file + * This test checks that the default XML file is loaded only once when there is a DEFAULT_FASTRTPS_PROFILES.xml file * in the current directory and the environment variable FASTRTPS_DEFAULT_PROFILES_FILE is set pointing to the same * file. * 1. Initialize Mock Consumer to consume the LogInfo entry that the library generates when the file has been already * parsed. Set filters to consume only the desired entry. - * 2. Get current path to set the environment variable to the DEFAULT_FASTDDS_PROFILES.xml file. - * 3. Write the DEFAULT_FASTDDS_PROFILES.xml file in the current directory. + * 2. Get current path to set the environment variable to the DEFAULT_FASTRTPS_PROFILES.xml file. + * 3. Write the DEFAULT_FASTRTPS_PROFILES.xml file in the current directory. * 4. Load the default XML file. * 5. Wait for the log entry to be consumed. */ @@ -92,21 +90,21 @@ TEST_F(XMLLoadFileTests, load_twice_default_xml) uint32_t ret = GetCurrentDirectory(MAX_PATH, current_directory); ASSERT_NE(ret, 0u); strcat_s(current_directory, MAX_PATH, "\\"); - strcat_s(current_directory, MAX_PATH, xmlparser::DEFAULT_FASTDDS_PROFILES); + strcat_s(current_directory, MAX_PATH, xmlparser::DEFAULT_FASTRTPS_PROFILES); // Set environment variable - _putenv_s("FASTDDS_DEFAULT_PROFILES_FILE", current_directory); + _putenv_s("FASTRTPS_DEFAULT_PROFILES_FILE", current_directory); #else char current_directory[PATH_MAX]; ASSERT_NE(getcwd(current_directory, PATH_MAX), (void*)NULL); strcat(current_directory, "/"); - strcat(current_directory, xmlparser::DEFAULT_FASTDDS_PROFILES); + strcat(current_directory, xmlparser::DEFAULT_FASTRTPS_PROFILES); // Set environment variable - setenv("FASTDDS_DEFAULT_PROFILES_FILE", current_directory, 1); + setenv("FASTRTPS_DEFAULT_PROFILES_FILE", current_directory, 1); #endif // _WIN32 - // Write DEFAULT_FASTDDS_PROFILES.xml + // Write DEFAULT_FASTRTPS_PROFILES.xml std::ofstream xmlFile; - xmlFile.open("DEFAULT_FASTDDS_PROFILES.xml"); + xmlFile.open("DEFAULT_FASTRTPS_PROFILES.xml"); xmlFile << ""; xmlFile << ""; xmlFile << "truetest_name"; @@ -124,7 +122,7 @@ TEST_F(XMLLoadFileTests, load_twice_default_xml) Log::Reset(); Log::KillThread(); - std::remove("DEFAULT_FASTDDS_PROFILES.xml"); + std::remove("DEFAULT_FASTRTPS_PROFILES.xml"); } int main( From 65b105ee7b2607b806c175f3e5758beee4857af6 Mon Sep 17 00:00:00 2001 From: Mario Dominguez Date: Mon, 27 May 2024 14:21:14 +0200 Subject: [PATCH 4/4] Avoid minmax warning in windows Signed-off-by: Mario Dominguez --- src/cpp/rtps/xmlparser/XMLParser.cpp | 60 +------------------- src/cpp/rtps/xmlparser/XMLProfileManager.cpp | 8 +-- test/unittest/dynamic_types/CMakeLists.txt | 1 + 3 files changed, 8 insertions(+), 61 deletions(-) diff --git a/src/cpp/rtps/xmlparser/XMLParser.cpp b/src/cpp/rtps/xmlparser/XMLParser.cpp index 8225b2e4e6c..3be03efe479 100644 --- a/src/cpp/rtps/xmlparser/XMLParser.cpp +++ b/src/cpp/rtps/xmlparser/XMLParser.cpp @@ -16,13 +16,12 @@ #include #include -<<<<<<< HEAD:src/cpp/rtps/xmlparser/XMLParser.cpp #include #include #include #include #include -======= + #include #include #include @@ -32,7 +31,6 @@ #else #include #endif // _WIN32 ->>>>>>> 0919ff294 (Use absolute paths when loading XML files (#4751)):src/cpp/xmlparser/XMLParser.cpp #include @@ -56,7 +54,7 @@ XMLP_ret XMLParser::loadDefaultXMLFile( char current_directory[MAX_PATH]; if (GetCurrentDirectory(MAX_PATH, current_directory) == 0) { - EPROSIMA_LOG_ERROR(XMLPARSER, "GetCurrentDirectory failed " << GetLastError()); + logError(XMLPARSER, "GetCurrentDirectory failed " << GetLastError()); } else { @@ -67,7 +65,7 @@ XMLP_ret XMLParser::loadDefaultXMLFile( char current_directory[PATH_MAX]; if (getcwd(current_directory, PATH_MAX) == NULL) { - EPROSIMA_LOG_ERROR(XMLPARSER, "getcwd failed " << std::strerror(errno)); + logError(XMLPARSER, "getcwd failed " << std::strerror(errno)); } else { @@ -319,59 +317,7 @@ XMLP_ret XMLParser::parseXMLTransportData( { sType = p_aux0->GetText(); } -<<<<<<< HEAD:src/cpp/rtps/xmlparser/XMLParser.cpp else -======= - } - - XMLProfileManager::insertTransportById(sId, pDescriptor); - return ret; -} - -XMLP_ret XMLParser::validateXMLTransportElements( - tinyxml2::XMLElement& p_root) -{ - XMLP_ret ret = XMLP_ret::XML_OK; - for (tinyxml2::XMLElement* p_aux0 = p_root.FirstChildElement(); p_aux0 != nullptr; - p_aux0 = p_aux0->NextSiblingElement()) - { - const char* name = p_aux0->Name(); - if (!(strcmp(name, TRANSPORT_ID) == 0 || - strcmp(name, TYPE) == 0 || - strcmp(name, SEND_BUFFER_SIZE) == 0 || - strcmp(name, RECEIVE_BUFFER_SIZE) == 0 || - strcmp(name, MAX_MESSAGE_SIZE) == 0 || - strcmp(name, MAX_INITIAL_PEERS_RANGE) == 0 || - strcmp(name, WHITE_LIST) == 0 || - strcmp(name, NETMASK_FILTER) == 0 || - strcmp(name, NETWORK_INTERFACES) == 0 || - strcmp(name, TTL) == 0 || - strcmp(name, NON_BLOCKING_SEND) == 0 || - strcmp(name, UDP_OUTPUT_PORT) == 0 || - strcmp(name, TCP_WAN_ADDR) == 0 || - strcmp(name, KEEP_ALIVE_FREQUENCY) == 0 || - strcmp(name, KEEP_ALIVE_TIMEOUT) == 0 || - strcmp(name, MAX_LOGICAL_PORT) == 0 || - strcmp(name, LOGICAL_PORT_RANGE) == 0 || - strcmp(name, LOGICAL_PORT_INCREMENT) == 0 || - strcmp(name, LISTENING_PORTS) == 0 || - strcmp(name, CALCULATE_CRC) == 0 || - strcmp(name, CHECK_CRC) == 0 || - strcmp(name, KEEP_ALIVE_THREAD) == 0 || - strcmp(name, ACCEPT_THREAD) == 0 || - strcmp(name, ENABLE_TCP_NODELAY) == 0 || - strcmp(name, TCP_NEGOTIATION_TIMEOUT) == 0 || - strcmp(name, TLS) == 0 || - strcmp(name, SEGMENT_SIZE) == 0 || - strcmp(name, PORT_QUEUE_CAPACITY) == 0 || - strcmp(name, HEALTHY_CHECK_TIMEOUT_MS) == 0 || - strcmp(name, RTPS_DUMP_FILE) == 0 || - strcmp(name, DEFAULT_RECEPTION_THREADS) == 0 || - strcmp(name, RECEPTION_THREADS) == 0 || - strcmp(name, DUMP_THREAD) == 0 || - strcmp(name, PORT_OVERFLOW_POLICY) == 0 || - strcmp(name, SEGMENT_OVERFLOW_POLICY) == 0)) ->>>>>>> 0919ff294 (Use absolute paths when loading XML files (#4751)):src/cpp/xmlparser/XMLParser.cpp { logError(XMLPARSER, "'" << TYPE << "' attribute cannot be empty"); return XMLP_ret::XML_ERROR; diff --git a/src/cpp/rtps/xmlparser/XMLProfileManager.cpp b/src/cpp/rtps/xmlparser/XMLProfileManager.cpp index c31fd8ccbfc..ef527de55eb 100644 --- a/src/cpp/rtps/xmlparser/XMLProfileManager.cpp +++ b/src/cpp/rtps/xmlparser/XMLProfileManager.cpp @@ -177,7 +177,7 @@ void XMLProfileManager::loadDefaultXMLFile() // Use absolute path to ensure the file is loaded only once if (GetFullPathName(file_path, MAX_PATH, absolute_path, filename) == 0) { - EPROSIMA_LOG_ERROR(XMLPARSER, "GetFullPathName failed " << GetLastError()); + logError(XMLPARSER, "GetFullPathName failed " << GetLastError()); } else { @@ -195,7 +195,7 @@ void XMLProfileManager::loadDefaultXMLFile() // Try to load the default XML file. if (GetCurrentDirectory(MAX_PATH, current_directory) == 0) { - EPROSIMA_LOG_ERROR(XMLPARSER, "GetCurrentDirectory failed " << GetLastError()); + logError(XMLPARSER, "GetCurrentDirectory failed " << GetLastError()); } else { @@ -216,7 +216,7 @@ void XMLProfileManager::loadDefaultXMLFile() } else { - EPROSIMA_LOG_ERROR(XMLPARSER, "realpath failed " << std::strerror(errno)); + logError(XMLPARSER, "realpath failed " << std::strerror(errno)); } } @@ -227,7 +227,7 @@ void XMLProfileManager::loadDefaultXMLFile() { if (getcwd(absolute_path, PATH_MAX) == NULL) { - EPROSIMA_LOG_ERROR(XMLPARSER, "getcwd failed " << std::strerror(errno)); + logError(XMLPARSER, "getcwd failed " << std::strerror(errno)); } else { diff --git a/test/unittest/dynamic_types/CMakeLists.txt b/test/unittest/dynamic_types/CMakeLists.txt index ad9ce52a5c3..d3be5fce7c5 100644 --- a/test/unittest/dynamic_types/CMakeLists.txt +++ b/test/unittest/dynamic_types/CMakeLists.txt @@ -101,6 +101,7 @@ add_executable(DynamicTypesTests ${DYNAMIC_TYPES_TEST_SOURCE}) target_compile_definitions(DynamicTypesTests PRIVATE BOOST_ASIO_STANDALONE ASIO_STANDALONE + $<$:NOMINMAX> # avoid conflict with std::min & std::max in visual studio $<$>,$>:__DEBUG> $<$:__INTERNALDEBUG> # Internal debug activated. )