Compare commits
10
Commits
b96dec41e4
...
4e29022c06
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4e29022c06 | ||
|
|
501bd2b4b8 | ||
|
|
ce47b9236f | ||
|
|
b8e2ed5344 | ||
|
|
58a383d212 | ||
|
|
9e553e5d7a | ||
|
|
9a9a023b70 | ||
|
|
7d1074588c | ||
|
|
a3e44a5bd8 | ||
|
|
bd3cccbc15 |
No files matched your search
@@ -100,7 +100,6 @@ include_directories(${CMAKE_SOURCE_DIR}/include/ExerciseEventManagement)
|
|||||||
include_directories(${CMAKE_BINARY_DIR}/Lts/Services/ExerciseManagement)
|
include_directories(${CMAKE_BINARY_DIR}/Lts/Services/ExerciseManagement)
|
||||||
include_directories(${CMAKE_SOURCE_DIR}/include/ExerciseManagement)
|
include_directories(${CMAKE_SOURCE_DIR}/include/ExerciseManagement)
|
||||||
include_directories(${CMAKE_BINARY_DIR}/Lts/Services/FileManagement)
|
include_directories(${CMAKE_BINARY_DIR}/Lts/Services/FileManagement)
|
||||||
include_directories(${CMAKE_SOURCE_DIR}/include/FileManagement)
|
|
||||||
include_directories(${CMAKE_BINARY_DIR}/Lts/Services/NotificationManagement)
|
include_directories(${CMAKE_BINARY_DIR}/Lts/Services/NotificationManagement)
|
||||||
include_directories(${CMAKE_SOURCE_DIR}/include/NotificationManagement)
|
include_directories(${CMAKE_SOURCE_DIR}/include/NotificationManagement)
|
||||||
include_directories(${CMAKE_BINARY_DIR}/Lts/Services/ParticipantManagement)
|
include_directories(${CMAKE_BINARY_DIR}/Lts/Services/ParticipantManagement)
|
||||||
@@ -124,7 +123,6 @@ include_directories(${CMAKE_BINARY_DIR}/Lts/Common/LtsUtils/LtsUtilsCore)
|
|||||||
include_directories(${CMAKE_SOURCE_DIR}/Z/src/NGLLogger)
|
include_directories(${CMAKE_SOURCE_DIR}/Z/src/NGLLogger)
|
||||||
include_directories(${CMAKE_SOURCE_DIR}/include/Viewer/SituationMap)
|
include_directories(${CMAKE_SOURCE_DIR}/include/Viewer/SituationMap)
|
||||||
include_directories(${CMAKE_SOURCE_DIR}/include/OperatorManagement)
|
include_directories(${CMAKE_SOURCE_DIR}/include/OperatorManagement)
|
||||||
include_directories(${CMAKE_SOURCE_DIR}/include/FileManagement)
|
|
||||||
include_directories(${CMAKE_SOURCE_DIR}/forward-declarations)
|
include_directories(${CMAKE_SOURCE_DIR}/forward-declarations)
|
||||||
SET(CMAKE_CXX_STANDARD 17)
|
SET(CMAKE_CXX_STANDARD 17)
|
||||||
SET(CMAKE_CXX_STANDARD_REQUIRED ON)
|
SET(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
@@ -255,8 +253,11 @@ if(Qt6Core5Compat_FOUND)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Find Qt6 core components first (without OpenGL which may not be available)
|
# Find Qt6 core components first (without OpenGL which may not be available)
|
||||||
|
# WebSockets is required by the migrated services (FileManagement's THP script
|
||||||
|
# server uses QWebSocketServer; LtsWebSocket/httq enable their real websocket
|
||||||
|
# paths via QT6_WEBSOCKETS_AVAILABLE when the module is found).
|
||||||
find_package(Qt6 6.2 COMPONENTS Concurrent Core LinguistTools Network
|
find_package(Qt6 6.2 COMPONENTS Concurrent Core LinguistTools Network
|
||||||
Multimedia Sql SerialPort Test Xml Positioning Svg QUIET)
|
Multimedia Sql SerialPort Test Xml Positioning Svg WebSockets QUIET)
|
||||||
|
|
||||||
if(Qt6_FOUND)
|
if(Qt6_FOUND)
|
||||||
# Skip GUI find_package - it fails without OpenGL. We'll create manual targets below.
|
# Skip GUI find_package - it fails without OpenGL. We'll create manual targets below.
|
||||||
@@ -450,6 +451,21 @@ if(NOT TARGET Qt6::OpenGL)
|
|||||||
message(STATUS "Created stub target for Qt6::OpenGL (library not available)")
|
message(STATUS "Created stub target for Qt6::OpenGL (library not available)")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# Qt6::WebSockets - create manual target if not found (the container's Qt6
|
||||||
|
# discovery takes the minimal path, so find_package never creates the
|
||||||
|
# component targets). The migrated FileManagement service (THP script
|
||||||
|
# server) needs the real module.
|
||||||
|
if(NOT TARGET Qt6::WebSockets AND EXISTS "${QT6_LIB_DIR}/libQt6WebSockets.so.6")
|
||||||
|
add_library(Qt6::WebSockets SHARED IMPORTED)
|
||||||
|
set_target_properties(Qt6::WebSockets PROPERTIES
|
||||||
|
IMPORTED_LOCATION "${QT6_LIB_DIR}/libQt6WebSockets.so.6"
|
||||||
|
INTERFACE_INCLUDE_DIRECTORIES "${QT6_INC_DIR}/QtWebSockets;${QT6_INC_DIR}"
|
||||||
|
INTERFACE_LINK_LIBRARIES "Qt6::Core;Qt6::Network"
|
||||||
|
)
|
||||||
|
set(QT6_WEBSOCKETS_REAL_FOUND TRUE)
|
||||||
|
message(STATUS "Manually configured Qt6 WebSockets target")
|
||||||
|
endif()
|
||||||
|
|
||||||
# Stub Qt6::WebSockets target if not available (needed by LtsWebSocket, httq, etc.)
|
# Stub Qt6::WebSockets target if not available (needed by LtsWebSocket, httq, etc.)
|
||||||
if(NOT TARGET Qt6::WebSockets)
|
if(NOT TARGET Qt6::WebSockets)
|
||||||
add_library(Qt6::WebSockets INTERFACE IMPORTED)
|
add_library(Qt6::WebSockets INTERFACE IMPORTED)
|
||||||
@@ -459,6 +475,14 @@ if(NOT TARGET Qt6::WebSockets)
|
|||||||
message(STATUS "Created stub target for Qt6::WebSockets (library not available)")
|
message(STATUS "Created stub target for Qt6::WebSockets (library not available)")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# The real Qt6 WebSockets module is available (either via find_package or the
|
||||||
|
# manual import above): enable the real websocket code paths in httq,
|
||||||
|
# LtsWebSocket and the migrated services (they check this macro; without it
|
||||||
|
# they fall back to websocket-less operation).
|
||||||
|
if(Qt6WebSockets_FOUND OR QT6_WEBSOCKETS_REAL_FOUND)
|
||||||
|
add_compile_definitions(QT6_WEBSOCKETS_AVAILABLE)
|
||||||
|
endif()
|
||||||
|
|
||||||
MESSAGE(STATUS "Qt version is ${Qt6Core_VERSION}, GUI available: ${QT6_GUI_AVAILABLE}")
|
MESSAGE(STATUS "Qt version is ${Qt6Core_VERSION}, GUI available: ${QT6_GUI_AVAILABLE}")
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|||||||
@@ -8,8 +8,15 @@
|
|||||||
# --- Library LtsWebSocketCommon --------------------------------------------------------------------------------
|
# --- Library LtsWebSocketCommon --------------------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
# Make ${Qt6_WebSockets} optional
|
# Make ${Qt6_WebSockets} optional
|
||||||
if(QT6_GUI_AVAILABLE AND TARGET Qt6::WebSockets)
|
# Link the real WebSockets module whenever the websocket code path is
|
||||||
set(Qt6_WebSockets ${Qt6_WebSockets})
|
# compiled: QT6_WEBSOCKETS_AVAILABLE (root CMakeLists) and the manual
|
||||||
|
# Qt6::WebSockets import are set when the real module was found. The old
|
||||||
|
# QT6_GUI_AVAILABLE condition never held in this environment (Qt6
|
||||||
|
# discovery takes the minimal path) and the Qt6_WebSockets variable was
|
||||||
|
# never defined, so the websocket code compiled without the module on
|
||||||
|
# the link line.
|
||||||
|
if(QT6_WEBSOCKETS_REAL_FOUND OR Qt6WebSockets_FOUND)
|
||||||
|
set(Qt6_WebSockets Qt6::WebSockets)
|
||||||
else()
|
else()
|
||||||
set(Qt6_WebSockets "")
|
set(Qt6_WebSockets "")
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -1,8 +1,16 @@
|
|||||||
# Modified CMakeLists.txt from github.com/wille-io/httq
|
# Modified CMakeLists.txt from github.com/wille-io/httq
|
||||||
|
|
||||||
# Make ${Qt6_WebSockets} optional
|
# Make ${Qt6_WebSockets} optional
|
||||||
if(QT6_GUI_AVAILABLE AND TARGET Qt6::WebSockets)
|
# Link the real WebSockets module whenever the websocket code path is
|
||||||
set(Qt6_WebSockets ${Qt6_WebSockets})
|
# compiled: QT6_WEBSOCKETS_AVAILABLE (root CMakeLists) and the manual
|
||||||
|
# Qt6::WebSockets import are set when the real module was found. The old
|
||||||
|
# QT6_GUI_AVAILABLE condition never held in this environment (Qt6
|
||||||
|
# discovery takes the minimal path) and the Qt6_WebSockets variable was
|
||||||
|
# never defined, so AbstractServer.cpp compiled the websocket code
|
||||||
|
# without the module on the link line (undefined reference to
|
||||||
|
# QWebSocketServer::handleConnection).
|
||||||
|
if(QT6_WEBSOCKETS_REAL_FOUND OR Qt6WebSockets_FOUND)
|
||||||
|
set(Qt6_WebSockets Qt6::WebSockets)
|
||||||
else()
|
else()
|
||||||
set(Qt6_WebSockets "")
|
set(Qt6_WebSockets "")
|
||||||
endif()
|
endif()
|
||||||
|
|||||||
@@ -25,8 +25,8 @@ ADD_INTERFACE_LIBRARY(
|
|||||||
#
|
#
|
||||||
ADD_INTERFACE_LIBRARY(
|
ADD_INTERFACE_LIBRARY(
|
||||||
FlmDataPluginInterface
|
FlmDataPluginInterface
|
||||||
${CMAKE_SOURCE_DIR}/include/FileManagement/flm_data_plugin_interface.h
|
${CMAKE_CURRENT_SOURCE_DIR}/flm_data_plugin_interface.h
|
||||||
${CMAKE_SOURCE_DIR}/include
|
${CMAKE_CURRENT_SOURCE_DIR}/../../
|
||||||
DataPluginInterface
|
DataPluginInterface
|
||||||
svcFlmCommon
|
svcFlmCommon
|
||||||
)
|
)
|
||||||
|
|||||||
+116
-116
@@ -25,9 +25,9 @@
|
|||||||
|
|
||||||
#include <LtsUtilsCore/pgarray.h>
|
#include <LtsUtilsCore/pgarray.h>
|
||||||
#include <LtsUtilsCore/dds_vector.h>
|
#include <LtsUtilsCore/dds_vector.h>
|
||||||
#include <Lts/Services/FileManagement/flm_ftc.h>
|
#include <FileManagement/flm_ftc.h>
|
||||||
#include <include/FileManagement/flm_dtc.h>
|
#include <FileManagement/flm_dtc.h>
|
||||||
#include <Lts/Services/FileManagement/settings.h>
|
#include <FileManagement/settings.h>
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------------------
|
/* ----------------------------------------------------------------------------------
|
||||||
* HOW TO RUN THE TESTS (for example)
|
* HOW TO RUN THE TESTS (for example)
|
||||||
@@ -217,9 +217,9 @@ void FlmTests::tryModifyFolder()
|
|||||||
const FileManagement::Folder &fld = m_dtc->folder(m_folderId);
|
const FileManagement::Folder &fld = m_dtc->folder(m_folderId);
|
||||||
FileManagement::FolderModifyRequest data;
|
FileManagement::FolderModifyRequest data;
|
||||||
|
|
||||||
DEBUG_LOG(m_logger) << "fld.id() = " << fld.id();
|
DEBUG_LOG(m_logger) << "fld.id() = " << fld.id;
|
||||||
|
|
||||||
if (fld.id() == 0)
|
if (fld.id == 0)
|
||||||
{
|
{
|
||||||
ERROR_LOG(m_logger) << "Cannot find Folder Id = " << m_folderId;
|
ERROR_LOG(m_logger) << "Cannot find Folder Id = " << m_folderId;
|
||||||
failExit();
|
failExit();
|
||||||
@@ -227,16 +227,16 @@ void FlmTests::tryModifyFolder()
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
m_folderId = 0;
|
m_folderId = 0;
|
||||||
data.id(fld.id());
|
data.id = fld.id;
|
||||||
data.name(fld.name());
|
data.name = fld.name;
|
||||||
data.path(fld.path());
|
data.path = fld.path;
|
||||||
data.isEditable(fld.isEditable());
|
data.isEditable = fld.isEditable;
|
||||||
data.isHidden(fld.isHidden());
|
data.isHidden = fld.isHidden;
|
||||||
data.parentId(fld.parentId());
|
data.parentId = fld.parentId;
|
||||||
data.operatorId(m_operatorId);
|
data.operatorId = m_operatorId;
|
||||||
|
|
||||||
// changing only name
|
// changing only name
|
||||||
data.name("Folder-Updated");
|
data.name = "Folder-Updated";
|
||||||
|
|
||||||
if (!m_ftc->folderModifyRequest(FolderModifyRequest(data), this))
|
if (!m_ftc->folderModifyRequest(FolderModifyRequest(data), this))
|
||||||
{
|
{
|
||||||
@@ -266,15 +266,15 @@ void FlmTests::tryRemoveFolder()
|
|||||||
int FlmTests::createFolder(int parentFolderId, const QString &folderName, bool isHidden)
|
int FlmTests::createFolder(int parentFolderId, const QString &folderName, bool isHidden)
|
||||||
{
|
{
|
||||||
FileManagement::Folder parentFolder = m_dtc->folder(parentFolderId);
|
FileManagement::Folder parentFolder = m_dtc->folder(parentFolderId);
|
||||||
const std::vector<int32_t> &parentPath = parentFolder.path();
|
const std::vector<int32_t> &parentPath = parentFolder.path;
|
||||||
|
|
||||||
FileManagement::FolderModifyRequest req;
|
FileManagement::FolderModifyRequest req;
|
||||||
req.name(folderName.toStdString());
|
req.name = folderName.toStdString();
|
||||||
req.path(parentPath);
|
req.path = parentPath;
|
||||||
req.isEditable(false);
|
req.isEditable = false;
|
||||||
req.isHidden(isHidden);
|
req.isHidden = isHidden;
|
||||||
req.parentId(parentFolderId);
|
req.parentId = parentFolderId;
|
||||||
req.operatorId(m_operatorId);
|
req.operatorId = m_operatorId;
|
||||||
|
|
||||||
if (!m_ftc->folderModifyRequest(req, this))
|
if (!m_ftc->folderModifyRequest(req, this))
|
||||||
{
|
{
|
||||||
@@ -295,20 +295,20 @@ void FlmTests::tryCreateFileContent()
|
|||||||
|
|
||||||
FileContentModifyRequest data;
|
FileContentModifyRequest data;
|
||||||
|
|
||||||
data.name("Test Document");
|
data.name = "Test Document";
|
||||||
data.isTemplate(false);
|
data.isTemplate = false;
|
||||||
data.isUsedBy(false);
|
data.isUsedBy = false;
|
||||||
data.usedBy(0);
|
data.usedBy = 0;
|
||||||
data.folderId(m_folderId);
|
data.folderId = m_folderId;
|
||||||
data.fileStatus(FileManagement::FileStatus::Valid);
|
data.fileStatus = FileManagement::FileStatus::Valid;
|
||||||
data.fileCategory(FileManagement::FileCategory::User); // user docs
|
data.fileCategory = FileManagement::FileCategory::User; // user docs
|
||||||
data.fileType(FileManagement::FileType::MSOfficeDocument); // doc
|
data.fileType = FileManagement::FileType::MSOfficeDocument; // doc
|
||||||
data.operatorId(m_operatorId);
|
data.operatorId = m_operatorId;
|
||||||
data.lastModified(QDateTime::currentMSecsSinceEpoch());
|
data.lastModified = QDateTime::currentMSecsSinceEpoch();
|
||||||
|
|
||||||
QByteArray vmTest;
|
QByteArray vmTest;
|
||||||
vmTest += "bla-bla-bla";
|
vmTest += "bla-bla-bla";
|
||||||
data.content(LtsUtils::convert<std::vector<uint8_t>>(vmTest));
|
data.content = LtsUtils::convert<std::vector<uint8_t>>(vmTest);
|
||||||
|
|
||||||
m_fileContentId = 0;
|
m_fileContentId = 0;
|
||||||
if (!m_ftc->fileContentModifyRequest(data, this))
|
if (!m_ftc->fileContentModifyRequest(data, this))
|
||||||
@@ -318,17 +318,17 @@ void FlmTests::tryCreateFileContent()
|
|||||||
}
|
}
|
||||||
QTRY_VERIFY(m_fileContentId > 0);
|
QTRY_VERIFY(m_fileContentId > 0);
|
||||||
|
|
||||||
data.name("Test PDF");
|
data.name = "Test PDF";
|
||||||
data.isTemplate(false);
|
data.isTemplate = false;
|
||||||
data.folderId(m_folderId);
|
data.folderId = m_folderId;
|
||||||
data.fileStatus(FileManagement::FileStatus::Valid);
|
data.fileStatus = FileManagement::FileStatus::Valid;
|
||||||
data.fileCategory(FileManagement::FileCategory::User); // user docs
|
data.fileCategory = FileManagement::FileCategory::User; // user docs
|
||||||
data.fileType(FileManagement::FileType::Pdf); // pdf
|
data.fileType = FileManagement::FileType::Pdf; // pdf
|
||||||
data.operatorId(m_operatorId);
|
data.operatorId = m_operatorId;
|
||||||
data.lastModified(QDateTime::currentMSecsSinceEpoch());
|
data.lastModified = QDateTime::currentMSecsSinceEpoch();
|
||||||
|
|
||||||
vmTest += "\npdf-pdf-pdf";
|
vmTest += "\npdf-pdf-pdf";
|
||||||
data.content(LtsUtils::convert<std::vector<uint8_t>>(vmTest));
|
data.content = LtsUtils::convert<std::vector<uint8_t>>(vmTest);
|
||||||
|
|
||||||
m_fileContentId = 0;
|
m_fileContentId = 0;
|
||||||
if (!m_ftc->fileContentModifyRequest(data, this))
|
if (!m_ftc->fileContentModifyRequest(data, this))
|
||||||
@@ -338,14 +338,14 @@ void FlmTests::tryCreateFileContent()
|
|||||||
}
|
}
|
||||||
QTRY_VERIFY(m_fileContentId > 0);
|
QTRY_VERIFY(m_fileContentId > 0);
|
||||||
|
|
||||||
data.name("Test JPG");
|
data.name = "Test JPG";
|
||||||
data.isTemplate(false);
|
data.isTemplate = false;
|
||||||
data.folderId(m_folderId);
|
data.folderId = m_folderId;
|
||||||
data.fileStatus(FileManagement::FileStatus::Valid);
|
data.fileStatus = FileManagement::FileStatus::Valid;
|
||||||
data.fileCategory(FileManagement::FileCategory::User); // user docs
|
data.fileCategory = FileManagement::FileCategory::User; // user docs
|
||||||
data.fileType(FileManagement::FileType::Jpg);
|
data.fileType = FileManagement::FileType::Jpg;
|
||||||
data.operatorId(m_operatorId);
|
data.operatorId = m_operatorId;
|
||||||
data.lastModified(QDateTime::currentMSecsSinceEpoch());
|
data.lastModified = QDateTime::currentMSecsSinceEpoch();
|
||||||
|
|
||||||
QString fileName = QLatin1String("/titel_logo_RDE.jpg");
|
QString fileName = QLatin1String("/titel_logo_RDE.jpg");
|
||||||
QFile file;
|
QFile file;
|
||||||
@@ -359,7 +359,7 @@ void FlmTests::tryCreateFileContent()
|
|||||||
DEBUG_LOG(m_logger) << "Read file " << fileName;
|
DEBUG_LOG(m_logger) << "Read file " << fileName;
|
||||||
file.close();
|
file.close();
|
||||||
|
|
||||||
data.content(LtsUtils::convert<std::vector<uint8_t>>(rawImage));
|
data.content = LtsUtils::convert<std::vector<uint8_t>>(rawImage);
|
||||||
|
|
||||||
m_fileContentId = 0;
|
m_fileContentId = 0;
|
||||||
if (!m_ftc->fileContentModifyRequest(data, this))
|
if (!m_ftc->fileContentModifyRequest(data, this))
|
||||||
@@ -369,14 +369,14 @@ void FlmTests::tryCreateFileContent()
|
|||||||
}
|
}
|
||||||
QTRY_VERIFY(m_fileContentId > 0);
|
QTRY_VERIFY(m_fileContentId > 0);
|
||||||
|
|
||||||
data.name("Test big JPG");
|
data.name = "Test big JPG";
|
||||||
data.isTemplate(false);
|
data.isTemplate = false;
|
||||||
data.folderId(m_folderId);
|
data.folderId = m_folderId;
|
||||||
data.fileStatus(FileManagement::FileStatus::Valid);
|
data.fileStatus = FileManagement::FileStatus::Valid;
|
||||||
data.fileCategory(FileManagement::FileCategory::User); // user docs
|
data.fileCategory = FileManagement::FileCategory::User; // user docs
|
||||||
data.fileType(FileManagement::FileType::Jpg);
|
data.fileType = FileManagement::FileType::Jpg;
|
||||||
data.operatorId(m_operatorId);
|
data.operatorId = m_operatorId;
|
||||||
data.lastModified(QDateTime::currentMSecsSinceEpoch());
|
data.lastModified = QDateTime::currentMSecsSinceEpoch();
|
||||||
|
|
||||||
fileName = QLatin1String("/logo_Project.jpg");
|
fileName = QLatin1String("/logo_Project.jpg");
|
||||||
file.setFileName(QCoreApplication::applicationDirPath()+fileName);
|
file.setFileName(QCoreApplication::applicationDirPath()+fileName);
|
||||||
@@ -389,7 +389,7 @@ void FlmTests::tryCreateFileContent()
|
|||||||
DEBUG_LOG(m_logger) << "Read file " << fileName;
|
DEBUG_LOG(m_logger) << "Read file " << fileName;
|
||||||
file.close();
|
file.close();
|
||||||
|
|
||||||
data.content(LtsUtils::convert<std::vector<uint8_t>>(rawImage));
|
data.content = LtsUtils::convert<std::vector<uint8_t>>(rawImage);
|
||||||
|
|
||||||
m_fileContentId = 0;
|
m_fileContentId = 0;
|
||||||
if (!m_ftc->fileContentModifyRequest(data, this))
|
if (!m_ftc->fileContentModifyRequest(data, this))
|
||||||
@@ -411,9 +411,9 @@ void FlmTests::tryModifyFileContent()
|
|||||||
const FileManagement::FileContent &flc = m_dtc->fileContent(m_fileContentId);
|
const FileManagement::FileContent &flc = m_dtc->fileContent(m_fileContentId);
|
||||||
FileManagement::FileContentModifyRequest data;
|
FileManagement::FileContentModifyRequest data;
|
||||||
|
|
||||||
DEBUG_LOG(m_logger) << "flc.id() = " << flc.id();
|
DEBUG_LOG(m_logger) << "flc.id() = " << flc.id;
|
||||||
|
|
||||||
if (flc.id() == 0)
|
if (flc.id == 0)
|
||||||
{
|
{
|
||||||
ERROR_LOG(m_logger) << "Cannot find File Content Id = " << m_fileContentId;
|
ERROR_LOG(m_logger) << "Cannot find File Content Id = " << m_fileContentId;
|
||||||
failExit();
|
failExit();
|
||||||
@@ -428,29 +428,29 @@ void FlmTests::tryModifyFileContent()
|
|||||||
|
|
||||||
DEBUG_LOG(m_logger) << "Content size = " << m_content.size();
|
DEBUG_LOG(m_logger) << "Content size = " << m_content.size();
|
||||||
|
|
||||||
data.id(flc.id());
|
data.id = flc.id;
|
||||||
data.name(flc.name());
|
data.name = flc.name;
|
||||||
if (flc.exerciseId().is_set())
|
if (flc.exerciseId.is_set())
|
||||||
{
|
{
|
||||||
data.exerciseId(flc.exerciseId().get());
|
data.exerciseId = flc.exerciseId.get();
|
||||||
if (flc.phaseId().is_set())
|
if (flc.phaseId.is_set())
|
||||||
data.phaseId(flc.phaseId().get());
|
data.phaseId = flc.phaseId.get();
|
||||||
}
|
}
|
||||||
data.fileCategory(flc.fileCategory());
|
data.fileCategory = flc.fileCategory;
|
||||||
data.fileStatus(flc.fileStatus());
|
data.fileStatus = flc.fileStatus;
|
||||||
data.fileType(flc.fileType());
|
data.fileType = flc.fileType;
|
||||||
data.folderId(flc.folderId());
|
data.folderId = flc.folderId;
|
||||||
data.isTemplate(flc.isTemplate());
|
data.isTemplate = flc.isTemplate;
|
||||||
data.isUsedBy(flc.isUsedBy());
|
data.isUsedBy = flc.isUsedBy;
|
||||||
data.usedBy(flc.usedBy());
|
data.usedBy = flc.usedBy;
|
||||||
data.operatorId(flc.operatorId());
|
data.operatorId = flc.operatorId;
|
||||||
data.properties(flc.properties());
|
data.properties = flc.properties;
|
||||||
data.content(m_content);
|
data.content = m_content;
|
||||||
|
|
||||||
// changing only name, template, last modified
|
// changing only name, template, last modified
|
||||||
data.name("Test File Content Updated");
|
data.name = "Test File Content Updated";
|
||||||
data.isTemplate(true);
|
data.isTemplate = true;
|
||||||
data.lastModified(QDateTime::currentMSecsSinceEpoch());
|
data.lastModified = QDateTime::currentMSecsSinceEpoch();
|
||||||
|
|
||||||
if (!m_ftc->fileContentModifyRequest(FileContentModifyRequest(data), this))
|
if (!m_ftc->fileContentModifyRequest(FileContentModifyRequest(data), this))
|
||||||
{
|
{
|
||||||
@@ -466,7 +466,7 @@ void FlmTests::tryModifyFileContent()
|
|||||||
bool FlmTests::checkContentSize(int fileId)
|
bool FlmTests::checkContentSize(int fileId)
|
||||||
{
|
{
|
||||||
GetFileContentDataRequest request;
|
GetFileContentDataRequest request;
|
||||||
request.fileContentId(fileId);
|
request.fileContentId = fileId;
|
||||||
|
|
||||||
m_content.clear();
|
m_content.clear();
|
||||||
if (!m_ftc->getFileContentDataRequest(request, this))
|
if (!m_ftc->getFileContentDataRequest(request, this))
|
||||||
@@ -490,9 +490,9 @@ void FlmTests::tryUpdateStatus()
|
|||||||
m_dtc->waitForHistoricalDataFileContent();
|
m_dtc->waitForHistoricalDataFileContent();
|
||||||
const FileManagement::FileContent &flc = m_dtc->fileContent(m_fileContentId);
|
const FileManagement::FileContent &flc = m_dtc->fileContent(m_fileContentId);
|
||||||
|
|
||||||
DEBUG_LOG(m_logger) << "flc.id() = " << flc.id();
|
DEBUG_LOG(m_logger) << "flc.id() = " << flc.id;
|
||||||
|
|
||||||
if (flc.id() == 0)
|
if (flc.id == 0)
|
||||||
{
|
{
|
||||||
ERROR_LOG(m_logger) << "Cannot find File Content Id = " << m_fileContentId;
|
ERROR_LOG(m_logger) << "Cannot find File Content Id = " << m_fileContentId;
|
||||||
failExit();
|
failExit();
|
||||||
@@ -559,18 +559,18 @@ void FlmTests::tryCreatePlan()
|
|||||||
|
|
||||||
FileContentModifyRequest data;
|
FileContentModifyRequest data;
|
||||||
|
|
||||||
data.name("Test Plan");
|
data.name = "Test Plan";
|
||||||
data.isTemplate(false);
|
data.isTemplate = false;
|
||||||
data.folderId(m_folderId);
|
data.folderId = m_folderId;
|
||||||
data.fileStatus(FileManagement::FileStatus::Valid);
|
data.fileStatus = FileManagement::FileStatus::Valid;
|
||||||
data.fileCategory(FileManagement::FileCategory::Global); // global
|
data.fileCategory = FileManagement::FileCategory::Global; // global
|
||||||
data.fileType(FileManagement::FileType::TacticalPlan); // plan
|
data.fileType = FileManagement::FileType::TacticalPlan; // plan
|
||||||
data.operatorId(m_operatorId);
|
data.operatorId = m_operatorId;
|
||||||
data.lastModified(QDateTime::currentMSecsSinceEpoch());
|
data.lastModified = QDateTime::currentMSecsSinceEpoch();
|
||||||
|
|
||||||
QByteArray vmTest;
|
QByteArray vmTest;
|
||||||
vmTest += "bla-bla-bla";
|
vmTest += "bla-bla-bla";
|
||||||
data.content(LtsUtils::convert<std::vector<uint8_t>>(vmTest));
|
data.content = LtsUtils::convert<std::vector<uint8_t>>(vmTest);
|
||||||
|
|
||||||
m_fileContentId = 0;
|
m_fileContentId = 0;
|
||||||
if (!m_ftc->fileContentModifyRequest(data, this))
|
if (!m_ftc->fileContentModifyRequest(data, this))
|
||||||
@@ -588,18 +588,18 @@ void FlmTests::tryCreateFav()
|
|||||||
|
|
||||||
FileContentModifyRequest data;
|
FileContentModifyRequest data;
|
||||||
|
|
||||||
data.name("Test Fav");
|
data.name = "Test Fav";
|
||||||
data.isTemplate(false);
|
data.isTemplate = false;
|
||||||
data.folderId(m_folderId);
|
data.folderId = m_folderId;
|
||||||
data.fileStatus(FileManagement::FileStatus::Valid);
|
data.fileStatus = FileManagement::FileStatus::Valid;
|
||||||
data.fileCategory(FileManagement::FileCategory::User); // user
|
data.fileCategory = FileManagement::FileCategory::User; // user
|
||||||
data.fileType(FileManagement::FileType::OperatorFavourite); // fav
|
data.fileType = FileManagement::FileType::OperatorFavourite; // fav
|
||||||
data.operatorId(m_operatorId);
|
data.operatorId = m_operatorId;
|
||||||
data.lastModified(QDateTime::currentMSecsSinceEpoch());
|
data.lastModified = QDateTime::currentMSecsSinceEpoch();
|
||||||
|
|
||||||
QByteArray vmTest;
|
QByteArray vmTest;
|
||||||
vmTest += "bla-bla-bla";
|
vmTest += "bla-bla-bla";
|
||||||
data.content(LtsUtils::convert<std::vector<uint8_t>>(vmTest));
|
data.content = LtsUtils::convert<std::vector<uint8_t>>(vmTest);
|
||||||
|
|
||||||
m_fileContentId = 0;
|
m_fileContentId = 0;
|
||||||
if (!m_ftc->fileContentModifyRequest(data, this))
|
if (!m_ftc->fileContentModifyRequest(data, this))
|
||||||
@@ -617,18 +617,18 @@ void FlmTests::tryCreateSymbol()
|
|||||||
|
|
||||||
FileContentModifyRequest data;
|
FileContentModifyRequest data;
|
||||||
|
|
||||||
data.name("Test Symbol");
|
data.name = "Test Symbol";
|
||||||
data.isTemplate(false);
|
data.isTemplate = false;
|
||||||
data.folderId(m_folderId);
|
data.folderId = m_folderId;
|
||||||
data.fileStatus(FileManagement::FileStatus::Valid);
|
data.fileStatus = FileManagement::FileStatus::Valid;
|
||||||
data.fileCategory(FileManagement::FileCategory::Global); // global
|
data.fileCategory = FileManagement::FileCategory::Global; // global
|
||||||
data.fileType(FileManagement::FileType::OperatorDefinedSymbol);
|
data.fileType = FileManagement::FileType::OperatorDefinedSymbol;
|
||||||
data.operatorId(m_operatorId);
|
data.operatorId = m_operatorId;
|
||||||
data.lastModified(QDateTime::currentMSecsSinceEpoch());
|
data.lastModified = QDateTime::currentMSecsSinceEpoch();
|
||||||
|
|
||||||
QByteArray vmTest;
|
QByteArray vmTest;
|
||||||
vmTest += "bla-bla-bla";
|
vmTest += "bla-bla-bla";
|
||||||
data.content(LtsUtils::convert<std::vector<uint8_t>>(vmTest));
|
data.content = LtsUtils::convert<std::vector<uint8_t>>(vmTest);
|
||||||
|
|
||||||
m_fileContentId = 0;
|
m_fileContentId = 0;
|
||||||
if (!m_ftc->fileContentModifyRequest(data, this))
|
if (!m_ftc->fileContentModifyRequest(data, this))
|
||||||
@@ -644,7 +644,7 @@ void FlmTests::tryGetContent()
|
|||||||
{
|
{
|
||||||
GetFileContentDataRequest request;
|
GetFileContentDataRequest request;
|
||||||
|
|
||||||
request.fileContentId(m_fileContentId);
|
request.fileContentId = m_fileContentId;
|
||||||
INFO_LOG(m_logger) << "trying to send content request for file Id = " << m_fileContentId;
|
INFO_LOG(m_logger) << "trying to send content request for file Id = " << m_fileContentId;
|
||||||
|
|
||||||
if (!m_ftc->getFileContentDataRequest(request, this))
|
if (!m_ftc->getFileContentDataRequest(request, this))
|
||||||
@@ -659,16 +659,16 @@ void FlmTests::tryGetContent()
|
|||||||
// ------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------
|
||||||
void FlmTests::onGetFileContentDataReply(const GetFileContentDataReply &replyObject)
|
void FlmTests::onGetFileContentDataReply(const GetFileContentDataReply &replyObject)
|
||||||
{
|
{
|
||||||
if (replyObject.errorString().size() > 0)
|
if (replyObject.errorString.size() > 0)
|
||||||
{
|
{
|
||||||
ERROR_LOG(m_logger) << "Got onGetFileContentDataReply error: " << replyObject.errorString();
|
ERROR_LOG(m_logger) << "Got onGetFileContentDataReply error: " << replyObject.errorString;
|
||||||
failExit();
|
failExit();
|
||||||
}
|
}
|
||||||
|
|
||||||
INFO_LOG(m_logger) << "Got reply with id " << replyObject.id()
|
INFO_LOG(m_logger) << "Got reply with id " << replyObject.id
|
||||||
<< " and errorString " << replyObject.errorString();
|
<< " and errorString " << replyObject.errorString;
|
||||||
|
|
||||||
m_content = replyObject.content();
|
m_content = replyObject.content;
|
||||||
|
|
||||||
DEBUG_LOG(m_logger) << "Content size: " << m_content.size();
|
DEBUG_LOG(m_logger) << "Content size: " << m_content.size();
|
||||||
|
|
||||||
@@ -691,7 +691,7 @@ void FlmTests::tryGetAllTemplates()
|
|||||||
|
|
||||||
DEBUG_LOG(m_logger) << "Found " << allTemplates.size() << " templates";
|
DEBUG_LOG(m_logger) << "Found " << allTemplates.size() << " templates";
|
||||||
for (const FileContent &fc : qAsConst(allTemplates))
|
for (const FileContent &fc : qAsConst(allTemplates))
|
||||||
DEBUG_LOG(m_logger) << "Found template (id, name) = (" << fc.id() << ", " << fc.name() << ")";
|
DEBUG_LOG(m_logger) << "Found template (id, name) = (" << fc.id << ", " << fc.name << ")";
|
||||||
|
|
||||||
QTest::qWait(1000);
|
QTest::qWait(1000);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,15 +12,15 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <Lts/Services/FileManagement/flm_ftc.h>
|
#include <FileManagement/flm_ftc.h>
|
||||||
#include <include/FileManagement/flm_dtc.h>
|
#include <FileManagement/flm_dtc.h>
|
||||||
#include <Lts/Services/FileManagement/flm_db.h>
|
#include <FileManagement/flm_db.h>
|
||||||
#include <Lts/Services/FileManagement/flm_db_impl_custom.h>
|
#include <FileManagement/flm_db_impl_custom.h>
|
||||||
#include <FileManagement/flm_ftc_types.h>
|
#include <FileManagement/flm_ftc_types.h>
|
||||||
|
|
||||||
#include <DDS/DDSConnector/dds_connector.h>
|
#include <DDS/DDSConnector/dds_connector.h>
|
||||||
|
|
||||||
#include <Lts/Services/FileManagement/logger.h>
|
#include <FileManagement/logger.h>
|
||||||
#include <QtGui/QPixmap>
|
#include <QtGui/QPixmap>
|
||||||
#include <ngldb/db_service_handler.h>
|
#include <ngldb/db_service_handler.h>
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,12 @@
|
|||||||
INCLUDE(MacroRTIDDSGen)
|
INCLUDE(MacroRTIDDSGen)
|
||||||
INCLUDE(MacroCodeGenIdl)
|
INCLUDE(MacroCodeGenIdl)
|
||||||
|
|
||||||
|
# Resolve <DDS/...> includes (generic_data_reader.h, generic_dtc.h, ...) to the
|
||||||
|
# real headers under Lts/DDS/ instead of the migration stub tree in include/.
|
||||||
|
# Qt5 legacy resolved these the same way; the stub tree shadows them otherwise
|
||||||
|
# (it opens namespace DDSGeneric around framework includes and breaks Qt6).
|
||||||
|
include_directories(BEFORE ${CMAKE_SOURCE_DIR}/Lts)
|
||||||
|
|
||||||
SET(xml_FILE flt_service.xml)
|
SET(xml_FILE flt_service.xml)
|
||||||
|
|
||||||
#
|
#
|
||||||
@@ -19,26 +25,18 @@ SET(SRCS_common
|
|||||||
)
|
)
|
||||||
|
|
||||||
# Generate flt_enums.idl / flt.idl
|
# Generate flt_enums.idl / flt.idl
|
||||||
IF(BUILD_RTI)
|
CODEGEN_IDL_SVC(SRCS_common ${xml_FILE})
|
||||||
CODEGEN_IDL_SVC(SRCS_common ${xml_FILE})
|
|
||||||
ENDIF()
|
|
||||||
# Generate flt_db_impl.cpp/.h, flt_db.h
|
# Generate flt_db_impl.cpp/.h, flt_db.h
|
||||||
IF(BUILD_RTI)
|
CODEGEN_DATABASE(SRCS_common ${xml_FILE})
|
||||||
CODEGEN_DATABASE(SRCS_common ${xml_FILE})
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
# Generate *.cpp/*.hpp from idl
|
# Generate *.cpp/*.hpp from idl
|
||||||
RTIDDSGEN(SRCS_common flt_enums.idl)
|
RTIDDSGEN(SRCS_common flt_enums.idl)
|
||||||
RTIDDSGEN(SRCS_common flt.idl)
|
RTIDDSGEN(SRCS_common flt.idl)
|
||||||
|
|
||||||
# Generate flt_dt[s,c]_types.h, flt_ft[s,c]_types.h
|
# Generate flt_dt[s,c]_types.h, flt_ft[s,c]_types.h
|
||||||
IF(BUILD_RTI)
|
CODEGEN_TOPIC_TYPEDEFS(SRCS_common ${xml_FILE})
|
||||||
CODEGEN_TOPIC_TYPEDEFS(SRCS_common ${xml_FILE})
|
|
||||||
ENDIF()
|
|
||||||
# Generate flt_[d|f]tc.h
|
# Generate flt_[d|f]tc.h
|
||||||
IF(BUILD_RTI)
|
CODEGEN_CLIENT_TOPICS_IFC(SRCS_common ${xml_FILE})
|
||||||
CODEGEN_CLIENT_TOPICS_IFC(SRCS_common ${xml_FILE})
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
NGL_ADD_LIBRARY(AAR SV WS svcFltCommon SHARED ${SRCS_common})
|
NGL_ADD_LIBRARY(AAR SV WS svcFltCommon SHARED ${SRCS_common})
|
||||||
NGL_TARGET_INCLUDE_DIRECTORIES(svcFltCommon
|
NGL_TARGET_INCLUDE_DIRECTORIES(svcFltCommon
|
||||||
@@ -64,9 +62,7 @@ SET(SRCS_client
|
|||||||
flt_export.h
|
flt_export.h
|
||||||
)
|
)
|
||||||
# generate flt_[d|f]tc.h, flt_[d|f]tc_impl.[cpp|h]
|
# generate flt_[d|f]tc.h, flt_[d|f]tc_impl.[cpp|h]
|
||||||
IF(BUILD_RTI)
|
CODEGEN_CLIENT_TOPICS_IMPL(SRCS_client ${xml_FILE})
|
||||||
CODEGEN_CLIENT_TOPICS_IMPL(SRCS_client ${xml_FILE})
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
NGL_ADD_LIBRARY(AAR SV WS svcFltClient SHARED ${SRCS_client})
|
NGL_ADD_LIBRARY(AAR SV WS svcFltClient SHARED ${SRCS_client})
|
||||||
NGL_TARGET_INCLUDE_DIRECTORIES(svcFltClient
|
NGL_TARGET_INCLUDE_DIRECTORIES(svcFltClient
|
||||||
@@ -107,13 +103,9 @@ SET(SRCS_server
|
|||||||
${xml_FILE}
|
${xml_FILE}
|
||||||
)
|
)
|
||||||
# generate flt_[d|f]ts.h, flt_[d|f]ts_impl.[cpp|h]
|
# generate flt_[d|f]ts.h, flt_[d|f]ts_impl.[cpp|h]
|
||||||
IF(BUILD_RTI)
|
CODEGEN_SERVER_TOPICS(SRCS_server ${xml_FILE})
|
||||||
CODEGEN_SERVER_TOPICS(SRCS_server ${xml_FILE})
|
|
||||||
ENDIF()
|
|
||||||
# Generate flt.sql, flt.xml
|
# Generate flt.sql, flt.xml
|
||||||
IF(BUILD_RTI)
|
CODEGEN_SQL(SRCS_server ${xml_FILE})
|
||||||
CODEGEN_SQL(SRCS_server ${xml_FILE})
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
NGL_ADD_LIBRARY(AAR SV svcFltServer SHARED ${SRCS_server})
|
NGL_ADD_LIBRARY(AAR SV svcFltServer SHARED ${SRCS_server})
|
||||||
NGL_TARGET_INCLUDE_DIRECTORIES(svcFltServer
|
NGL_TARGET_INCLUDE_DIRECTORIES(svcFltServer
|
||||||
@@ -141,9 +133,7 @@ NGL_INSTALL_TARGET(svcFltServer)
|
|||||||
#
|
#
|
||||||
# --- Topic Type Plugin --------------------------------------------------------------
|
# --- Topic Type Plugin --------------------------------------------------------------
|
||||||
#
|
#
|
||||||
IF(BUILD_RTI)
|
CREATE_TOPIC_TYPE_PLUGIN(${xml_FILE})
|
||||||
CREATE_TOPIC_TYPE_PLUGIN(${xml_FILE})
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# --- Executable -------------------------------------------------
|
# --- Executable -------------------------------------------------
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ void DdsHandler::setRunningState(Core::RunningState rs)
|
|||||||
m_pacemaker->setNewState(rs);
|
m_pacemaker->setNewState(rs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DdsHandler::addPortToPacemaker(quint16 port, Core::PortType type)
|
void DdsHandler::addPortToPacemaker(quint16 port, Core::CorePortType type)
|
||||||
{
|
{
|
||||||
if (!m_pacemaker)
|
if (!m_pacemaker)
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ public:
|
|||||||
bool init(const QStringList &qosFileList = QStringList());
|
bool init(const QStringList &qosFileList = QStringList());
|
||||||
|
|
||||||
void setRunningState(Core::RunningState rs);
|
void setRunningState(Core::RunningState rs);
|
||||||
void addPortToPacemaker(quint16 port, Core::PortType type);
|
void addPortToPacemaker(quint16 port, Core::CorePortType type);
|
||||||
|
|
||||||
std::shared_ptr<FilterManagement::Interface::Dts> dts() const { return m_ddsDts; }
|
std::shared_ptr<FilterManagement::Interface::Dts> dts() const { return m_ddsDts; }
|
||||||
std::shared_ptr<FilterManagement::Interface::Fts> fts() const { return m_ddsFts; }
|
std::shared_ptr<FilterManagement::Interface::Fts> fts() const { return m_ddsFts; }
|
||||||
|
|||||||
+10
-10
@@ -60,7 +60,7 @@ void HandlerAesFilter::cleanup()
|
|||||||
auto dts = dds()->dts();
|
auto dts = dds()->dts();
|
||||||
for (auto it = m_aesFilterMap.cbegin(); it != m_aesFilterMap.cend(); ++it)
|
for (auto it = m_aesFilterMap.cbegin(); it != m_aesFilterMap.cend(); ++it)
|
||||||
{
|
{
|
||||||
dts->removeAesFilterByKey(it.value()->id());
|
dts->removeAesFilterByKey(it.value()->id);
|
||||||
delete it.value();
|
delete it.value();
|
||||||
}
|
}
|
||||||
m_aesFilterMap.clear();
|
m_aesFilterMap.clear();
|
||||||
@@ -79,9 +79,9 @@ void HandlerAesFilter::onAesFilterUpdateRequest(const rti::core::SampleIdentity
|
|||||||
Core::FunctionReplyObject HandlerAesFilter::aesFilterUpdateRequest(const AesFilter &request)
|
Core::FunctionReplyObject HandlerAesFilter::aesFilterUpdateRequest(const AesFilter &request)
|
||||||
{
|
{
|
||||||
Database::AesFilter dbFilter;
|
Database::AesFilter dbFilter;
|
||||||
dbFilter.operatorId = request.operatorId();
|
dbFilter.operatorId = request.operatorId;
|
||||||
dbFilter.content = QString::fromStdString(request.content());
|
dbFilter.content = QString::fromStdString(request.content);
|
||||||
dbFilter.ctx = QString::fromStdString(request.ctx());
|
dbFilter.ctx = QString::fromStdString(request.ctx);
|
||||||
|
|
||||||
const key k(dbFilter.operatorId, dbFilter.ctx);
|
const key k(dbFilter.operatorId, dbFilter.ctx);
|
||||||
auto it = m_aesFilterMap.find(k);
|
auto it = m_aesFilterMap.find(k);
|
||||||
@@ -92,21 +92,21 @@ Core::FunctionReplyObject HandlerAesFilter::aesFilterUpdateRequest(const AesFilt
|
|||||||
if (!db()->insert(dbFilter))
|
if (!db()->insert(dbFilter))
|
||||||
return Core::FunctionReplyObject(dbFilter.operatorId, tr_lts("dds", "Can not insert AesFilter into database"));
|
return Core::FunctionReplyObject(dbFilter.operatorId, tr_lts("dds", "Can not insert AesFilter into database"));
|
||||||
AesFilter *ptr = new AesFilter(request);
|
AesFilter *ptr = new AesFilter(request);
|
||||||
ptr->sampleTime(QDateTime::currentMSecsSinceEpoch());
|
ptr->sampleTime = QDateTime::currentMSecsSinceEpoch();
|
||||||
ptr->id(dbFilter.id);
|
ptr->id = dbFilter.id;
|
||||||
m_aesFilterMap.insert(k, ptr);
|
m_aesFilterMap.insert(k, ptr);
|
||||||
it = m_aesFilterMap.find(k);
|
it = m_aesFilterMap.find(k);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// already exists
|
// already exists
|
||||||
dbFilter.id = it.value()->id();
|
dbFilter.id = it.value()->id;
|
||||||
dbFilter.operatorId = it.value()->operatorId();
|
dbFilter.operatorId = it.value()->operatorId;
|
||||||
|
|
||||||
if (!db()->update(dbFilter))
|
if (!db()->update(dbFilter))
|
||||||
return Core::FunctionReplyObject(dbFilter.operatorId, tr_lts("dds", "Error updating AesFilter in database"));
|
return Core::FunctionReplyObject(dbFilter.operatorId, tr_lts("dds", "Error updating AesFilter in database"));
|
||||||
it.value()->sampleTime(QDateTime::currentMSecsSinceEpoch());
|
it.value()->sampleTime = QDateTime::currentMSecsSinceEpoch();
|
||||||
it.value()->content(request.content());
|
it.value()->content = request.content;
|
||||||
}
|
}
|
||||||
dds()->dts()->publish(*it.value());
|
dds()->dts()->publish(*it.value());
|
||||||
return Core::FunctionReplyObject();
|
return Core::FunctionReplyObject();
|
||||||
|
|||||||
+10
-10
@@ -60,7 +60,7 @@ void HandlerBuildingComponentFilter::cleanup()
|
|||||||
auto dts = dds()->dts();
|
auto dts = dds()->dts();
|
||||||
for (auto it = m_buildingComponentFilterMap.cbegin(); it != m_buildingComponentFilterMap.cend(); ++it)
|
for (auto it = m_buildingComponentFilterMap.cbegin(); it != m_buildingComponentFilterMap.cend(); ++it)
|
||||||
{
|
{
|
||||||
dts->removeBuildingComponentFilterByKey(it.value()->id());
|
dts->removeBuildingComponentFilterByKey(it.value()->id);
|
||||||
delete it.value();
|
delete it.value();
|
||||||
}
|
}
|
||||||
m_buildingComponentFilterMap.clear();
|
m_buildingComponentFilterMap.clear();
|
||||||
@@ -79,9 +79,9 @@ void HandlerBuildingComponentFilter::onBuildingComponentFilterUpdateRequest(cons
|
|||||||
Core::FunctionReplyObject HandlerBuildingComponentFilter::BuildingComponentFilterUpdateRequest(const BuildingComponentFilter &request)
|
Core::FunctionReplyObject HandlerBuildingComponentFilter::BuildingComponentFilterUpdateRequest(const BuildingComponentFilter &request)
|
||||||
{
|
{
|
||||||
Database::BuildingComponentFilter dbFilter;
|
Database::BuildingComponentFilter dbFilter;
|
||||||
dbFilter.operatorId = request.operatorId();
|
dbFilter.operatorId = request.operatorId;
|
||||||
dbFilter.content = QString::fromStdString(request.content());
|
dbFilter.content = QString::fromStdString(request.content);
|
||||||
dbFilter.ctx = QString::fromStdString(request.ctx());
|
dbFilter.ctx = QString::fromStdString(request.ctx);
|
||||||
|
|
||||||
const key k(dbFilter.operatorId, dbFilter.ctx);
|
const key k(dbFilter.operatorId, dbFilter.ctx);
|
||||||
auto it = m_buildingComponentFilterMap.find(k);
|
auto it = m_buildingComponentFilterMap.find(k);
|
||||||
@@ -92,21 +92,21 @@ Core::FunctionReplyObject HandlerBuildingComponentFilter::BuildingComponentFilte
|
|||||||
if (!db()->insert(dbFilter))
|
if (!db()->insert(dbFilter))
|
||||||
return Core::FunctionReplyObject(dbFilter.operatorId, tr_lts("dds", "Can not insert BuildingComponentFilter into database"));
|
return Core::FunctionReplyObject(dbFilter.operatorId, tr_lts("dds", "Can not insert BuildingComponentFilter into database"));
|
||||||
BuildingComponentFilter *ptr = new BuildingComponentFilter(request);
|
BuildingComponentFilter *ptr = new BuildingComponentFilter(request);
|
||||||
ptr->sampleTime(QDateTime::currentMSecsSinceEpoch());
|
ptr->sampleTime = QDateTime::currentMSecsSinceEpoch();
|
||||||
ptr->id(dbFilter.id);
|
ptr->id = dbFilter.id;
|
||||||
m_buildingComponentFilterMap.insert(k, ptr);
|
m_buildingComponentFilterMap.insert(k, ptr);
|
||||||
it = m_buildingComponentFilterMap.find(k);
|
it = m_buildingComponentFilterMap.find(k);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// already exists
|
// already exists
|
||||||
dbFilter.id = it.value()->id();
|
dbFilter.id = it.value()->id;
|
||||||
dbFilter.operatorId = it.value()->operatorId();
|
dbFilter.operatorId = it.value()->operatorId;
|
||||||
|
|
||||||
if (!db()->update(dbFilter))
|
if (!db()->update(dbFilter))
|
||||||
return Core::FunctionReplyObject(dbFilter.operatorId, tr_lts("dds", "Error updating BuildingComponentFilter in database"));
|
return Core::FunctionReplyObject(dbFilter.operatorId, tr_lts("dds", "Error updating BuildingComponentFilter in database"));
|
||||||
it.value()->sampleTime(QDateTime::currentMSecsSinceEpoch());
|
it.value()->sampleTime = QDateTime::currentMSecsSinceEpoch();
|
||||||
it.value()->content(request.content());
|
it.value()->content = request.content;
|
||||||
}
|
}
|
||||||
dds()->dts()->publish(*it.value());
|
dds()->dts()->publish(*it.value());
|
||||||
return Core::FunctionReplyObject();
|
return Core::FunctionReplyObject();
|
||||||
|
|||||||
+2
-2
@@ -71,7 +71,7 @@ void HandlerFilterDataUpdate::onFilterDataUpdateRequest(const rti::core::SampleI
|
|||||||
Core::FunctionReplyObject HandlerFilterDataUpdate::filterDataUpdateRequest(const FilterData &request)
|
Core::FunctionReplyObject HandlerFilterDataUpdate::filterDataUpdateRequest(const FilterData &request)
|
||||||
{
|
{
|
||||||
DEBUG_LOG(m_logger) << LOGFUNCTION << " FilterData: " << request;
|
DEBUG_LOG(m_logger) << LOGFUNCTION << " FilterData: " << request;
|
||||||
const std::tuple<int,int,int> k(request.operatorId(), request.screenId(), request.screenContainerId());
|
const std::tuple<int,int,int> k(request.operatorId, request.screenId, request.screenContainerId);
|
||||||
auto it = m_latestFilter.find(k);
|
auto it = m_latestFilter.find(k);
|
||||||
if (it == m_latestFilter.end())
|
if (it == m_latestFilter.end())
|
||||||
{
|
{
|
||||||
@@ -81,7 +81,7 @@ Core::FunctionReplyObject HandlerFilterDataUpdate::filterDataUpdateRequest(const
|
|||||||
// already exists
|
// already exists
|
||||||
FilterData ¤tRef = it.value();
|
FilterData ¤tRef = it.value();
|
||||||
// compare age:
|
// compare age:
|
||||||
if (currentRef.requestTime() <= request.requestTime())
|
if (currentRef.requestTime <= request.requestTime)
|
||||||
currentRef = request;
|
currentRef = request;
|
||||||
}
|
}
|
||||||
dds()->dts()->publish(request);
|
dds()->dts()->publish(request);
|
||||||
|
|||||||
+10
-10
@@ -60,7 +60,7 @@ void HandlerSymbolAppearance::cleanup()
|
|||||||
auto dts = dds()->dts();
|
auto dts = dds()->dts();
|
||||||
for (auto it = m_symbolAppearanceMap.cbegin(); it != m_symbolAppearanceMap.cend(); ++it)
|
for (auto it = m_symbolAppearanceMap.cbegin(); it != m_symbolAppearanceMap.cend(); ++it)
|
||||||
{
|
{
|
||||||
dts->removeSymbolAppearanceByKey(it.value()->id());
|
dts->removeSymbolAppearanceByKey(it.value()->id);
|
||||||
delete it.value();
|
delete it.value();
|
||||||
}
|
}
|
||||||
m_symbolAppearanceMap.clear();
|
m_symbolAppearanceMap.clear();
|
||||||
@@ -79,9 +79,9 @@ void HandlerSymbolAppearance::onSymbolAppearanceUpdateRequest(const rti::core::S
|
|||||||
Core::FunctionReplyObject HandlerSymbolAppearance::symbolAppearanceUpdateRequest(const SymbolAppearance &request)
|
Core::FunctionReplyObject HandlerSymbolAppearance::symbolAppearanceUpdateRequest(const SymbolAppearance &request)
|
||||||
{
|
{
|
||||||
Database::SymbolAppearance dbFilter;
|
Database::SymbolAppearance dbFilter;
|
||||||
dbFilter.operatorId = request.operatorId();
|
dbFilter.operatorId = request.operatorId;
|
||||||
dbFilter.content = QString::fromStdString(request.content());
|
dbFilter.content = QString::fromStdString(request.content);
|
||||||
dbFilter.ctx = QString::fromStdString(request.ctx());
|
dbFilter.ctx = QString::fromStdString(request.ctx);
|
||||||
|
|
||||||
const key k(dbFilter.operatorId, dbFilter.ctx);
|
const key k(dbFilter.operatorId, dbFilter.ctx);
|
||||||
auto it = m_symbolAppearanceMap.find(k);
|
auto it = m_symbolAppearanceMap.find(k);
|
||||||
@@ -95,24 +95,24 @@ Core::FunctionReplyObject HandlerSymbolAppearance::symbolAppearanceUpdateRequest
|
|||||||
return Core::FunctionReplyObject(dbFilter.operatorId, tr_lts("dds", "Can not insert SymbolAppearanceFilter into database"));
|
return Core::FunctionReplyObject(dbFilter.operatorId, tr_lts("dds", "Can not insert SymbolAppearanceFilter into database"));
|
||||||
}
|
}
|
||||||
SymbolAppearance *ptr = new SymbolAppearance(request);
|
SymbolAppearance *ptr = new SymbolAppearance(request);
|
||||||
ptr->sampleTime(QDateTime::currentMSecsSinceEpoch());
|
ptr->sampleTime = QDateTime::currentMSecsSinceEpoch();
|
||||||
ptr->id(dbFilter.id);
|
ptr->id = dbFilter.id;
|
||||||
m_symbolAppearanceMap.insert(k, ptr);
|
m_symbolAppearanceMap.insert(k, ptr);
|
||||||
it = m_symbolAppearanceMap.find(k);
|
it = m_symbolAppearanceMap.find(k);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// already exists
|
// already exists
|
||||||
dbFilter.id = it.value()->id();
|
dbFilter.id = it.value()->id;
|
||||||
dbFilter.operatorId = it.value()->operatorId();
|
dbFilter.operatorId = it.value()->operatorId;
|
||||||
|
|
||||||
DEBUG_LOG(m_logger) << "Update symbol filter with id " << dbFilter.id
|
DEBUG_LOG(m_logger) << "Update symbol filter with id " << dbFilter.id
|
||||||
<< " for operator " << dbFilter.operatorId;
|
<< " for operator " << dbFilter.operatorId;
|
||||||
|
|
||||||
if (!db()->update(dbFilter))
|
if (!db()->update(dbFilter))
|
||||||
return Core::FunctionReplyObject(dbFilter.operatorId, tr_lts("dds", "Error updating SymbolAppearanceFilter in database"));
|
return Core::FunctionReplyObject(dbFilter.operatorId, tr_lts("dds", "Error updating SymbolAppearanceFilter in database"));
|
||||||
it.value()->sampleTime(QDateTime::currentMSecsSinceEpoch());
|
it.value()->sampleTime = QDateTime::currentMSecsSinceEpoch();
|
||||||
it.value()->content(request.content());
|
it.value()->content = request.content;
|
||||||
}
|
}
|
||||||
dds()->dts()->publish(*it.value());
|
dds()->dts()->publish(*it.value());
|
||||||
return Core::FunctionReplyObject();
|
return Core::FunctionReplyObject();
|
||||||
|
|||||||
@@ -53,7 +53,6 @@ endif()
|
|||||||
NGL_TARGET_INCLUDE_DIRECTORIES(LtsFileDialog
|
NGL_TARGET_INCLUDE_DIRECTORIES(LtsFileDialog
|
||||||
PUBLIC
|
PUBLIC
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../
|
${CMAKE_CURRENT_SOURCE_DIR}/../
|
||||||
${CMAKE_SOURCE_DIR}/include/FileManagement/
|
|
||||||
${CMAKE_SOURCE_DIR}/include/OperatorManagement/
|
${CMAKE_SOURCE_DIR}/include/OperatorManagement/
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,10 @@ elif [ "$1" = "ON" ]; then
|
|||||||
BUILD_RTI=ON
|
BUILD_RTI=ON
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# BUILD_GRANTLEE must be ON: codegen (IDL/DTC/FTC/SQL) generation is required
|
||||||
|
# for the migrated services. Only the ON variant is supported and validated.
|
||||||
|
BUILD_GRANTLEE="${BUILD_GRANTLEE:-ON}"
|
||||||
|
|
||||||
# Run CMake configuration and build inside Docker
|
# Run CMake configuration and build inside Docker
|
||||||
docker run --rm \
|
docker run --rm \
|
||||||
-e MIGRATE_PIPELINE_ROOT \
|
-e MIGRATE_PIPELINE_ROOT \
|
||||||
@@ -31,6 +35,11 @@ docker run --rm \
|
|||||||
-v ${MIGRATE_PIPELINE_ROOT}/rti_license.dat:/workspace/rti_license.dat \
|
-v ${MIGRATE_PIPELINE_ROOT}/rti_license.dat:/workspace/rti_license.dat \
|
||||||
-w /workspace/qt-migration-legatus/qt6-after/qt6-migrated-legatus \
|
-w /workspace/qt-migration-legatus/qt6-after/qt6-migrated-legatus \
|
||||||
ubuntu:26.04 bash -c "
|
ubuntu:26.04 bash -c "
|
||||||
|
# Fail the container on any command error and on failing pipeline
|
||||||
|
# stages (the make call below pipes through tee, which would otherwise
|
||||||
|
# mask a non-zero make exit code).
|
||||||
|
set -eo pipefail
|
||||||
|
|
||||||
apt-get update -qq && \
|
apt-get update -qq && \
|
||||||
apt-get install -y -qq \
|
apt-get install -y -qq \
|
||||||
build-essential \
|
build-essential \
|
||||||
@@ -40,6 +49,7 @@ docker run --rm \
|
|||||||
libqt6gui6 \
|
libqt6gui6 \
|
||||||
libqt6widgets6 \
|
libqt6widgets6 \
|
||||||
qt6-base-dev \
|
qt6-base-dev \
|
||||||
|
qt6-websockets-dev \
|
||||||
qt6-tools-dev-tools \
|
qt6-tools-dev-tools \
|
||||||
qt6-tools-dev \
|
qt6-tools-dev \
|
||||||
qt6-l10n-tools \
|
qt6-l10n-tools \
|
||||||
@@ -65,11 +75,12 @@ docker run --rm \
|
|||||||
|
|
||||||
cmake .. \
|
cmake .. \
|
||||||
-DBUILD_RTI=${BUILD_RTI} \
|
-DBUILD_RTI=${BUILD_RTI} \
|
||||||
|
-DBUILD_GRANTLEE=${BUILD_GRANTLEE} \
|
||||||
-DBUILD_ARCGIS=OFF \
|
-DBUILD_ARCGIS=OFF \
|
||||||
-DCMAKE_CXX_STANDARD=17 \
|
-DCMAKE_CXX_STANDARD=17 \
|
||||||
-DCMAKE_BUILD_TYPE=Release
|
-DCMAKE_BUILD_TYPE=Release
|
||||||
|
|
||||||
make -j8 ddscore ddsftccore ddsQoS ddsconnector ddsfts migration_tests NGLLogger SV nglapplication nglcompression nglcoreapplication ngldb nglguiapplication nglsettings nglsingleapplication nglsinglecoreapplication ngltools ngltranslator nglwidgets qtsingleapplication qtsinglecoreapplication wms_json_ds tcpserver 2>&1 | tee build.log
|
make -j8 ddscore ddsftccore ddsQoS ddsconnector ddsfts migration_tests NGLLogger nglapplication nglcompression nglcoreapplication ngldb nglguiapplication nglsettings nglsingleapplication nglsinglecoreapplication ngltools ngltranslator nglwidgets qtsingleapplication qtsinglecoreapplication wms_json_ds tcpserver svcFileManagement svcFilterManagement flmTests 2>&1 | tee build.log
|
||||||
|
|
||||||
# Run the CTest unit tests as an explicit validation step.
|
# Run the CTest unit tests as an explicit validation step.
|
||||||
# We are already inside build4 (cd build4 above), so --test-dir is the
|
# We are already inside build4 (cd build4 above), so --test-dir is the
|
||||||
|
|||||||
@@ -106,12 +106,29 @@ if(BUILD_TESTING)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
add_executable(migration_tests ${EXISTING_SOURCES})
|
add_executable(migration_tests ${EXISTING_SOURCES})
|
||||||
|
|
||||||
|
# FLM/FLT tests include build-tree generated headers (flm_[dtc|ftc|enums],
|
||||||
|
# flt_[dtc|ftc|enums]) - make sure codegen of these services ran first.
|
||||||
|
if(TARGET svcFlmCommon)
|
||||||
|
add_dependencies(migration_tests svcFlmCommon)
|
||||||
|
endif()
|
||||||
|
if(TARGET svcFltCommon)
|
||||||
|
add_dependencies(migration_tests svcFltCommon)
|
||||||
|
endif()
|
||||||
|
|
||||||
# Enable Qt Meta-Object Compiler for tests with Q_OBJECT
|
# Enable Qt Meta-Object Compiler for tests with Q_OBJECT
|
||||||
set_target_properties(migration_tests PROPERTIES AUTOMOC ON)
|
set_target_properties(migration_tests PROPERTIES AUTOMOC ON)
|
||||||
|
|
||||||
target_compile_features(migration_tests PRIVATE cxx_std_17)
|
target_compile_features(migration_tests PRIVATE cxx_std_17)
|
||||||
|
|
||||||
|
# BEFORE: the root CMakeLists' include_directories() puts include/ early
|
||||||
|
# on the path, so the BUILD_RTI=OFF stub variant of DDS/Generic would
|
||||||
|
# shadow the real DDS framework headers that the generated flm/flt
|
||||||
|
# service headers pull in — same fix the service CMakeLists enforce
|
||||||
|
# with include_directories(BEFORE ${CMAKE_SOURCE_DIR}/Lts).
|
||||||
|
target_include_directories(migration_tests BEFORE PRIVATE
|
||||||
|
${CMAKE_SOURCE_DIR}/Lts
|
||||||
|
)
|
||||||
target_include_directories(migration_tests PRIVATE
|
target_include_directories(migration_tests PRIVATE
|
||||||
${CMAKE_SOURCE_DIR}
|
${CMAKE_SOURCE_DIR}
|
||||||
${CMAKE_SOURCE_DIR}/include
|
${CMAKE_SOURCE_DIR}/include
|
||||||
@@ -121,8 +138,29 @@ if(BUILD_TESTING)
|
|||||||
${CMAKE_BINARY_DIR}/Lts/Common/LtsTimeline
|
${CMAKE_BINARY_DIR}/Lts/Common/LtsTimeline
|
||||||
${CMAKE_SOURCE_DIR}/Lts/Common/LtsTimelineClassic
|
${CMAKE_SOURCE_DIR}/Lts/Common/LtsTimelineClassic
|
||||||
${CMAKE_BINARY_DIR}/Lts/Services
|
${CMAKE_BINARY_DIR}/Lts/Services
|
||||||
|
${CMAKE_SOURCE_DIR}/Lts/Services
|
||||||
${CMAKE_SOURCE_DIR}/Z/src/NGLLogger
|
${CMAKE_SOURCE_DIR}/Z/src/NGLLogger
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# test_flm_dtc_impl_custom.cpp includes flm_dtc_impl_custom.h, which
|
||||||
|
# pulls in the generated flm_dtc_impl.h. Its include guard requires
|
||||||
|
# MAKE_SVCFLMCLIENT_LIB (defined by NGL_ADD_LIBRARY on svcFlmClient,
|
||||||
|
# which compiles flm_dtc_impl_custom.cpp).
|
||||||
|
target_compile_definitions(migration_tests PRIVATE MAKE_SVCFLMCLIENT_LIB)
|
||||||
|
|
||||||
|
# test_CppTopicGeneratorGrantlee.cpp bootstraps the NGL root logger
|
||||||
|
# before constructing the generator. The <NGLLogger/...> headers
|
||||||
|
# resolve via Z/src, the generated ngllogger_export.h via the
|
||||||
|
# library's binary dir.
|
||||||
|
target_include_directories(migration_tests PRIVATE
|
||||||
|
${CMAKE_SOURCE_DIR}/Z/src
|
||||||
|
${CMAKE_BINARY_DIR}/Z/src/NGLLogger
|
||||||
|
)
|
||||||
|
|
||||||
|
# Export-header tests locate generated headers in the build tree.
|
||||||
|
# The directory name is not stable across pipeline stages (build4),
|
||||||
|
# so the path is passed in instead of being hardcoded.
|
||||||
|
target_compile_definitions(migration_tests PRIVATE MIGRATION_TEST_BUILD_DIR="${CMAKE_BINARY_DIR}")
|
||||||
|
|
||||||
# Link against Qt6 components (Qt6::Test not needed - using gtest)
|
# Link against Qt6 components (Qt6::Test not needed - using gtest)
|
||||||
if(QT6_GUI_AVAILABLE)
|
if(QT6_GUI_AVAILABLE)
|
||||||
@@ -174,6 +212,17 @@ endif()
|
|||||||
if(TARGET nglwidgets AND QT6_GUI_AVAILABLE)
|
if(TARGET nglwidgets AND QT6_GUI_AVAILABLE)
|
||||||
target_link_libraries(migration_tests PRIVATE nglwidgets)
|
target_link_libraries(migration_tests PRIVATE nglwidgets)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# FLM/FLT service tests include the Q_OBJECT custom headers of the
|
||||||
|
# migrated services (flm_db_impl_custom.h, flm_dtc_impl_custom.h).
|
||||||
|
# Their moc output references the generated bases' staticMetaObject
|
||||||
|
# (DatabaseInterface, DtcImpl) defined in the service libraries.
|
||||||
|
if(TARGET svcFlmCommon)
|
||||||
|
target_link_libraries(migration_tests PRIVATE svcFlmCommon)
|
||||||
|
endif()
|
||||||
|
if(TARGET svcFlmClient)
|
||||||
|
target_link_libraries(migration_tests PRIVATE svcFlmClient)
|
||||||
|
endif()
|
||||||
|
|
||||||
# Link against LtsTimelineClassic only if it exists (may not exist with MIGRATE_MODULE)
|
# Link against LtsTimelineClassic only if it exists (may not exist with MIGRATE_MODULE)
|
||||||
if(TARGET LtsTimelineClassic)
|
if(TARGET LtsTimelineClassic)
|
||||||
|
|||||||
@@ -1,22 +1,39 @@
|
|||||||
#include "CppTopicGeneratorGrantlee.h"
|
#include "CppTopicGeneratorGrantlee.h"
|
||||||
|
|
||||||
|
#include <NGLLogger/NGLLoggerBootstrap.h>
|
||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
// GeneratorGrantleeBase acquires its logger from the NGL root logger in its
|
||||||
|
// constructor. getNGLRootLogger() throws NotCreatedError as long as no root
|
||||||
|
// logger was created, so the test has to bootstrap one first. An empty
|
||||||
|
// configuration falls back to WARN logging on stdout ('quiet' suppresses
|
||||||
|
// the notice on stderr); 'ignorealreadycreated' keeps repeat calls
|
||||||
|
// idempotent across tests of this binary.
|
||||||
|
NGL::INGLLogger& ensureRootLogger()
|
||||||
|
{
|
||||||
|
return NGL::NGLLoggerBootstrap::createNGLRootLogger(QString(), true, QString(), true);
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
// Test that CppTopicGeneratorGrantlee can be instantiated
|
// Test that CppTopicGeneratorGrantlee can be instantiated
|
||||||
TEST(CppTopicGeneratorGrantleeTest, CanInstantiate)
|
TEST(CppTopicGeneratorGrantleeTest, CanInstantiate)
|
||||||
{
|
{
|
||||||
CodeGen::CppTopicGeneratorGrantlee generator;
|
ensureRootLogger();
|
||||||
// Basic instantiation test - constructor should not throw
|
// Constructor acquires the logger from the root logger and must not throw
|
||||||
EXPECT_NO_THROW({ CodeGen::CppTopicGeneratorGrantlee gen2; });
|
EXPECT_NO_THROW({ CodeGen::CppTopicGeneratorGrantlee generator; });
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test that the generator has expected base class functionality
|
// Test that the generator has expected base class functionality
|
||||||
TEST(CppTopicGeneratorGrantleeTest, HasLoggerName)
|
TEST(CppTopicGeneratorGrantleeTest, HasLoggerName)
|
||||||
{
|
{
|
||||||
|
ensureRootLogger();
|
||||||
CodeGen::CppTopicGeneratorGrantlee generator;
|
CodeGen::CppTopicGeneratorGrantlee generator;
|
||||||
// The generator should have a logger name set in constructor
|
// The base class created its "CodeGen.CppTopicGeneratorGrantlee" logger
|
||||||
// This verifies the base class initialization worked correctly
|
// from the root logger — retrieving that logger must not throw.
|
||||||
EXPECT_TRUE(true); // Placeholder - actual test depends on base class API
|
EXPECT_NO_THROW(NGL::NGLLoggerBootstrap::getNGLRootLogger().getNGLLogger("CodeGen.CppTopicGeneratorGrantlee"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test compilation of header dependencies
|
// Test compilation of header dependencies
|
||||||
@@ -26,4 +43,4 @@ TEST(CppTopicGeneratorGrantleeTest, HeaderCompiles)
|
|||||||
// compile correctly with Qt6/C++23
|
// compile correctly with Qt6/C++23
|
||||||
// Includes: CppTopicGeneratorGrantlee.h, StructBuilder.h, NGLLogger, QCryptographicHash, grantlee/context.h
|
// Includes: CppTopicGeneratorGrantlee.h, StructBuilder.h, NGLLogger, QCryptographicHash, grantlee/context.h
|
||||||
EXPECT_TRUE(true); // Compilation itself is the test
|
EXPECT_TRUE(true); // Compilation itself is the test
|
||||||
}
|
}
|
||||||
@@ -3,9 +3,12 @@
|
|||||||
* @brief Tests für BUILD_RTI conditional compilation guards
|
* @brief Tests für BUILD_RTI conditional compilation guards
|
||||||
*
|
*
|
||||||
* Tests verify that:
|
* Tests verify that:
|
||||||
* 1. Code compiles with BUILD_RTI=OFF (fallback mode)
|
* 1. BUILD_RTI is defined as 1 in the validated configuration
|
||||||
* 2. RTI-dependent code is properly guarded
|
* 2. RTI-dependent code paths are active (BUILD_RTI=ON)
|
||||||
* 3. Non-RTI code paths work correctly
|
* 3. #if BUILD_RTI guards compile and evaluate correctly
|
||||||
|
*
|
||||||
|
* BUILD_RTI=ON is the only valid migration configuration — the OFF
|
||||||
|
* variant is neither built nor tested.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
@@ -23,27 +26,25 @@ TEST(BuildRTIGuards, MacroDefined)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test 2: Verify DDS connector compiles without RTI
|
// Test 2: Verify RTI code paths are active in the validated configuration
|
||||||
TEST(BuildRTIGuards, DDSConnectorFallback)
|
TEST(BuildRTIGuards, RtiAvailableInValidatedConfig)
|
||||||
{
|
{
|
||||||
// This test verifies that DDS-related headers can be included
|
// The validated migration configuration is BUILD_RTI=ON: the RTI
|
||||||
// and basic functionality works without RTI libraries
|
// code paths must be compiled in and available.
|
||||||
// The actual DDS connector should have fallback implementations
|
|
||||||
bool rti_available = false;
|
bool rti_available = false;
|
||||||
#ifdef BUILD_RTI
|
#ifdef BUILD_RTI
|
||||||
rti_available = true;
|
rti_available = true;
|
||||||
#endif
|
#endif
|
||||||
EXPECT_FALSE(rti_available); // In fallback mode, RTI is not available
|
EXPECT_TRUE(rti_available);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test 3: Verify conditional compilation doesn't break build
|
// Test 3: Verify conditional compilation doesn't break build
|
||||||
TEST(BuildRTIGuards, ConditionalCompilationSafe)
|
TEST(BuildRTIGuards, ConditionalCompilationSafe)
|
||||||
{
|
{
|
||||||
// Verify that #if BUILD_RTI guards don't cause syntax errors
|
// Verify that #if BUILD_RTI guards evaluate to the active branch
|
||||||
int value = 0;
|
int value = 0;
|
||||||
#if BUILD_RTI
|
#if BUILD_RTI
|
||||||
value = 1;
|
value = 1;
|
||||||
#endif
|
#endif
|
||||||
// In fallback mode, value should remain 0
|
EXPECT_EQ(value, 1);
|
||||||
EXPECT_EQ(value, 0);
|
|
||||||
}
|
}
|
||||||
@@ -5,6 +5,11 @@
|
|||||||
* Tests verify that export headers exist and can be included without errors.
|
* Tests verify that export headers exist and can be included without errors.
|
||||||
* Note: Export macros are defined via CMake target_compile_definitions,
|
* Note: Export macros are defined via CMake target_compile_definitions,
|
||||||
* so we test header existence and structure rather than macro expansion.
|
* so we test header existence and structure rather than macro expansion.
|
||||||
|
*
|
||||||
|
* All export headers are generated into the build tree. The build directory
|
||||||
|
* is passed in via the MIGRATION_TEST_BUILD_DIR compile definition (its
|
||||||
|
* name is not stable across pipeline stages), and only headers of targets
|
||||||
|
* that are part of the validated build are checked.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
@@ -12,6 +17,14 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#ifndef MIGRATION_TEST_BUILD_DIR
|
||||||
|
#error "MIGRATION_TEST_BUILD_DIR must be defined by tests/CMakeLists.txt"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
const std::string kBuildDir = MIGRATION_TEST_BUILD_DIR;
|
||||||
|
|
||||||
// Helper to check if file exists and is readable
|
// Helper to check if file exists and is readable
|
||||||
bool fileExists(const std::string& path)
|
bool fileExists(const std::string& path)
|
||||||
{
|
{
|
||||||
@@ -29,32 +42,38 @@ std::string readFile(const std::string& path)
|
|||||||
}
|
}
|
||||||
return std::string((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
|
return std::string((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());
|
||||||
}
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
// Test 1: nglwidgets_export.h exists
|
// Test 1: nglwidgets_export.h exists
|
||||||
TEST(ExportHeaders, NglWidgetsExportExists)
|
TEST(ExportHeaders, NglWidgetsExportExists)
|
||||||
{
|
{
|
||||||
std::string path = "build/Z/src/nglwidgets/nglwidgets_export.h";
|
std::string path = kBuildDir + "/Z/src/nglwidgets/nglwidgets_export.h";
|
||||||
EXPECT_TRUE(fileExists(path)) << "Export header not found: " << path;
|
EXPECT_TRUE(fileExists(path)) << "Export header not found: " << path;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test 2: qtsingleapplication_export.h exists
|
// Test 2: qtsingleapplication_export.h exists
|
||||||
TEST(ExportHeaders, QtSingleApplicationExportExists)
|
TEST(ExportHeaders, QtSingleApplicationExportExists)
|
||||||
{
|
{
|
||||||
std::string path = "build/Z/src/QtSingleApplication/qtsingleapplication_export.h";
|
std::string path = kBuildDir + "/Z/src/QtSingleApplication/qtsingleapplication_export.h";
|
||||||
EXPECT_TRUE(fileExists(path)) << "Export header not found: " << path;
|
EXPECT_TRUE(fileExists(path)) << "Export header not found: " << path;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test 3: ltssessiondata_export.h exists
|
// Test 3: ltssessiondata_export.h exists
|
||||||
TEST(ExportHeaders, LtsSessionDataExportExists)
|
TEST(ExportHeaders, LtsSessionDataExportExists)
|
||||||
{
|
{
|
||||||
std::string path = "build/Lts/Common/LtsSession/ltssessiondata_export.h";
|
std::string path = kBuildDir + "/Lts/Common/LtsSession/ltssessiondata_export.h";
|
||||||
EXPECT_TRUE(fileExists(path)) << "Export header not found: " << path;
|
EXPECT_TRUE(fileExists(path)) << "Export header not found: " << path;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test 4: svcgmpserver_export.h exists
|
// Test 4: ddsconnector_export.h exists
|
||||||
TEST(ExportHeaders, SvcGmpServerExportExists)
|
TEST(ExportHeaders, DdsConnectorExportExists)
|
||||||
{
|
{
|
||||||
std::string path = "build/Lts/Services/GuezMinelayerProcessing/svcgmpserver_export.h";
|
// This originally asserted svcgmpserver_export.h (GuezMinelayerProcessing).
|
||||||
|
// That sibling service is not part of this migration and is not built by
|
||||||
|
// the validation pipeline, so its export header is never generated.
|
||||||
|
// ddsconnector is a core dependency of the migrated FileManagement and
|
||||||
|
// FilterManagement services and part of the validated build.
|
||||||
|
std::string path = kBuildDir + "/Lts/DDS/DDSConnector/ddsconnector_export.h";
|
||||||
EXPECT_TRUE(fileExists(path)) << "Export header not found: " << path;
|
EXPECT_TRUE(fileExists(path)) << "Export header not found: " << path;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,12 +81,15 @@ TEST(ExportHeaders, SvcGmpServerExportExists)
|
|||||||
TEST(ExportHeaders, HaveIncludeGuards)
|
TEST(ExportHeaders, HaveIncludeGuards)
|
||||||
{
|
{
|
||||||
std::vector<std::string> headers = {
|
std::vector<std::string> headers = {
|
||||||
"build/Z/src/nglwidgets/nglwidgets_export.h", "build/Z/src/QtSingleApplication/qtsingleapplication_export.h",
|
kBuildDir + "/Z/src/nglwidgets/nglwidgets_export.h",
|
||||||
"build/Lts/Common/LtsSession/ltssessiondata_export.h", "build/Lts/Proxies/ProjectDataManagement/pdm_export.h"};
|
kBuildDir + "/Z/src/QtSingleApplication/qtsingleapplication_export.h",
|
||||||
|
kBuildDir + "/Lts/Common/LtsSession/ltssessiondata_export.h",
|
||||||
|
kBuildDir + "/Lts/DDS/DDSConnector/ddsconnector_export.h"};
|
||||||
|
|
||||||
for (const auto& header : headers)
|
for (const auto& header : headers)
|
||||||
{
|
{
|
||||||
std::string content = readFile(header);
|
std::string content = readFile(header);
|
||||||
|
EXPECT_FALSE(content.empty()) << "Export header not found: " << header;
|
||||||
if (!content.empty())
|
if (!content.empty())
|
||||||
{
|
{
|
||||||
// Check for #ifndef guard
|
// Check for #ifndef guard
|
||||||
@@ -83,16 +105,17 @@ TEST(ExportHeaders, HaveIncludeGuards)
|
|||||||
// Test 6: Export macros follow naming convention
|
// Test 6: Export macros follow naming convention
|
||||||
TEST(ExportHeaders, MacroNamingConvention)
|
TEST(ExportHeaders, MacroNamingConvention)
|
||||||
{
|
{
|
||||||
// Check that export headers follow CMake naming convention
|
// Check that export headers follow CMake naming convention:
|
||||||
std::string adlerPath =
|
// <PREFIX>_EXPORT_H guard for target <prefix>
|
||||||
"qt-migration-legatus/qt6-after/qt6-migrated-legatus/build/Lts/Plugins/AdlerJson/adler_export.h";
|
std::string connectorPath = kBuildDir + "/Lts/DDS/DDSConnector/ddsconnector_export.h";
|
||||||
std::string content = readFile(adlerPath);
|
std::string content = readFile(connectorPath);
|
||||||
|
|
||||||
|
EXPECT_FALSE(content.empty()) << "Export header not found: " << connectorPath;
|
||||||
if (!content.empty())
|
if (!content.empty())
|
||||||
{
|
{
|
||||||
// Should have ADLER_EXPORT_H guard
|
// Should have DDSCONNECTOR_EXPORT_H guard
|
||||||
bool hasCorrectGuard = content.find("#ifndef ADLER_EXPORT_H") != std::string::npos;
|
bool hasCorrectGuard = content.find("#ifndef DDSCONNECTOR_EXPORT_H") != std::string::npos;
|
||||||
EXPECT_TRUE(hasCorrectGuard) << "adler_export.h should use ADLER_EXPORT_H guard";
|
EXPECT_TRUE(hasCorrectGuard) << "ddsconnector_export.h should use DDSCONNECTOR_EXPORT_H guard";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,18 +123,17 @@ TEST(ExportHeaders, MacroNamingConvention)
|
|||||||
TEST(ExportHeaders, ExportAndNoExportMacros)
|
TEST(ExportHeaders, ExportAndNoExportMacros)
|
||||||
{
|
{
|
||||||
std::vector<std::pair<std::string, std::string>> expectedMacros = {
|
std::vector<std::pair<std::string, std::string>> expectedMacros = {
|
||||||
{"qt-migration-legatus/qt6-after/qt6-migrated-legatus/build/Lts/Plugins/AdlerJson/adler_export.h", "ADLER"},
|
{kBuildDir + "/Lts/DDS/DDSConnector/ddsconnector_export.h", "DDSCONNECTOR"},
|
||||||
{"qt-migration-legatus/qt6-after/qt6-migrated-legatus/build/Lts/Services/PresentationManagement/"
|
{kBuildDir + "/Lts/DDS/FTS/ddsfts_export.h", "DDSFTS"},
|
||||||
"svcprecommon_export.h",
|
{kBuildDir + "/Lts/DDS/Core/ddscore_export.h", "DDSCORE"},
|
||||||
"SVCPRECOMMON"},
|
// Target LtsSessionData uppercases to LTSSESSIONDATA (LTS + SESSIONDATA),
|
||||||
{"qt-migration-legatus/qt6-after/qt6-migrated-legatus/build/Lts/Common/LtsSession/ltssessiondata_export.h",
|
// matching the macros generated in ltssessiondata_export.h.
|
||||||
"LTSESSIONDATA"},
|
{kBuildDir + "/Lts/Common/LtsSession/ltssessiondata_export.h", "LTSSESSIONDATA"}};
|
||||||
{"qt-migration-legatus/qt6-after/qt6-migrated-legatus/build/Lts/Proxies/ProjectDataManagement/pdm_export.h",
|
|
||||||
"PDM"}};
|
|
||||||
|
|
||||||
for (const auto& [header, prefix] : expectedMacros)
|
for (const auto& [header, prefix] : expectedMacros)
|
||||||
{
|
{
|
||||||
std::string content = readFile(header);
|
std::string content = readFile(header);
|
||||||
|
EXPECT_FALSE(content.empty()) << "Export header not found: " << header;
|
||||||
if (!content.empty())
|
if (!content.empty())
|
||||||
{
|
{
|
||||||
bool hasExport = content.find(prefix + "_EXPORT") != std::string::npos;
|
bool hasExport = content.find(prefix + "_EXPORT") != std::string::npos;
|
||||||
@@ -121,4 +143,4 @@ TEST(ExportHeaders, ExportAndNoExportMacros)
|
|||||||
EXPECT_TRUE(hasNoExport) << header << " should define " << prefix << "_NO_EXPORT";
|
EXPECT_TRUE(hasNoExport) << header << " should define " << prefix << "_NO_EXPORT";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
/**
|
||||||
|
* @file test_flm_db_impl_custom.cpp
|
||||||
|
* @brief Tests für DatabaseInterfaceImplCustom (flm_db_impl_custom.cpp/.h)
|
||||||
|
*
|
||||||
|
* Die DB-Methoden selbst (updateStatus/setUsedBy) benötigen eine live
|
||||||
|
* Datenbankverbindung und laufen daher nur im Integrationstest flmTests
|
||||||
|
* (docker: make flmTests). Diese Unit-Tests sichern die Qt6-relevante Kopplung
|
||||||
|
* an den generierten Basistyp flm_db_impl.h ab: Klassenhierarchie,
|
||||||
|
* Override-Signaturen und die Enum-Konvertierung (static_cast<int>), die
|
||||||
|
* flm_db_impl_custom.cpp für Status-Vergleich und SQL-Bind verwendet.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <FileManagement/flm_db_impl_custom.h>
|
||||||
|
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test DatabaseInterfaceImplCustom muss final sein und vom generierten
|
||||||
|
* DatabaseInterfaceImpl (flm_db_impl.h) erben.
|
||||||
|
*/
|
||||||
|
TEST(flm_db_impl_custom, CustomClassIsFinalDerivedFromGeneratedBase)
|
||||||
|
{
|
||||||
|
static_assert(std::is_final<FileManagement::DatabaseInterfaceImplCustom>::value,
|
||||||
|
"DatabaseInterfaceImplCustom muss final sein");
|
||||||
|
static_assert(std::is_base_of<FileManagement::DatabaseInterfaceImpl,
|
||||||
|
FileManagement::DatabaseInterfaceImplCustom>::value,
|
||||||
|
"DatabaseInterfaceImplCustom muss von DatabaseInterfaceImpl erben");
|
||||||
|
SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test Die generierte Basis DatabaseInterfaceImpl ist abstrakt (sie
|
||||||
|
* implementiert updateStatus/setUsedBy nicht); die Custom-Klasse muss
|
||||||
|
* durch ihre beiden Overrides konkret sein.
|
||||||
|
*/
|
||||||
|
TEST(flm_db_impl_custom, OverridesAllPureVirtualMethodsOfGeneratedBase)
|
||||||
|
{
|
||||||
|
static_assert(std::is_abstract<FileManagement::DatabaseInterfaceImpl>::value,
|
||||||
|
"generierte Basis muss abstrakt sein");
|
||||||
|
static_assert(!std::is_abstract<FileManagement::DatabaseInterfaceImplCustom>::value,
|
||||||
|
"Custom-Klasse muss alle pure-virtual Methoden überschreiben");
|
||||||
|
SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test Die Override-Signaturen müssen exakt den Deklarationen in der
|
||||||
|
* generierten Basis flm_db.h entsprechen (const FileStatus&/const bool&).
|
||||||
|
*/
|
||||||
|
TEST(flm_db_impl_custom, OverrideSignaturesMatchGeneratedBase)
|
||||||
|
{
|
||||||
|
using UpdateStatus =
|
||||||
|
bool (FileManagement::DatabaseInterfaceImplCustom::*)(int, const FileManagement::FileStatus &, int);
|
||||||
|
using SetUsedBy =
|
||||||
|
bool (FileManagement::DatabaseInterfaceImplCustom::*)(int, const bool &, int, int);
|
||||||
|
|
||||||
|
static_assert(std::is_same<UpdateStatus,
|
||||||
|
decltype(&FileManagement::DatabaseInterfaceImplCustom::updateStatus)>::value,
|
||||||
|
"updateStatus-Signatur muss (int, const FileStatus&, int) sein");
|
||||||
|
static_assert(std::is_same<SetUsedBy,
|
||||||
|
decltype(&FileManagement::DatabaseInterfaceImplCustom::setUsedBy)>::value,
|
||||||
|
"setUsedBy-Signatur muss (int, const bool&, int, int) sein");
|
||||||
|
SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test flm_db_impl_custom.cpp vergleicht status gegen FileStatus::Deleted
|
||||||
|
* bzw. FileStatus::Valid und bindet static_cast<int>(status) an :st —
|
||||||
|
* die Enum-Werte sind der Vertrag der geänderten Logik.
|
||||||
|
*/
|
||||||
|
TEST(flm_db_impl_custom, StatusEnumValuesMatchSqlBindConversion)
|
||||||
|
{
|
||||||
|
EXPECT_EQ(static_cast<int>(FileManagement::FileStatus::Valid), 0);
|
||||||
|
EXPECT_EQ(static_cast<int>(FileManagement::FileStatus::Deleted), 1);
|
||||||
|
}
|
||||||
@@ -1,16 +1,60 @@
|
|||||||
/**
|
/**
|
||||||
* @file test_flm_dtc.cpp
|
* @file test_flm_dtc.cpp
|
||||||
* @brief Compilation test for FileManagement/flm_dtc.h
|
* @brief Verhaltenstests für die generierte FileManagement Dtc/Ftc-Schnittstelle
|
||||||
*
|
*
|
||||||
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
|
* Diese Tests prüfen den von CODEGEN_CLIENT_TOPICS_IFC aus flm_service.xml
|
||||||
|
* generierten Header (Lts/Services/FileManagement/flm_dtc.h bzw. flm_ftc.h)
|
||||||
|
* aus dem Build-Tree. Es darf keinen Stub-Header im Quellbaum geben.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "FileManagement/flm_dtc.h"
|
#include "FileManagement/flm_dtc.h"
|
||||||
|
#include "FileManagement/flm_ftc.h"
|
||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
#include <QObject>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
TEST(flm_dtc_Compilation, HeaderCompiles)
|
/**
|
||||||
|
* @test Der generierte Dtc muss von QObject abgeleitet sein (Signale für Topic-Updates).
|
||||||
|
*/
|
||||||
|
TEST(flm_dtc_Generated, DtcIsQObjectDerived)
|
||||||
{
|
{
|
||||||
// This test verifies that the header compiles without errors
|
static_assert(std::is_base_of<QObject, FileManagement::Interface::Dtc>::value,
|
||||||
|
"generierter Dtc muss von QObject abgeleitet sein");
|
||||||
|
EXPECT_TRUE(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test Die generierten Identifier müssen dem Service-Namensschema folgen.
|
||||||
|
*/
|
||||||
|
TEST(flm_dtc_Generated, IdentifiersMatchService)
|
||||||
|
{
|
||||||
|
EXPECT_STREQ(FileManagement::Interface::Dtc::identifier(), "FileManagement.Interface.Dtc");
|
||||||
|
EXPECT_STREQ(FileManagement::Interface::Ftc::identifier(), "FileManagement.Interface.Ftc");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test Die Schnittstellen sind abstrakt und stellen die Topic-Zugriffe aus
|
||||||
|
* flm_service.xml bereit (Folder, FileContent, ...).
|
||||||
|
*/
|
||||||
|
TEST(flm_dtc_Generated, TopicInterfacesAreAbstract)
|
||||||
|
{
|
||||||
|
using DtcType = FileManagement::Interface::Dtc;
|
||||||
|
using FtcType = FileManagement::Interface::Ftc;
|
||||||
|
|
||||||
|
static_assert(std::is_abstract<DtcType>::value, "Dtc muss abstrakt sein");
|
||||||
|
static_assert(std::is_abstract<FtcType>::value, "Ftc muss abstrakt sein");
|
||||||
|
|
||||||
|
EXPECT_TRUE(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test Include-Guard: mehrfaches Einbinden der generierten Header ist erlaubt.
|
||||||
|
*/
|
||||||
|
TEST(flm_dtc_Generated, MultipleIncludeGuard)
|
||||||
|
{
|
||||||
|
// Including the header multiple times should not cause errors
|
||||||
|
#include "FileManagement/flm_dtc.h"
|
||||||
|
#include "FileManagement/flm_ftc.h"
|
||||||
EXPECT_TRUE(true);
|
EXPECT_TRUE(true);
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
/**
|
||||||
|
* @file test_flm_dtc_impl_custom.cpp
|
||||||
|
* @brief Tests für DtcImplCustom (flm_dtc_impl_custom.h)
|
||||||
|
*
|
||||||
|
* DtcImplCustom-Instanzen benötigen einen live DDSConnector (Domain
|
||||||
|
* Participant); Verhaltenstests laufen daher nur im Integrationstest flmTests
|
||||||
|
* (docker: make flmTests). Diese Unit-Tests sichern die Qt6-relevante Struktur
|
||||||
|
* ab: Q_OBJECT-Klasse, Vererbung vom generierten Interface::DtcImpl,
|
||||||
|
* Konstruktor-Signatur und die inline Folder-Name-Methoden.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <FileManagement/flm_dtc_impl_custom.h>
|
||||||
|
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test DtcImplCustom muss final sein, vom generierten Interface::DtcImpl
|
||||||
|
* erben und (wegen des Q_OBJECT-Makros) QObject-abgeleitet sein —
|
||||||
|
* moc verifiziert die Klasse beim Bauen von migration_tests.
|
||||||
|
*/
|
||||||
|
TEST(flm_dtc_impl_custom, IsFinalQObjectDerivedFromGeneratedDtcImpl)
|
||||||
|
{
|
||||||
|
static_assert(std::is_final<FileManagement::Interface::DtcImplCustom>::value,
|
||||||
|
"DtcImplCustom muss final sein");
|
||||||
|
static_assert(std::is_base_of<FileManagement::Interface::DtcImpl,
|
||||||
|
FileManagement::Interface::DtcImplCustom>::value,
|
||||||
|
"DtcImplCustom muss von Interface::DtcImpl erben");
|
||||||
|
static_assert(std::is_base_of<QObject, FileManagement::Interface::DtcImplCustom>::value,
|
||||||
|
"Q_OBJECT erfordert eine QObject-Basis");
|
||||||
|
SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test Der Konstruktor muss den shared_ptr<DDSConnector::DdsConnector> aus
|
||||||
|
* der generierten DtcImpl-Basis durchreichen (inherited ctor).
|
||||||
|
*/
|
||||||
|
TEST(flm_dtc_impl_custom, ConstructorTakesDdsConnector)
|
||||||
|
{
|
||||||
|
static_assert(
|
||||||
|
std::is_constructible<FileManagement::Interface::DtcImplCustom,
|
||||||
|
const std::shared_ptr<DDSConnector::DdsConnector> &>::value,
|
||||||
|
"DtcImplCustom muss aus const std::shared_ptr<DdsConnector>& konstruierbar sein");
|
||||||
|
SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test Die in flm_dtc_impl_custom.h inline implementierten Folder-Name-
|
||||||
|
* Formatierungen ("$EX_"/"$PY_"/"$PH_" + Id) müssen als const-Methoden
|
||||||
|
* mit QString-Rückgabe deklariert sein. (Aufruf braucht eine Instanz
|
||||||
|
* mit live DDS — siehe Klassenkommentar.)
|
||||||
|
*/
|
||||||
|
TEST(flm_dtc_impl_custom, InlineFolderNameSignatures)
|
||||||
|
{
|
||||||
|
using FileManagement::Interface::DtcImplCustom;
|
||||||
|
static_assert(std::is_same<QString, decltype(std::declval<const DtcImplCustom &>().getExerciseFolderName(1))>::value,
|
||||||
|
"getExerciseFolderName muss const QString(int) sein");
|
||||||
|
static_assert(std::is_same<QString, decltype(std::declval<const DtcImplCustom &>().getPartyFolderName(1))>::value,
|
||||||
|
"getPartyFolderName muss const QString(int) sein");
|
||||||
|
static_assert(std::is_same<QString, decltype(std::declval<const DtcImplCustom &>().getPhaseFolderName(1))>::value,
|
||||||
|
"getPhaseFolderName muss const QString(int) sein");
|
||||||
|
SUCCEED();
|
||||||
|
}
|
||||||
@@ -1,16 +1,58 @@
|
|||||||
/**
|
/**
|
||||||
* @file test_flm_enums.cpp
|
* @file test_flm_enums.cpp
|
||||||
* @brief Compilation test for FileManagement/flm_enums.hpp
|
* @brief Verhaltenstests für die aus flm_service.xml generierten Enums
|
||||||
*
|
*
|
||||||
* This test verifies that the migrated header compiles correctly with Qt6/C++23.
|
* Diese Tests prüfen die Enum-Werte im generierten Header
|
||||||
|
* (Lts/Services/FileManagement/flm_enums.hpp aus flm_enums.idl via rtiddsgen)
|
||||||
|
* gegen die Definitionen in flm_service.xml. rtiddsgen 7.7 generiert
|
||||||
|
* enum class; Stub-Werte (z. B. FileStatus mit fünf Einträgen) fallen damit auf.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "Lts/Services/FileManagement/flm_enums.hpp"
|
#include "Lts/Services/FileManagement/flm_enums.hpp"
|
||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
TEST(flm_enums_Compilation, HeaderCompiles)
|
/**
|
||||||
|
* @test FileStatus: laut flm_service.xml gilt Valid = 0 und Deleted = 1.
|
||||||
|
*/
|
||||||
|
TEST(flm_enums_Generated, FileStatusValues)
|
||||||
{
|
{
|
||||||
// This test verifies that the header compiles without errors
|
EXPECT_EQ(static_cast<int>(FileManagement::FileStatus::Valid), 0);
|
||||||
|
EXPECT_EQ(static_cast<int>(FileManagement::FileStatus::Deleted), 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test FileType: Stichproben aus der Definition in flm_service.xml
|
||||||
|
* (Unknown = 0, Pdf = 3, AdlerJson = 19).
|
||||||
|
*/
|
||||||
|
TEST(flm_enums_Generated, FileTypeValues)
|
||||||
|
{
|
||||||
|
EXPECT_EQ(static_cast<int>(FileManagement::FileType::Unknown), 0);
|
||||||
|
EXPECT_EQ(static_cast<int>(FileManagement::FileType::Pdf), 3);
|
||||||
|
EXPECT_EQ(static_cast<int>(FileManagement::FileType::AdlerJson), 19);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test FileCategory und MainFolder: Werte aus flm_service.xml
|
||||||
|
* (Global = 1, Exercise = 2, User = 3 bzw. GlobalDocuments = 1, ...).
|
||||||
|
*/
|
||||||
|
TEST(flm_enums_Generated, FileCategoryAndMainFolderValues)
|
||||||
|
{
|
||||||
|
EXPECT_EQ(static_cast<int>(FileManagement::FileCategory::Global), 1);
|
||||||
|
EXPECT_EQ(static_cast<int>(FileManagement::FileCategory::Exercise), 2);
|
||||||
|
EXPECT_EQ(static_cast<int>(FileManagement::FileCategory::User), 3);
|
||||||
|
|
||||||
|
EXPECT_EQ(static_cast<int>(FileManagement::MainFolder::GlobalDocuments), 1);
|
||||||
|
EXPECT_EQ(static_cast<int>(FileManagement::MainFolder::ExerciseDocuments), 2);
|
||||||
|
EXPECT_EQ(static_cast<int>(FileManagement::MainFolder::UserDocuments), 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test Include-Guard: mehrfaches Einbinden des generierten Headers ist erlaubt.
|
||||||
|
*/
|
||||||
|
TEST(flm_enums_Generated, MultipleIncludeGuard)
|
||||||
|
{
|
||||||
|
// Including the header multiple times should not cause errors
|
||||||
|
#include "Lts/Services/FileManagement/flm_enums.hpp"
|
||||||
EXPECT_TRUE(true);
|
EXPECT_TRUE(true);
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
/**
|
||||||
|
* @file test_flm_tests.cpp
|
||||||
|
* @brief Tests für das FLM-Modultest-Fixture (ModuleTests/flm_tests.h/.cpp)
|
||||||
|
*
|
||||||
|
* FlmTests selbst benötigt eine live Datenbank und laufende FLM-Services und
|
||||||
|
* ist als eigenes Executable flmTests angelegt (docker: make flmTests);
|
||||||
|
* flm_tests.cpp definiert main() und die Slot-Implementierungen und kann daher
|
||||||
|
* nicht in migration_tests gelinkt werden. Diese Unit-Tests sichern stattdessen
|
||||||
|
* den Compile-Vertrag des Fixtures ab: dieselben Qt5-Include-Pfade wie in
|
||||||
|
* flm_tests.h (generierte flm_*-Header, DDSConnector, ngldb) und die
|
||||||
|
* Fixture-typische DbHandler-Instanziierung mit dem generierten
|
||||||
|
* DatabaseInterface.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <FileManagement/flm_ftc.h>
|
||||||
|
#include <FileManagement/flm_dtc.h>
|
||||||
|
#include <FileManagement/flm_db.h>
|
||||||
|
#include <FileManagement/flm_db_impl_custom.h>
|
||||||
|
#include <FileManagement/flm_ftc_types.h>
|
||||||
|
|
||||||
|
#include <DDS/DDSConnector/dds_connector.h>
|
||||||
|
|
||||||
|
#include <FileManagement/logger.h>
|
||||||
|
#include <ngldb/db_service_handler.h>
|
||||||
|
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test flm_tests.h typedef'iert DbHandler = NGLDB::DbServiceHandler<DatabaseInterface>
|
||||||
|
* — diese Instanziierung muss mit dem generierten DatabaseInterface
|
||||||
|
* kompilieren (Template vollständig instanziierbar).
|
||||||
|
*/
|
||||||
|
TEST(flm_tests, DbHandlerInstantiatesWithGeneratedDatabaseInterface)
|
||||||
|
{
|
||||||
|
using DbHandler = NGLDB::DbServiceHandler<FileManagement::DatabaseInterface>;
|
||||||
|
static_assert(std::is_class<DbHandler>::value,
|
||||||
|
"NGLDB::DbServiceHandler<FileManagement::DatabaseInterface> muss eine Klasse sein");
|
||||||
|
SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test FlmTests erbt (protected) von genau diesen sechs Ftc-ReplyHandlern —
|
||||||
|
* sie müssen über <FileManagement/flm_ftc.h> vollständig vorliegen.
|
||||||
|
*/
|
||||||
|
TEST(flm_tests, FtcReplyHandlerBasesAreComplete)
|
||||||
|
{
|
||||||
|
using namespace FileManagement::Interface;
|
||||||
|
static_assert(std::is_class<Ftc::FolderModifyReplyHandler>::value, "FolderModifyReplyHandler fehlt");
|
||||||
|
static_assert(std::is_class<Ftc::FolderRemoveReplyHandler>::value, "FolderRemoveReplyHandler fehlt");
|
||||||
|
static_assert(std::is_class<Ftc::FileContentModifyReplyHandler>::value, "FileContentModifyReplyHandler fehlt");
|
||||||
|
static_assert(std::is_class<Ftc::FileContentRemoveReplyHandler>::value, "FileContentRemoveReplyHandler fehlt");
|
||||||
|
static_assert(std::is_class<Ftc::FileContentExportReplyHandler>::value, "FileContentExportReplyHandler fehlt");
|
||||||
|
static_assert(std::is_class<Ftc::GetFileContentDataReplyHandler>::value, "GetFileContentDataReplyHandler fehlt");
|
||||||
|
SUCCEED();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test Der von FlmTests::init verwendete Dtc muss die Factory-Methode
|
||||||
|
* create(const std::shared_ptr<DdsConnector>&) bereitstellen.
|
||||||
|
*/
|
||||||
|
TEST(flm_tests, DtcCreateFactorySignature)
|
||||||
|
{
|
||||||
|
static_assert(
|
||||||
|
std::is_same<std::shared_ptr<FileManagement::Interface::Dtc> (*)(
|
||||||
|
const std::shared_ptr<DDSConnector::DdsConnector> &),
|
||||||
|
decltype(&FileManagement::Interface::Dtc::create)>::value,
|
||||||
|
"Dtc::create muss (const std::shared_ptr<DdsConnector>&) -> shared_ptr<Dtc> sein");
|
||||||
|
SUCCEED();
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
/**
|
||||||
|
* @file test_flt_dtc.cpp
|
||||||
|
* @brief Verhaltenstests für die generierte FilterManagement Dtc/Ftc-Schnittstelle
|
||||||
|
*
|
||||||
|
* Diese Tests prüfen den von CODEGEN_CLIENT_TOPICS_IFC aus flt_service.xml
|
||||||
|
* generierten Header (Lts/Services/FilterManagement/flt_dtc.h bzw. flt_ftc.h)
|
||||||
|
* aus dem Build-Tree. Es darf keinen Stub-Header im Quellbaum geben.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "FilterManagement/flt_dtc.h"
|
||||||
|
#include "FilterManagement/flt_ftc.h"
|
||||||
|
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
#include <QObject>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test Der generierte Dtc muss von QObject abgeleitet sein (Signale für Topic-Updates).
|
||||||
|
*/
|
||||||
|
TEST(flt_dtc_Generated, DtcIsQObjectDerived)
|
||||||
|
{
|
||||||
|
static_assert(std::is_base_of<QObject, FilterManagement::Interface::Dtc>::value,
|
||||||
|
"generierter Dtc muss von QObject abgeleitet sein");
|
||||||
|
EXPECT_TRUE(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test Die generierten Identifier müssen dem Service-Namensschema folgen.
|
||||||
|
*/
|
||||||
|
TEST(flt_dtc_Generated, IdentifiersMatchService)
|
||||||
|
{
|
||||||
|
EXPECT_STREQ(FilterManagement::Interface::Dtc::identifier(), "FilterManagement.Interface.Dtc");
|
||||||
|
EXPECT_STREQ(FilterManagement::Interface::Ftc::identifier(), "FilterManagement.Interface.Ftc");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test Die Schnittstellen sind abstrakt und stellen die Topic-Zugriffe aus
|
||||||
|
* flt_service.xml bereit.
|
||||||
|
*/
|
||||||
|
TEST(flt_dtc_Generated, TopicInterfacesAreAbstract)
|
||||||
|
{
|
||||||
|
using DtcType = FilterManagement::Interface::Dtc;
|
||||||
|
using FtcType = FilterManagement::Interface::Ftc;
|
||||||
|
|
||||||
|
static_assert(std::is_abstract<DtcType>::value, "Dtc muss abstrakt sein");
|
||||||
|
static_assert(std::is_abstract<FtcType>::value, "Ftc muss abstrakt sein");
|
||||||
|
|
||||||
|
EXPECT_TRUE(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test Include-Guard: mehrfaches Einbinden der generierten Header ist erlaubt.
|
||||||
|
*/
|
||||||
|
TEST(flt_dtc_Generated, MultipleIncludeGuard)
|
||||||
|
{
|
||||||
|
// Including the header multiple times should not cause errors
|
||||||
|
#include "FilterManagement/flt_dtc.h"
|
||||||
|
#include "FilterManagement/flt_ftc.h"
|
||||||
|
EXPECT_TRUE(true);
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
/**
|
||||||
|
* @file test_flt_enums.cpp
|
||||||
|
* @brief Verhaltenstests für die aus flt_service.xml generierten Enums
|
||||||
|
*
|
||||||
|
* Diese Tests prüfen die Enum-Werte im generierten Header
|
||||||
|
* (Lts/Services/FilterManagement/flt_enums.hpp aus flt_enums.idl via rtiddsgen)
|
||||||
|
* gegen die Definitionen in flt_service.xml. rtiddsgen 7.7 generiert
|
||||||
|
* enum class.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Lts/Services/FilterManagement/flt_enums.hpp"
|
||||||
|
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test DummyEnum: laut flt_service.xml gilt val1 = 1 und val2 = 2.
|
||||||
|
*/
|
||||||
|
TEST(flt_enums_Generated, DummyEnumValues)
|
||||||
|
{
|
||||||
|
EXPECT_EQ(static_cast<int>(FilterManagement::DummyEnum::val1), 1);
|
||||||
|
EXPECT_EQ(static_cast<int>(FilterManagement::DummyEnum::val2), 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @test Include-Guard: mehrfaches Einbinden des generierten Headers ist erlaubt.
|
||||||
|
*/
|
||||||
|
TEST(flt_enums_Generated, MultipleIncludeGuard)
|
||||||
|
{
|
||||||
|
// Including the header multiple times should not cause errors
|
||||||
|
#include "Lts/Services/FilterManagement/flt_enums.hpp"
|
||||||
|
EXPECT_TRUE(true);
|
||||||
|
}
|
||||||
@@ -50,8 +50,11 @@ TEST(Qt6ApiMigrations, QStringViewBasic)
|
|||||||
QStringView subView = view.mid(6, 4); // "Qt6 "
|
QStringView subView = view.mid(6, 4); // "Qt6 "
|
||||||
EXPECT_EQ(subView.toString(), QStringLiteral("Qt6 "));
|
EXPECT_EQ(subView.toString(), QStringLiteral("Qt6 "));
|
||||||
|
|
||||||
// Test that view doesn't allocate memory
|
// Test that view doesn't allocate memory: QStringView is a non-owning
|
||||||
EXPECT_EQ(view.data(), original.data());
|
// view onto the original's buffer. Note: the non-const QString::data()
|
||||||
|
// detaches the shared QString (copy-on-write) and would move the buffer,
|
||||||
|
// so the comparison has to use the const overload (constData()).
|
||||||
|
EXPECT_EQ(view.data(), original.constData());
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test 2: QStringView with function parameters
|
// Test 2: QStringView with function parameters
|
||||||
|
|||||||
Reference in new issue
Block a user