Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions Tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ option(FILE_UNLINK_TEST "File unlink test" OFF)
option(REDIRECT_TEST "Test stream redirection" OFF)
option(MESSAGEBUFFER_TEST "Test message buffer" OFF)
option(UNRAVELLER "reveal thread details" OFF)
option(ENABLE_TEST_RUNTIME "Build Thunder test support library for plugin integration tests" OFF)

if(BUILD_TESTS)
add_subdirectory(unit)
Expand Down Expand Up @@ -40,4 +41,8 @@ endif()

if(UNRAVELLER)
add_subdirectory(unraveller)
endif()

if(ENABLE_TEST_RUNTIME)
add_subdirectory(test_support)
Copy link

Copilot AI Apr 15, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ENABLE_TEST_RUNTIME can currently be enabled on any platform, but Tests/test_support/ThunderTestRuntime.cpp uses POSIX-only APIs (mkdtemp) and hardcoded /tmp paths. Consider adding a platform guard here (e.g., only add the test_support subdirectory on POSIX platforms, or emit a fatal error if the option is ON on unsupported systems) to avoid configuration/build failures.

Suggested change
add_subdirectory(test_support)
if(UNIX)
add_subdirectory(test_support)
else()
message(FATAL_ERROR "ENABLE_TEST_RUNTIME is only supported on POSIX/UNIX platforms because Tests/test_support uses POSIX-only APIs.")
endif()

Copilot uses AI. Check for mistakes.
endif()
122 changes: 122 additions & 0 deletions Tests/test_support/CMakeLists.txt
Comment thread
bramoosterhuis marked this conversation as resolved.
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
# If not stated otherwise in this file or this component's license file the
# following copyright and licenses apply:
#
# Copyright 2024 RDK Management
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# ============================================================================
# thunder_test_support - Static library for Thunder plugin integration testing
#
# This library embeds the Thunder PluginHost server (PluginServer, Controller,
# SystemInfo, etc.) into a static archive so that GTest-based test binaries
# can spin up a real Thunder runtime in-process without launching the
# standalone Thunder daemon.
#
# Usage:
# 1. Link your test executable against thunder_test_support.
# 2. Use ThunderTestRuntime::Initialize() to start the embedded server.
# 3. Call JSON-RPC or COM-RPC methods directly against loaded plugins.
# 4. Call ThunderTestRuntime::Shutdown() when done.
#
# NOTE: PluginHost.cpp is deliberately excluded — it contains main().
# The test binary provides its own main() via GTest.
# ============================================================================

find_package(Threads REQUIRED)

set(THUNDER_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../Source/Thunder")

set(THREADPOOL_COUNT "4" CACHE STRING "The number of threads in the thread pool for test runtime")
Copy link

Copilot AI Apr 15, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

THREADPOOL_COUNT is already defined as a CACHE variable in Source/Thunder/CMakeLists.txt, and this set(... CACHE ...) in a subdirectory will reuse/overwrite the same cache entry (including its help text). To avoid confusing cache UI/help strings, consider not re-declaring it here and just consuming the existing cache variable (or use a uniquely named cache var specific to test support).

Suggested change
set(THREADPOOL_COUNT "4" CACHE STRING "The number of threads in the thread pool for test runtime")
if(NOT DEFINED THREADPOOL_COUNT)
set(THREADPOOL_COUNT "4")
endif()

Copilot uses AI. Check for mistakes.

add_library(thunder_test_support STATIC
ThunderTestRuntime.cpp
Module.cpp
${THUNDER_SOURCE_DIR}/PluginServer.cpp
${THUNDER_SOURCE_DIR}/Controller.cpp
${THUNDER_SOURCE_DIR}/SystemInfo.cpp
${THUNDER_SOURCE_DIR}/PostMortem.cpp
${THUNDER_SOURCE_DIR}/Probe.cpp
)

# PluginHost.cpp is deliberately excluded — it contains main().
# The test binary supplies its own main via GTest/GMock.

target_compile_definitions(thunder_test_support
PRIVATE
NAMESPACE=${NAMESPACE}
APPLICATION_NAME=ThunderTestRuntime
MODULE_NAME=ThunderTestRuntime
Copy link

Copilot AI Apr 15, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

MODULE_NAME is set both via target_compile_definitions(... MODULE_NAME=ThunderTestRuntime) and again via #define MODULE_NAME ThunderTestRuntime in Tests/test_support/Module.cpp. This can trigger macro redefinition warnings and also forces the module name for all compiled Thunder server sources in this archive. Prefer defining MODULE_NAME only in the dedicated Module.cpp (and drop the compile definition here), similar to how the main Thunder target sets APPLICATION_NAME/THREADPOOL_COUNT but not MODULE_NAME.

Suggested change
MODULE_NAME=ThunderTestRuntime

Copilot uses AI. Check for mistakes.
THREADPOOL_COUNT=${THREADPOOL_COUNT}
)

target_compile_options(thunder_test_support PRIVATE -Wno-psabi)

target_link_libraries(thunder_test_support
PRIVATE
CompileSettings::CompileSettings
)

if(EXCEPTION_CATCHING)
set_source_files_properties(${THUNDER_SOURCE_DIR}/PluginServer.cpp PROPERTIES COMPILE_FLAGS "-fexceptions")
endif()

target_include_directories(thunder_test_support
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}
PRIVATE
${THUNDER_SOURCE_DIR}
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/Source/plugins/generated/jsonrpc>
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/Source/Thunder/generated>
)

