# Final report — merge `lts-viewer-validation-testing-phase` into `qt6-migration-basis-modules-merge` **Status: VALIDATED** (builds 100% green in all 3 Docker runs; runs 1–2 ctest fully green; run 3 ctest 558/585 with the 6 non-passing tests all classified as base-state first-run results, documented below with evidence). Not pushed. ## Merge commit - Hash: `9c1ac7cbef95efbe2bdc68d1b9c067a30493846d` (`9c1ac7cbe`) - Branch: `feature/qt6-migration-basis-modules-merge-viewer-validation` - Parents: `36f077bce` (ours, `feature/qt6-migration-basis-modules-merge`) + `c664611b8` (theirs, `feature/lts-viewer-validation-testing-phase`) - Author = committer: `berrux_dev `, single author, no attribution lines - Signed: `Good "git" signature` (SSH ED25519, `SHA256:5vtoTt8IqQ8+OcyNHbg8w4aGQD8H0IvoGM3PYgD9RYU`), created via explicit `git commit -S` (repo has `commit.gpgsign=false`) - 30 files, +375/−246; working tree clean after commit ## Per-conflicted-file resolution | File | Method | Reason | |---|---|---| | `qt6-after/qt6-migrated-legatus/new_docker_build.sh` | **union** (prompt merge recipe) | theirs added viewer-only/codification/prebuilt-image/`--cmake_build_flags` options; ours had the GROUP1–5 target sets — union keeps both, single Group-4 build call | No other conflicts (all remaining files auto-merged). ## `new_docker_build.sh` merge evidence - **Ours-side target set intact**: `GROUP3_TARGETS` (application + service targets) preserved; `GROUP4_TARGETS` contains the DDS tests (`ddsGenericDataTests`, `ddsDataTopicTests`, `ddsFunctionTopicTests`) plus all Proxies (BSM/VWM incl. `BuildingControlTestBsm`/`TestVwm`/`TestVwmXml`, TrainingAreaBase, TrainingAreaBaseOC incl. `serialtest`, WLS `svcWirelessLocationSystem` + `wlsJsonClientTest`, CMO/CNR) with explanatory comments for excluded targets (BuildingControlJson/Qt6WebSockets, UAS-only targets) - **Theirs-side features present**: `--build-viewer-only` (skips Groups 1–4, implies `--group5 --codification`), `--codification`, `--group1..5/--no-*`, KDReports-qt6 support, prebuilt image name `legatus-qt6-prebuilt:latest` (6 occurrences: default + 4 usage examples + `DOCKER_IMAGE` fallback) - **Post-resolution checks**: usage text lists all options incl. `--cmake_build_flags FLAGS`; single Group-4 invocation (`run_build_group "Group 4 (DDS tests + Proxies)" ...`); `--cmake_build_flags` implemented end-to-end (parse → `CMAKE_BUILD_FLAGS` → env → docker `-e` → cmake `${CMAKE_BUILD_FLAGS:-}`) and exercised successfully in run 3 ## Deletion-guard sweep Files deleted on ours side since merge base: **none present at merge HEAD** (no restorations). Files deleted on theirs side since merge base: **none present at merge HEAD**. Deleted on both sides: **0**. (Merge adds zero files vs ours: `git diff --diff-filter=A HEAD^1 HEAD` empty.) ## Legacy comparison audit (`qt5-before/qt5-legatus-legacy`) 28 of 30 files have a legacy counterpart; `new_docker_build.sh` and `cmake/FindKDReports.cmake` are pipeline-new (no counterpart). Hunk counts (legacy → merged, incl. prior migration already in both branch histories): | hunks | file | hunks | file | |---|---|---|---| | 9 | `CMakeLists.txt` (root) | 2 | `BSM/bsm_telegrams_base.cpp` | | 3 | `LtsSession/CMakeLists.txt` | 3 | `BSM/bsm_telegrams_direct_fire.cpp` | | 2 | `LtsSession/lts_session.cpp` | 3 | `WLS/ism_handler.cpp` | | 2 | `LtsSession/lts_session_data_dds.cpp` | 12 | `WLS/web_socket_handler.cpp` | | 1 | `LtsSession/lts_session_data_dds.h` | 16 | `WLS/wls_handler.cpp` | | 1 | `DdsUnitTests/function_topic_tests.h` | 15 | `WLS/wls_participant.cpp` | | 2 | `BSM/CMakeLists.txt` | 3 | `WLS/wls_participant_handler.cpp` | | 3 | `BSM/bsm_api.cpp` | 1 | `Viewer/CMakeLists.txt` | | 6 | `BSM/bsm_socket.cpp` | 3 | `LtsDataView/CMakeLists.txt` | | 15 | `BSM/bsm_socket_handler.cpp` | 2 | `LtsDataView/test.cpp` | | 2 | `LtsFileDialog/CMakeLists.txt` | 7 | `LtsFileDialog/lts_dialog_model_file.cpp` | | 2 | `LtsFileDialog/lts_file_dialog.cpp` | 12 | `LtsFileDialog/lts_dialog_model_folder.cpp` | | 8 | `LtsFileDialog/lts_file_dialog_widget.cpp` | 2 | `LtsFileDialog/lts_file_dialog_widget.h` | | 2 | `LtsFileDialog/test.cpp` | 23 | `cmake/NGLMacros.cmake` | **Categories**: the overwhelming majority of hunks are the mechanical Qt5→Qt6 / rtiddsgen migration (include rewrites, `QString` conversions, enum/optional/sequence APIs, RTI target naming) already established in the branch histories. **Semantic-change hunks — all in the folded-in fixes, each justified:** 1. `FileManagement::Interface::DataModification` → global `DataModification` (generated code removed the qualifier; invalid qualifier is a hard error) 2. `setDeleted(true)` / accessor calls on generated types → plain member access (`data.isDeleted = true`, `data.id`, `fl.name`…) — generated RTI IDL types are plain structs (established pattern, cf. commented legacy code in `ism_tests.cpp`) 3. `Folder::mainFolder()` / `FileManagement::toInt` → `static_cast(path[0])` (legacy API gone; generated `Folder` carries the main folder in `path[0]`) 4. Dtc bulk-iteration overload removed → per-item `std::function` with explicit type (disambiguates void/bool overloads) and `return false` (bool overload = iterateUntil: true would stop iteration) 5. Qt6 removed implicit conversions → `QString::fromStdString`, `QVariant` from integral types, `arg(static_cast(enum))` 6. `omg::types::optional` has no comparison operators → `!opt.has_value() || opt.value() != x` 7. `LtsSession::PartitionType` deleted → `IDL::PartitionType` (matches `DdsConnector::getPartitionType()` return type); dead `toIdlPartitionType`/`toPartitionType` converters removed 8. `lts_session.cpp` include guard `BUILD_FILTERMANAGEMENT` → `BUILD_RTI` (`dynamic_pointer_cast` needs the complete type only in the RTI path); `ddscore` + `RTI::nddscore` added to LtsSession link (no bare `nddscore` alias exists; generated `Core::PartitionTime` type support lives in `libddscore.so`) 9. Missing includes surfaced by first builds: `` (WLS×5, BSM×5), `` (BSM), `NGL::INGLLogger& m_logger` member (`function_topic_tests.h`, compile-only) ## Files changed beyond the conflicted set 23 files beyond the 7 theirs-side merge files (`CMakeLists.txt` root, `Viewer/CMakeLists.txt`, `LtsDataView/{CMakeLists.txt,test.cpp}`, `FindKDReports.cmake`, `NGLMacros.cmake`, `new_docker_build.sh`) — all folded-in fixes per the user's "Fix, fold into merge commit" decision, grouped: LtsSession (4), DdsUnitTests (1), BSM (6), WLS (5), LtsFileDialog sources (7). Each blocked a validation run with a hard compile/link error (pre-existing defects, not merge regressions). ## CTest registration union - Run 1: 584 tests. Run 2 (viewer-only): 34 (subset). Run 3: 585 = run 1's 584 + `wls_json_client_test` (registered only with `-DBUILD_WLS=ON`, run 3 only). No loss of registrations; theirs-side additions all present. - `LtsDataViewTest`: registered with the auto-exit property (CI `QTimer` 1000 ms, offscreen, `TIMEOUT 30`); **Passed** in run 2 (1.04 s) and run 3 (1.13 s) — the theirs-side validation pattern works. - `LtsFileDialogTest`: registered (same auto-exit pattern); built and executed in run 3, timed out at DDS init (see remaining items). ## Docker and Jenkins CI - Docker: `new_docker_build.sh` now supports prebuilt-image build/use/delete + `--cmake_build_flags`; KDReports-qt6 2.3.95 only available in the prebuilt image → runs 2/3 used `--use-prebuilt-image --docker-image legatus-qt6-prebuilt:latest` (run 1 used the base `ubuntu:26.04` image with in-container Qt install, no KDReports — documented deviation). - Jenkins: `jenkins/Jenkinsfile` unchanged by this merge (CI RPM build pipeline). **Recorded pre-existing signature blocker**: since merge base `ed9fc51e7`, branch scan shows 20 signed / **33 unsigned** ancestor commits (e.g. `36f077bce`, `b6a97c39e`, `fd3e5e838`) — the signature gate would fail on pre-existing history. The new merge commit itself verifies **Good** (`%G?` = G). ## Qt5 references No active Qt5 references. All 11 matches in the 30 changed files are benign: comments in root `CMakeLists.txt` (incl. a stale "fallback to Qt5" comment — no `find_package(Qt5...)` exists anywhere; the code searches Qt6 only, and "Qt5Compat" is a Qt6 module), the `qt5compat` aqtinstall package name (= Qt6 Qt5Compat module) in `new_docker_build.sh`, and "Qt6 only – no Qt5 fallback" in `FindKDReports.cmake`. ## Confirmations - **Removed modules not restored**: merge adds no files vs ours side (deletion sweep + `--diff-filter=A` both empty) - **LogViewer preserved**: 31 files under `Lts/Tools/LogViewer/` at HEAD, untouched by the merge - **`docker_build.sh` stayed deleted**: absent from the tree (only `new_docker_build.sh` exists) ## Exact validation commands and results All runs: `BUILD_RTI=ON BUILD_GRANTLEE=ON`, repo `qt6-after/qt6-migrated-legatus`, container build dir `build4` (incremental). 1. **Run 1** — `./new_docker_build.sh` (default groups 1–3, base image): build **100% green**; ctest **584 tests: 554 passed, 30 Not Run (expected duplicate/registration class), 0 Failed/Timeout**. Grantlee active (`CppTopicGeneratorGrantleeTest` passed). KDReports not found in base image → ReportViewer GUI plugin skip (expected; deviation documented). 2. **Run 2** — `./new_docker_build.sh --build-viewer-only --use-prebuilt-image --docker-image legatus-qt6-prebuilt:latest`: build **100% green**; ctest **34 tests: 1 passed (`LtsDataViewTest`, 1.04 s), 33 Not Run by viewer-only design, 0 Failed/Timeout**. `LtsFileDialogTest` Not Run (executable not in the Group-5 build list at that point — added by the folded-in fix; run 3 built and ran it). 3. **Run 3** — `./new_docker_build.sh --group4 --group5 --codification --use-prebuilt-image --docker-image legatus-qt6-prebuilt:latest --cmake_build_flags "-DUSE_IPO=ON -DUSE_UNITY_BUILD=ON -DGUEZ_MODE=ON -DBUILD_WLS=ON -DPostgreSQL_TYPE_INCLUDE_DIR=/usr/include/postgresql/"`: build **100% green** (14 attempts, each fixing one layer: WLS → LtsSessionDataDds compile → ddscore link → lts_session.cpp → RTI::nddscore link → LtsFileDialog module ×3); ctest **585 tests: 558 passed (95.4%), 21 Not Run (expected class), 3 Failed + 3 Timeout** (the 6 items below). Their-side validation evidence in run 3: `LtsDataViewTest Passed 1.13 s`, `wls_json_client_test Passed 0.18 s`, `ddsGenericDataTests`/`ddsDataTopicTests` Passed, all ZProxiesIntegration Passed. ## Remaining blockers / risks (all base-state, none merge regressions) | Test | Result | Evidence | |---|---|---| | `ddsFunctionTopicTests` | Failed (32 s) | **Deterministic** on standalone container re-run (4 passed/2 failed; `spyRequest.count()` 2 vs 1, `spyReply.count()` 1 vs 2) — FTS/FTC signal-count defect in base state; the merge touched no FTS/FTC implementation (`function_topic_tests.h` change is a compile-only logger member) | | `bld_bsm_test` | Timeout | waits for a BSM device on `localhost:10001` (`app.exec()` in `bsm_test_main.cpp`) — no hardware in container | | `taboc_serialtest` | Timeout | waits for serial hardware — not present in container | | `bld_vwm_test`, `bld_vwm_xml_test` | Failed | require manual-test data `bldg_7_building_config.xml`, which is not in the repo or build tree (manual `.sh` test scripts) | | `LtsFileDialogTest` | Timeout | interactive GUI that blocks on DDS init before `app.exec()`, so the 1 s CI auto-exit `QTimer` never fires in the headless container | All six: `add_test` registrations exist at HEAD, and `git diff HEAD MERGE_HEAD` shows the theirs-side branch changed none of these registrations — they were Not Run in run 1 (executables never built in this pipeline before), so these are first-run results on base-state code. **Other documented pre-existing items**: - `Lts/Common/LtsSession/lts_session_data_dds.{h,cpp}` stub branch (`#else // !BUILD_RTI`) still uses the old `PartitionType` spellings — never compiled under `BUILD_RTI=ON` (left as-is; would need the same `IDL::PartitionType` migration if `BUILD_RTI=OFF` is ever validated) - `Lts/Plugins/ReportManagement/Gui/ReportViewer` plugin skipped in all runs: KDChart (and legacy-name KDReports) not available in the container image (LtsReportDisplay itself built fine against KDReports-qt6) - Duplicate `_gtest` `add_test` registrations (e.g. `ddsFunctionTopicTests_gtest`) point at non-existent executables → Not Run; pre-existing CMake duplication - The 33 unsigned ancestor commits (signature gate blocker, see above)