#
# Copyright(c) 2006 to 2022 ZettaScale Technology and others
#
# This program and the accompanying materials are made available under the
# terms of the Eclipse Public License v. 2.0 which is available at
# http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License
# v. 1.0 which is available at
# http://www.eclipse.org/org/documents/edl-v10.php.
#
# SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
#
include(CUnit)
include(Generate)
idlc_generate(TARGET RoundTrip FILES RoundTrip.idl)
idlc_generate(TARGET Space FILES Space.idl WARNINGS no-implicit-extensibility)
idlc_generate(TARGET TypesArrayKey FILES TypesArrayKey.idl WARNINGS no-implicit-extensibility)
idlc_generate(TARGET WriteTypes FILES WriteTypes.idl WARNINGS no-implicit-extensibility)
idlc_generate(TARGET InstanceHandleTypes FILES InstanceHandleTypes.idl WARNINGS no-implicit-extensibility)
idlc_generate(TARGET RWData FILES RWData.idl WARNINGS no-implicit-extensibility)
idlc_generate(TARGET CreateWriter FILES CreateWriter.idl WARNINGS no-implicit-extensibility)
idlc_generate(TARGET DataRepresentationTypes FILES DataRepresentationTypes.idl WARNINGS no-implicit-extensibility)
idlc_generate(TARGET MinXcdrVersion FILES MinXcdrVersion.idl)
idlc_generate(TARGET CdrStreamOptimize FILES CdrStreamOptimize.idl WARNINGS no-implicit-extensibility)
idlc_generate(TARGET CdrStreamSkipDefault FILES CdrStreamSkipDefault.idl)
idlc_generate(TARGET CdrStreamKeySize FILES CdrStreamKeySize.idl)
idlc_generate(TARGET CdrStreamKeyExt FILES CdrStreamKeyExt.idl)
idlc_generate(TARGET CdrStreamChecking FILES CdrStreamChecking.idl)
idlc_generate(TARGET CdrStreamWstring FILES CdrStreamWstring.idl)
idlc_generate(TARGET CdrStreamParamHeader FILES CdrStreamParamHeader.idl)
idlc_generate(TARGET CdrStreamSerDes FILES CdrStreamSerDes.idl NO_TYPE_INFO WARNINGS no-enum-consecutive)
idlc_generate(TARGET CdrStreamXcdr1Opt FILES CdrStreamXcdr1Opt.idl)
idlc_generate(TARGET SerdataData FILES SerdataData.idl)
idlc_generate(TARGET PsmxDataModels FILES PsmxDataModels.idl WARNINGS no-implicit-extensibility)
idlc_generate(TARGET CdrStreamDataTypeInfo FILES CdrStreamDataTypeInfo.idl WARNINGS no-implicit-extensibility)
idlc_generate(TARGET Array100 FILES Array100.idl WARNINGS no-implicit-extensibility)
idlc_generate(TARGET DynamicData FILES DynamicData.idl WARNINGS no-implicit-extensibility)
if(ENABLE_TYPELIB)
idlc_generate(TARGET XSpace FILES XSpace.idl XSpaceEnum.idl XSpaceMustUnderstand.idl XSpaceTypeConsistencyEnforcement.idl WARNINGS no-implicit-extensibility no-inherit-appendable)
idlc_generate(TARGET XSpaceNoTypeInfo FILES XSpaceNoTypeInfo.idl NO_TYPE_INFO WARNINGS no-implicit-extensibility)
idlc_generate(TARGET TypeBuilderTypes FILES TypeBuilderTypes.idl WARNINGS no-implicit-extensibility no-inherit-appendable)
idlc_generate(TARGET DynamicTypeTypes FILES DynamicTypeTypes.idl)
endif()
set(ddsc_test_sources
"asymdisconnect.c"
"basic.c"
"builtin_topics.c"
"cdr.c"
"config.c"
"data_avail_stress.c"
"data_on_readers.c"
"destorder.c"
"discstress.c"
"dispose.c"
"domain.c"
"domain_torture.c"
"entity_api.c"
"entity_hierarchy.c"
"entity_status.c"
"err.c"
"filter.c"
"instance_get_key.c"
"instance_handle.c"
"listener.c"
"liveliness.c"
"loan.c"
"multi_sertype.c"
"nwpart.c"
"participant.c"
"pp_lease_dur.c"
"psmx.c"
"psmxif.c"
"publisher.c"
"qos.c"
"qosmatch.c"
"qos_set_match.c"
"querycondition.c"
"guardcondition.c"
"matchstress.c"
"readcollect.c"
"readcondition.c"
"reader.c"
"reader_iterator.c"
"read_instance.c"
"redundantnw.c"
"register.c"
"spdp.c"
"subscriber.c"
"take_instance.c"
"time.c"
"time_based_filter.c"
"topic.c"
"topic_find_local.c"
"transientlocal.c"
"types.c"
"uninitialized.c"
"unregister.c"
"unsupported.c"
"userdata.c"
"waitset.c"
"waitset_torture.c"
"whc.c"
"write.c"
"write_various_types.c"
"writer.c"
"test_util.c"
"test_util.h"
"test_common.h"
"test_common.c"
"test_oneliner.c"
"test_oneliner.h"
"cdrstream.c"
"serdata_keys.c"
)
if(ENABLE_LIFESPAN)
list(APPEND ddsc_test_sources "lifespan.c")
endif()
if(ENABLE_DEADLINE_MISSED)
list(APPEND ddsc_test_sources "deadline.c")
endif()
if(ENABLE_TYPELIB)
list(APPEND ddsc_test_sources
"xtypes_common.c"
"xtypes_common.h"
"xtypes_typeinfo.c"
"data_representation.c"
"typebuilder.c"
"dynamic_type.c"
)
endif()
if(ENABLE_TYPE_DISCOVERY)
list(APPEND ddsc_test_sources
"xtypes_typelookup.c"
"xtypes_assignability.c")
endif()
if(ENABLE_TOPIC_DISCOVERY)
list(APPEND ddsc_test_sources
"topic_discovery.c"
"topic_find_global.c")
endif()
if(ENABLE_QOS_PROVIDER)
list(APPEND ddsc_test_sources
"qos_provider.c")
endif()
add_cunit_executable(cunit_ddsc ${ddsc_test_sources})
if(MSVC)
# ignore warning 5286 and 5287 about enum type conversion
target_compile_options(cunit_ddsc PRIVATE /wd5286 /wd5287)
endif()
target_include_directories(
cunit_ddsc PRIVATE
"$"
"$"
"$"
"$"
"$"
"$"
"$")
target_link_libraries(cunit_ddsc PRIVATE
RoundTrip
Space
TypesArrayKey
WriteTypes
InstanceHandleTypes
RWData
CreateWriter
DataRepresentationTypes
MinXcdrVersion
CdrStreamOptimize
CdrStreamSkipDefault
CdrStreamDataTypeInfo
CdrStreamChecking
CdrStreamWstring
CdrStreamParamHeader
CdrStreamSerDes
CdrStreamXcdr1Opt
PsmxDataModels
psmx_dummy
psmx_dummy_v0
DynamicData
Array100
CdrStreamKeySize
CdrStreamKeyExt
SerdataData
ddsc
)
if(ENABLE_TYPELIB)
target_link_libraries(cunit_ddsc PRIVATE
XSpace XSpaceNoTypeInfo TypeBuilderTypes DynamicTypeTypes)
endif()
# Setup environment for config-tests
get_test_property(CUnit_ddsc_config_simple_udp ENVIRONMENT CUnit_ddsc_config_simple_udp_env)
set(CUnit_ddsc_config_simple_udp_file "${CMAKE_CURRENT_LIST_DIR}/config_simple_udp.xml")
set(CUnit_ddsc_config_simple_udp_uri "file://${CUnit_ddsc_config_simple_udp_file}")
set(CUnit_ddsc_config_simple_udp_max_participants "0")
set(CUnit_ddsc_config_simple_udp_env "CYCLONEDDS_URI=${CUnit_ddsc_config_simple_udp_uri};MAX_PARTICIPANTS=${CUnit_ddsc_config_simple_udp_max_participants};${CUnit_ddsc_config_simple_udp_env}")
set_tests_properties(
CUnit_ddsc_config_simple_udp
PROPERTIES
REQUIRED_FILES ${CUnit_ddsc_config_simple_udp_file}
ENVIRONMENT "${CUnit_ddsc_config_simple_udp_env}")
configure_file("deadline_update.h.in" "deadline_update.h")
configure_file("build_options.h.in" "build_options.h")
configure_file("config_env.h.in" "config_env.h" @ONLY)
########################################################################
# Enfore serial execution for some tests #
# #
# Serialize some really problematic tests: those relying on unreliable #
# communication and the deadline tests with their tight timing #
########################################################################
foreach(t async_one_unrel_sample relwr_unrelrd_network)
set_tests_properties(CUnit_ddsc_write_${t} PROPERTIES RUN_SERIAL TRUE)
endforeach()
if(ENABLE_DEADLINE_MISSED)
foreach(t
basic
instances
update
writer_types)
set_tests_properties(CUnit_ddsc_deadline_${t} PROPERTIES RUN_SERIAL TRUE)
endforeach()
endif()
#########################
# "oneliner" executable #
#########################
add_executable(oneliner
"oneliner.c"
"test_oneliner.c"
"test_oneliner.h"
"test_util.c"
"test_util.h")
target_include_directories(
oneliner PRIVATE
"$"
"$"
"$"
"$"
"$")
target_link_libraries(oneliner PRIVATE RoundTrip Space ddsc)
##############################################################
# PSMX implementation with Cyclone as transport, for testing #
# PSMX dummy implementation, for interface testing #
##############################################################
idlc_generate(TARGET psmx_cdds_data FILES psmx_cdds_data.idl)
set(psmx_cdds_sources
"psmx_cdds_impl.c"
"psmx_cdds_impl.h")
set(psmx_dummy_sources
"psmx_dummy_impl.c"
"psmx_dummy_impl.h"
"psmx_dummy_public.h")
set(psmx_dummy_v0_sources
"psmx_dummy_v0_impl.c"
"psmx_dummy_v0_impl.h"
"psmx_dummy_v0_public.h")
set(psmx_includes
"$"
"$"
"$"
"$"
"$")
if(BUILD_SHARED_LIBS)
add_library(psmx_cdds SHARED ${psmx_cdds_sources})
add_library(psmx_dummy SHARED ${psmx_dummy_sources})
add_library(psmx_dummy_v0 SHARED ${psmx_dummy_v0_sources})
else()
list(APPEND psmx_includes
"$"
"$"
"$"
"$")
add_library(psmx_cdds OBJECT ${psmx_cdds_sources} psmx_cdds_data.c)
set_property(GLOBAL APPEND PROPERTY cdds_plugin_list psmx_cdds)
set_property(GLOBAL PROPERTY psmx_cdds_symbols cdds_create_psmx)
add_library(psmx_dummy OBJECT ${psmx_dummy_sources})
set_property(GLOBAL APPEND PROPERTY cdds_plugin_list psmx_dummy)
set_property(GLOBAL PROPERTY psmx_dummy_symbols dummy_create_psmx)
add_library(psmx_dummy_v0 OBJECT ${psmx_dummy_v0_sources})
set_property(GLOBAL APPEND PROPERTY cdds_plugin_list psmx_dummy_v0)
set_property(GLOBAL PROPERTY psmx_dummy_v0_symbols dummy_v0_create_psmx)
endif()
generate_export_header(psmx_cdds BASE_NAME PSMX_CDDS EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/include/dds/psmx_cdds/export.h")
generate_export_header(psmx_dummy BASE_NAME PSMX_DUMMY EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/include/dds/psmx_dummy/export.h")
generate_export_header(psmx_dummy_v0 BASE_NAME PSMX_DUMMY EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/include/dds/psmx_dummy_v0/export.h")
foreach(plugin psmx_cdds psmx_dummy psmx_dummy_v0)
target_include_directories(${plugin} PRIVATE ${psmx_includes})
endforeach()
if(BUILD_SHARED_LIBS)
target_link_libraries(psmx_cdds PRIVATE ddsc psmx_cdds_data)
target_link_libraries(psmx_dummy PRIVATE ddsc)
target_link_libraries(psmx_dummy_v0 PRIVATE ddsc)
else()
install(
TARGETS psmx_cdds psmx_dummy psmx_dummy_v0
EXPORT "${PROJECT_NAME}"
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
endif()
################################################################################
# If Iceoryx / Iceoryx2 is available, then also run all PSMX tests using them. #
# Colcon complicates things too much and it doesn't affect Cyclone's #
# CI run anyway. #
################################################################################
get_property(test_names DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY TESTS)
list(FILTER test_names INCLUDE REGEX "^CUnit_ddsc_psmx_[A-Za-z_0-9]+$")
# Iceoryx2
if(ENABLE_ICEORYX2 AND NOT DEFINED ENV{COLCON})
if(BUILD_SHARED_LIBS)
foreach(fullname ${test_names})
string(REGEX REPLACE "^CUnit_ddsc_psmx_(.*)" "\\1" shortname "${fullname}")
add_test(NAME ${fullname}_iox2 COMMAND cunit_ddsc -s ddsc_psmx -t ${shortname})
set_tests_properties(${fullname}_iox2 PROPERTIES ENVIRONMENT "CDDS_PSMX_NAME=iox2;LD_LIBRARY_PATH=$:$ENV{LD_LIBRARY_PATH}")
endforeach()
else()
# Rewire the default set of tests to use Iceoryx2 instead of adding Iceoryx2 variants
foreach(fullname ${test_names})
set_tests_properties(${fullname} PROPERTIES ENVIRONMENT "CDDS_PSMX_NAME=iox2")
endforeach()
endif()
endif()
# Iceoryx
if(ENABLE_ICEORYX AND NOT DEFINED ENV{COLCON})
# We need to start RouDi, so we need to find it
find_program(ICEORYX_ROUDI iox-roudi REQUIRED)
# The run-time library paths aren't set in iox-roudi so we need to set
# (DY)LD_LIBRARY_PATH. CTest can't start a daemon, so we have to use
# a wrapper to start a process, for which bash makes the most sense
# when targetting just Linux and macOS. However, that means macOS
# will strip DYLD_LIBRARY_PATH from the environment and therefore we
# cannot rely on "set_test_library_paths".
find_library(ICEORYX_LIB iceoryx_posh)
get_filename_component(ICEORYX_LIB_PATH ${ICEORYX_LIB} DIRECTORY)
if(APPLE)
set(ICEORYX_ROUDI_LIBPATH "DYLD_LIBRARY_PATH=${ICEORYX_LIB_PATH}:$ENV{DYLD_LIBRARY_PATH}")
else()
set(ICEORYX_ROUDI_LIBPATH "LD_LIBRARY_PATH=${ICEORYX_LIB_PATH}:$ENV{LD_LIBRARY_PATH}")
endif()
# CTest waits until the child process terminates *AND* the stdin/stdout/stderr
# pipes are closed. Redirecting the output to a file solves that problem.
#
# Write the process id of RouDi to ctest_fixture_iox_roudi.pid so we know what
# process to kill in the cleanup phase.
#
# Sleep + kill -0 to check that RouDi really did start, cat'ing the log file in case
# it failed to start.
add_test(NAME start_roudi COMMAND
bash -c
"\
${ICEORYX_ROUDI_LIBPATH} ${ICEORYX_ROUDI} -c ${CMAKE_CURRENT_SOURCE_DIR}/iox_roudi_config.toml \
ctest_fixture_iox_roudi.output 2>&1 & echo $! > ctest_fixture_iox_roudi.pid ; \
sleep 1 ; \
cat ctest_fixture_iox_roudi.output ; \
kill -0 `cat ctest_fixture_iox_roudi.pid`")
set_test_library_paths(start_roudi)
# SIGTERM should suffice for stopping RouDi
add_test(NAME stop_roudi COMMAND bash -c "kill `cat ctest_fixture_iox_roudi.pid` ; cat ctest_fixture_iox_roudi.output")
set_tests_properties(start_roudi PROPERTIES FIXTURES_SETUP iox)
set_tests_properties(stop_roudi PROPERTIES FIXTURES_CLEANUP iox)
set_tests_properties(start_roudi stop_roudi PROPERTIES RESOURCE_LOCK iox_lock)
# Construct Iceoryx-variants of all PSMX tests if building shared libraries, map them to
# Iceoryx in a static build (because I don't know how to delete tests!)
if(BUILD_SHARED_LIBS)
foreach(fullname ${test_names})
string(REGEX REPLACE "^CUnit_ddsc_psmx_(.*)" "\\1" shortname "${fullname}")
add_test(NAME ${fullname}_iox COMMAND cunit_ddsc -s ddsc_psmx -t ${shortname})
set_tests_properties(${fullname}_iox PROPERTIES FIXTURES_REQUIRED iox)
set_tests_properties(${fullname}_iox PROPERTIES RESOURCE_LOCK iox_lock)
set_tests_properties(${fullname}_iox PROPERTIES ENVIRONMENT "CDDS_PSMX_NAME=iox;LD_LIBRARY_PATH=$:$ENV{LD_LIBRARY_PATH}")
endforeach()
else()
foreach(fullname ${test_names})
set_tests_properties(${fullname} PROPERTIES FIXTURES_REQUIRED iox)
set_tests_properties(${fullname} PROPERTIES RESOURCE_LOCK iox_lock)
set_tests_properties(${fullname} PROPERTIES ENVIRONMENT "CDDS_PSMX_NAME=iox")
endforeach()
endif()
endif()