target_link_libraries(thunder_test_support
PUBLIC
${NAMESPACE}Core::${NAMESPACE}Core
${NAMESPACE}Cryptalgo::${NAMESPACE}Cryptalgo
${NAMESPACE}COM::${NAMESPACE}COM
${NAMESPACE}Messaging::${NAMESPACE}Messaging
${NAMESPACE}WebSocket::${NAMESPACE}WebSocket
${NAMESPACE}Plugins::${NAMESPACE}Plugins
${NAMESPACE}COMProcess::${NAMESPACE}COMProcess
Threads::Threads
)

if(WARNING_REPORTING)
target_sources(thunder_test_support PRIVATE ${THUNDER_SOURCE_DIR}/WarningReportingCategories.cpp)
endif()

if(PROCESSCONTAINERS)
target_link_libraries(thunder_test_support
PUBLIC
${NAMESPACE}ProcessContainers::${NAMESPACE}ProcessContainers)
target_compile_definitions(thunder_test_support
PUBLIC
PROCESSCONTAINERS_ENABLED=1)
endif()

if(HIBERNATESUPPORT)
target_link_libraries(thunder_test_support PUBLIC
${NAMESPACE}Hibernate::${NAMESPACE}Hibernate)
target_compile_definitions(thunder_test_support PUBLIC
HIBERNATE_SUPPORT_ENABLED=1)
endif()

# --- Install rules ---
install(TARGETS thunder_test_support
ARCHIVE DESTINATION lib
)

install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/ThunderTestRuntime.h
DESTINATION include/thunder_test_support
)
Comment on lines +134 to +140
Copy link

Copilot AI Apr 9, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Install rules hardcode lib/include instead of using GNUInstallDirs variables (${CMAKE_INSTALL_LIBDIR}, ${CMAKE_INSTALL_INCLUDEDIR}) used elsewhere in the project. Using the standard variables improves portability across distros/multilib layouts.

Copilot uses AI. Check for mistakes.
Comment on lines +68 to +140
Copy link

Copilot AI Apr 15, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The docs and this CMake target describe consumers linking against the thunder_test_support CMake target to pick up INTERFACE whole-archive link options, but the install rules here only install the .a and header—there is no target export / CMake package config for thunder_test_support, and the include dirs also lack an INSTALL_INTERFACE. If this library is intended for external consumers via find_package, it should be exported and install-interface include dirs should be set; otherwise the docs should avoid implying the imported target exists / carries link options.

Copilot uses AI. Check for mistakes.
29 changes: 29 additions & 0 deletions Tests/test_support/Module.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
/*
* Copyright 2024 RDK Management
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

// Module definition for the thunder_test_support static library.
// MODULE_NAME is set to ThunderTestRuntime via -D in CMakeLists.txt,
// which overrides Source/Thunder/Module.h's default of "Application".
// This ensures all server sources and the MODULE_NAME_DECLARATION below
// use the same symbol, and trace output shows "ThunderTestRuntime".

#ifndef MODULE_NAME
#define MODULE_NAME ThunderTestRuntime
#endif

#include <core/core.h>

MODULE_NAME_DECLARATION(BUILD_REFERENCE)
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thunder has a macro for static archives — MODULE_NAME_ARCHIVE_DECLARATION. Using it in Module.cpp instead of MODULE_NAME_DECLARATION(BUILD_REFERENCE) avoids conflicting definitions of ModuleBuildRef(), GetModuleServices() and SetModuleServices() with the consumer's own MODULE_NAME_DECLARATION. It also removes the need for the #ifndef guard here.

#define MODULE_NAME ThunderTestRuntime
#include <core/core.h>
MODULE_NAME_ARCHIVE_DECLARATION

Loading
Loading