Skip to content

Commit f9396ee

Browse files
committed
Add multithread ping test
Add multithread test support Fix typo Test CI Set library full path and dependencies Modify client link method Add link_directories Trigger CI Fix include paths Trigger CI Update CMakeLists.txt Fix create bin field Revert cmake change Update participant name
1 parent 19537f8 commit f9396ee

11 files changed

Lines changed: 203 additions & 32 deletions

File tree

CMakeLists.txt

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,46 @@ if(UXRCE_ENABLE_CLIENT)
121121
list(APPEND _deps client)
122122
endif()
123123

124+
if(UXRCE_TEST_THREAD)
125+
ExternalProject_Add(client_thread
126+
GIT_REPOSITORY
127+
https://github.com/eProsima/Micro-XRCE-DDS-Client.git
128+
GIT_TAG
129+
${_client_tag}
130+
PREFIX
131+
${PROJECT_BINARY_DIR}/client_thread
132+
INSTALL_DIR
133+
${PROJECT_BINARY_DIR}/temp_install
134+
TEST_AFTER_INSTALL
135+
${_run_tests}
136+
TEST_COMMAND
137+
${_test_command}
138+
CMAKE_CACHE_ARGS
139+
-DLIB_PREFIX:STRING=libthread_
140+
-DUCLIENT_PROFILE_MULTITHREAD:BOOL=ON
141+
-DCMAKE_CXX_COMPILER:FILEPATH=${CMAKE_CXX_COMPILER}
142+
-DCMAKE_C_COMPILER:FILEPATH=${CMAKE_C_COMPILER}
143+
-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
144+
-DCMAKE_C_FLAGS:STRING=${CMAKE_C_FLAGS}
145+
-DCMAKE_CXX_FLAGS:STRING=${CMAKE_CXX_FLAGS}
146+
-DCMAKE_EXE_LINKER_FLAGS:STRING=${CMAKE_EXE_LINKER_FLAGS}
147+
-DCMAKE_SHARED_LINKER_FLAGS:STRING=${CMAKE_SHARED_LINKER_FLAGS}
148+
-DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
149+
-DCMAKE_PREFIX_PATH:PATH=<INSTALL_DIR>
150+
-DBIN_INSTALL_DIR:PATH=${BIN_INSTALL_DIR}
151+
-DINCLUDE_INSTALL_DIR:PATH=${INCLUDE_INSTALL_DIR}_thread
152+
-DLIB_INSTALL_DIR:PATH=${LIB_INSTALL_DIR}
153+
-DDATA_INSTALL_DIR:PATH=${DATA_INSTALL_DIR}
154+
-DUCLIENT_BUILD_EXAMPLES:BOOL=${UXRCE_BUILD_EXAMPLES}
155+
-DUCLIENT_INSTALL_EXAMPLES:BOOL=${UXRCE_BUILD_EXAMPLES}
156+
-DUCLIENT_PIC:BOOL=ON
157+
-DUCLIENT_BUILD_TESTS:BOOL=${UXRCE_BUILD_TESTS}
158+
-DUCLIENT_ISOLATED_INSTALL:BOOL=OFF
159+
-DGTEST_INDIVIDUAL:BOOL=ON
160+
)
161+
list(APPEND _deps client_thread)
162+
endif()
163+
124164
if(UXRCE_ENABLE_AGENT)
125165
ExternalProject_Add(agent
126166
GIT_REPOSITORY
@@ -223,6 +263,7 @@ if(UXRCE_BUILD_TESTS)
223263
TEST_COMMAND
224264
${_test_command}
225265
CMAKE_CACHE_ARGS
266+
-DUXRCE_TEST_THREAD:BOOL=${UXRCE_TEST_THREAD}
226267
-DCMAKE_CXX_COMPILER:FILEPATH=${CMAKE_CXX_COMPILER}
227268
-DCMAKE_C_COMPILER:FILEPATH=${CMAKE_C_COMPILER}
228269
-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}

ci/linux/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ ExternalProject_Add(microxrcedds
4444
BUILD_COMMAND
4545
""
4646
CMAKE_CACHE_ARGS
47+
-DUXRCE_TEST_THREAD:BOOL=ON
4748
-DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}
4849
-DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
4950
-DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}

test/CMakeLists.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,8 @@ add_subdirectory(test/publisher_subscriber)
4848
add_subdirectory(test/discovery)
4949
add_subdirectory(test/custom_transports)
5050
#add_subdirectory(test/shapes_demo) TODO (julibert): fix client and agent paths.
51+
52+
if(UXRCE_TEST_THREAD)
53+
add_subdirectory(test/multithread)
54+
endif()
55+

test/profiling/publisher/main.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ int main(int args, char** argv)
101101
ucdrBuffer ub;
102102
uxr_prepare_output_stream(&session, besteffort_out, datawriter_id, &ub, 4 + strlen(topic));
103103
ucdr_serialize_string(&ub, topic);
104-
104+
UXR_UNLOCK_STREAM_ID(&session, besteffort_out);
105105
printf("Send topic %s, by %d\n", topic, client_key);
106106
connected = uxr_run_session_time(&session, 50);
107107
++count;

test/test/client_agent/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ target_include_directories(client-agent-test
4040
${GTEST_INCLUDE_DIR}
4141
)
4242

43+
link_directories(${PROJECT_BINARY_DIR}/test/interaction_client)
4344
target_link_libraries(client-agent-test
4445
PRIVATE
4546
interaction_client

test/test/client_agent/ClientAgentInteraction.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ TEST_P(ClientAgentInteraction, ExistantEntitiesCreationReplaceReuseBINBINReliabl
377377
TEST_P(ClientAgentInteraction, PingFromClientToAgent)
378378
{
379379
const Transport transport_kind(std::get<0>(GetParam()));
380-
ASSERT_NO_FATAL_FAILURE(client_.ping_agent(transport_kind));
380+
ASSERT_NO_FATAL_FAILURE(client_.ping_agent(transport_kind, 1, 1));
381381
}
382382

383383
INSTANTIATE_TEST_CASE_P(

test/test/interaction_client/CMakeLists.txt

Lines changed: 59 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -28,38 +28,69 @@ set(SRCS
2828
Discovery.cpp
2929
)
3030

31-
add_library(interaction_client STATIC ${SRCS})
31+
list(APPEND libs interaction_client)
32+
find_library(CLIENT microxrcedds_client REQUIRED
33+
HINTS ${PROJECT_BINARY_DIR}/../../../temp_install/lib/libmicroxrcedds_client.a)
3234

33-
set_common_compile_options(interaction_client)
35+
if(UXRCE_TEST_THREAD)
36+
list(APPEND libs interaction_thread_client)
37+
find_library(CLIENT_MULTITHREAD thread_microxrcedds_client REQUIRED
38+
HINTS ${PROJECT_BINARY_DIR}/../../../temp_install/lib/libthread_microxrcedds_client.a)
39+
endif()
3440

35-
if(MSVC OR MSVC_IDE)
36-
target_compile_options(interaction_client
37-
PRIVATE
38-
/wd4996
41+
foreach(lib ${libs})
42+
add_library(${lib} STATIC ${SRCS})
43+
set_common_compile_options(${lib})
44+
45+
if(MSVC OR MSVC_IDE)
46+
target_compile_options(${lib}
47+
PRIVATE
48+
/wd4996
49+
PUBLIC
50+
-D_CRT_SECURE_NO_WARNINGS
51+
)
52+
endif()
53+
54+
if(${lib} STREQUAL interaction_client)
55+
target_include_directories(${lib}
3956
PUBLIC
40-
-D_CRT_SECURE_NO_WARNINGS
57+
${PROJECT_BINARY_DIR}/../../../temp_install/include
58+
${CMAKE_CURRENT_SOURCE_DIR}
59+
${CMAKE_CURRENT_BINARY_DIR}
60+
PRIVATE
61+
${GTEST_INCLUDE_DIRS}
4162
)
42-
endif()
4363

44-
target_include_directories(interaction_client
45-
PUBLIC
46-
${CMAKE_CURRENT_SOURCE_DIR}
47-
${CMAKE_CURRENT_BINARY_DIR}
48-
PRIVATE
49-
${GTEST_INCLUDE_DIRS}
50-
)
64+
target_link_libraries(${lib}
65+
PUBLIC
66+
${CLIENT}
67+
custom_transports
68+
PRIVATE
69+
${GTEST_BOTH_LIBRARIES}
70+
)
71+
elseif(${lib} STREQUAL interaction_thread_client)
72+
target_include_directories(${lib}
73+
PUBLIC
74+
${PROJECT_BINARY_DIR}/../../../temp_install/include_thread
75+
${CMAKE_CURRENT_BINARY_DIR}
76+
${CMAKE_CURRENT_SOURCE_DIR}
77+
PRIVATE
78+
${GTEST_INCLUDE_DIRS}
79+
)
5180

52-
target_link_libraries(interaction_client
53-
PUBLIC
54-
microxrcedds_client
55-
custom_transports
56-
PRIVATE
57-
${GTEST_BOTH_LIBRARIES}
58-
)
81+
target_link_libraries(${lib}
82+
PUBLIC
83+
${CLIENT_MULTITHREAD}
84+
custom_transports
85+
PRIVATE
86+
${GTEST_BOTH_LIBRARIES}
87+
)
88+
endif()
5989

60-
set_target_properties(interaction_client PROPERTIES
61-
CXX_STANDARD
62-
11
63-
CXX_STANDARD_REQUIRED
64-
YES
65-
)
90+
set_target_properties(${lib} PROPERTIES
91+
CXX_STANDARD
92+
11
93+
CXX_STANDARD_REQUIRED
94+
YES
95+
)
96+
endforeach()

test/test/interaction_client/Client.hpp

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,11 @@ class Client
274274
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
275275
(void) uxr_run_session_time(&session_, 500);
276276

277+
publish_run(id, stream_id_raw, number, message);
278+
}
279+
280+
void publish_run(uint8_t id, uint8_t stream_id_raw, size_t number, const std::string& message)
281+
{
277282
uxrStreamId output_stream_id = uxr_stream_id_from_raw(stream_id_raw, UXR_OUTPUT_STREAM);
278283
uxrObjectId datawriter_id = uxr_object_id(id, UXR_DATAWRITER_ID);
279284

@@ -297,6 +302,7 @@ class Client
297302
ASSERT_TRUE(written);
298303
ASSERT_FALSE(ub.error);
299304
bool sent = uxr_run_session_until_confirm_delivery(&session_, timeout);
305+
UXR_UNLOCK_STREAM_ID(&session_, output_stream_id);
300306
ASSERT_TRUE(sent);
301307
}
302308
}
@@ -436,7 +442,7 @@ class Client
436442
}
437443

438444
void ping_agent(
439-
const Transport transport_kind)
445+
const Transport transport_kind, size_t number, uint8_t attempts)
440446
{
441447
uxrCommunication* comm(nullptr);
442448

@@ -464,7 +470,12 @@ class Client
464470
FAIL() << "Transport type not supported";
465471
break;
466472
}
467-
ASSERT_TRUE(uxr_ping_agent_attempts(comm, 1000, 1));
473+
474+
for(size_t i = 0; i < number; ++i)
475+
{
476+
ASSERT_TRUE(uxr_ping_agent_attempts(comm, 1000, attempts));
477+
std::cout << "Ping sent: " << i << std::endl;
478+
}
468479
}
469480

470481
protected:
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# Copyright 2019 Proyectos y Sistemas de Mantenimiento SL (eProsima).
2+
#
3+
# Licensed under the Apache License, Version 2.0 (the "License");
4+
# you may not use this file except in compliance with the License.
5+
# You may obtain a copy of the License at
6+
#
7+
# http://www.apache.org/licenses/LICENSE-2.0
8+
#
9+
# Unless required by applicable law or agreed to in writing, software
10+
# distributed under the License is distributed on an "AS IS" BASIS,
11+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
# See the License for the specific language governing permissions and
13+
# limitations under the License.
14+
15+
cmake_host_system_information(RESULT HOSTNAME_SUFFIX QUERY HOSTNAME)
16+
17+
add_executable(client-thread-test ClientAgentInteractionThread.cpp)
18+
19+
add_gtest(client-thread-test
20+
SOURCES
21+
ClientAgentInteractionThread.cpp
22+
ENVIRONMENTS
23+
$<$<PLATFORM_ID:Linux>:LD_LIBRARY_PATH=${CMAKE_PREFIX_PATH}/lib>
24+
$<$<PLATFORM_ID:Windows>:PATH=${CMAKE_PREFIX_PATH}/bin>
25+
)
26+
27+
target_include_directories(client-thread-test
28+
PRIVATE
29+
${PROJECT_BINARY_DIR}/microxrcedds-build/itests
30+
${GTEST_INCLUDE_DIR}
31+
)
32+
33+
target_link_libraries(client-thread-test
34+
PRIVATE
35+
interaction_thread_client
36+
microxrcedds_agent
37+
${GTEST_BOTH_LIBRARIES}
38+
${CMAKE_THREAD_LIBS_INIT}
39+
)
40+
41+
set_target_properties(client-thread-test PROPERTIES
42+
CXX_STANDARD
43+
11
44+
CXX_STANDARD_REQUIRED
45+
YES
46+
)
47+
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#include <gtest/gtest.h>
2+
#include <thread>
3+
4+
#include <Client.hpp>
5+
#include "../client_agent/ClientAgentInteraction.hpp"
6+
7+
class ClientAgentInteractionThread : public ClientAgentInteraction
8+
{
9+
};
10+
11+
TEST_P(ClientAgentInteractionThread, PingFromClientToAgentThread)
12+
{
13+
const Transport transport_kind(std::get<0>(GetParam()));
14+
15+
std::string message("Hello DDS world!");
16+
std::thread ping_thread(&Client::ping_agent, client_, transport_kind, 10, 1);
17+
std::thread publisher_thread(&Client::publish_run, client_, 1, 1, 10, message);
18+
publisher_thread.join();
19+
ping_thread.join();
20+
}
21+
22+
INSTANTIATE_TEST_CASE_P(
23+
Transports,
24+
ClientAgentInteractionThread,
25+
::testing::Combine(
26+
::testing::Values(Transport::UDP_IPV4_TRANSPORT, Transport::TCP_IPV4_TRANSPORT, Transport::UDP_IPV6_TRANSPORT, Transport::TCP_IPV6_TRANSPORT),
27+
::testing::Values(MiddlewareKind::FASTDDS, MiddlewareKind::FASTRTPS, MiddlewareKind::CED)));
28+
29+
int main(int args, char** argv)
30+
{
31+
::testing::InitGoogleTest(&args, argv);
32+
return RUN_ALL_TESTS();
33+
}

0 commit comments

Comments
 (0)