Skip to content

Commit 7309359

Browse files
Convert sleep_for into appropriate logic in tests(#631)
Signed-off-by: Barry Xu <[email protected]>
1 parent 6d16465 commit 7309359

File tree

7 files changed

+326
-268
lines changed

7 files changed

+326
-268
lines changed

rcl/test/CMakeLists.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -191,15 +191,15 @@ function(test_target_function)
191191
)
192192

193193
rcl_add_custom_gtest(test_service${target_suffix}
194-
SRCS rcl/test_service.cpp
194+
SRCS rcl/test_service.cpp rcl/wait_for_entity_helpers.cpp
195195
ENV ${rmw_implementation_env_var}
196196
APPEND_LIBRARY_DIRS ${extra_lib_dirs}
197197
LIBRARIES ${PROJECT_NAME}
198198
AMENT_DEPENDENCIES ${rmw_implementation} "osrf_testing_tools_cpp" "test_msgs"
199199
)
200200

201201
rcl_add_custom_gtest(test_subscription${target_suffix}
202-
SRCS rcl/test_subscription.cpp
202+
SRCS rcl/test_subscription.cpp rcl/wait_for_entity_helpers.cpp
203203
ENV ${rmw_implementation_env_var}
204204
APPEND_LIBRARY_DIRS ${extra_lib_dirs}
205205
LIBRARIES ${PROJECT_NAME}
@@ -259,13 +259,13 @@ function(test_target_function)
259259
# Launch tests
260260

261261
rcl_add_custom_executable(service_fixture${target_suffix}
262-
SRCS rcl/service_fixture.cpp
262+
SRCS rcl/service_fixture.cpp rcl/wait_for_entity_helpers.cpp
263263
LIBRARIES ${PROJECT_NAME}
264264
AMENT_DEPENDENCIES ${rmw_implementation} "osrf_testing_tools_cpp" "test_msgs"
265265
)
266266

267267
rcl_add_custom_executable(client_fixture${target_suffix}
268-
SRCS rcl/client_fixture.cpp
268+
SRCS rcl/client_fixture.cpp rcl/wait_for_entity_helpers.cpp
269269
LIBRARIES ${PROJECT_NAME}
270270
AMENT_DEPENDENCIES ${rmw_implementation} "osrf_testing_tools_cpp" "test_msgs"
271271
)

rcl/test/rcl/client_fixture.cpp

Lines changed: 1 addition & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,6 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
#include <chrono>
16-
#include <stdexcept>
17-
#include <string>
18-
#include <thread>
19-
2015
#include "rcutils/logging_macros.h"
2116

2217
#include "rcl/client.h"
@@ -26,87 +21,7 @@
2621

2722
#include "osrf_testing_tools_cpp/scope_exit.hpp"
2823
#include "rcl/error_handling.h"
29-
#include "rcl/graph.h"
30-
31-
bool
32-
wait_for_server_to_be_available(
33-
rcl_node_t * node,
34-
rcl_client_t * client,
35-
size_t max_tries,
36-
int64_t period_ms)
37-
{
38-
size_t iteration = 0;
39-
do {
40-
++iteration;
41-
bool is_ready;
42-
rcl_ret_t ret = rcl_service_server_is_available(node, client, &is_ready);
43-
if (ret != RCL_RET_OK) {
44-
RCUTILS_LOG_ERROR_NAMED(
45-
ROS_PACKAGE_NAME,
46-
"Error in rcl_service_server_is_available: %s",
47-
rcl_get_error_string().str);
48-
return false;
49-
}
50-
if (is_ready) {
51-
return true;
52-
}
53-
std::this_thread::sleep_for(std::chrono::milliseconds(period_ms));
54-
} while (iteration < max_tries);
55-
return false;
56-
}
57-
58-
bool
59-
wait_for_client_to_be_ready(
60-
rcl_client_t * client,
61-
rcl_context_t * context,
62-
size_t max_tries,
63-
int64_t period_ms)
64-
{
65-
rcl_wait_set_t wait_set = rcl_get_zero_initialized_wait_set();
66-
rcl_ret_t ret =
67-
rcl_wait_set_init(&wait_set, 0, 0, 0, 1, 0, 0, context, rcl_get_default_allocator());
68-
if (ret != RCL_RET_OK) {
69-
RCUTILS_LOG_ERROR_NAMED(
70-
ROS_PACKAGE_NAME, "Error in wait set init: %s", rcl_get_error_string().str);
71-
return false;
72-
}
73-
OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT(
74-
{
75-
if (rcl_wait_set_fini(&wait_set) != RCL_RET_OK) {
76-
RCUTILS_LOG_ERROR_NAMED(
77-
ROS_PACKAGE_NAME, "Error in wait set fini: %s", rcl_get_error_string().str);
78-
throw std::runtime_error("error while waiting for client");
79-
}
80-
});
81-
size_t iteration = 0;
82-
do {
83-
++iteration;
84-
if (rcl_wait_set_clear(&wait_set) != RCL_RET_OK) {
85-
RCUTILS_LOG_ERROR_NAMED(
86-
ROS_PACKAGE_NAME, "Error in wait_set_clear: %s", rcl_get_error_string().str);
87-
return false;
88-
}
89-
if (rcl_wait_set_add_client(&wait_set, client, NULL) != RCL_RET_OK) {
90-
RCUTILS_LOG_ERROR_NAMED(
91-
ROS_PACKAGE_NAME, "Error in wait_set_add_client: %s", rcl_get_error_string().str);
92-
return false;
93-
}
94-
ret = rcl_wait(&wait_set, RCL_MS_TO_NS(period_ms));
95-
if (ret == RCL_RET_TIMEOUT) {
96-
continue;
97-
}
98-
if (ret != RCL_RET_OK) {
99-
RCUTILS_LOG_ERROR_NAMED(ROS_PACKAGE_NAME, "Error in wait: %s", rcl_get_error_string().str);
100-
return false;
101-
}
102-
for (size_t i = 0; i < wait_set.size_of_clients; ++i) {
103-
if (wait_set.clients[i] && wait_set.clients[i] == client) {
104-
return true;
105-
}
106-
}
107-
} while (iteration < max_tries);
108-
return false;
109-
}
24+
#include "wait_for_entity_helpers.hpp"
11025

11126
int main(int argc, char ** argv)
11227
{

rcl/test/rcl/service_fixture.cpp

Lines changed: 1 addition & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313
// limitations under the License.
1414

1515
#include <chrono>
16-
#include <stdexcept>
17-
#include <string>
1816
#include <thread>
1917

2018
#include "rcutils/logging_macros.h"
@@ -27,59 +25,8 @@
2725

2826
#include "osrf_testing_tools_cpp/scope_exit.hpp"
2927
#include "rcl/error_handling.h"
28+
#include "wait_for_entity_helpers.hpp"
3029

31-
bool
32-
wait_for_service_to_be_ready(
33-
rcl_service_t * service,
34-
rcl_context_t * context,
35-
size_t max_tries,
36-
int64_t period_ms)
37-
{
38-
rcl_wait_set_t wait_set = rcl_get_zero_initialized_wait_set();
39-
rcl_ret_t ret =
40-
rcl_wait_set_init(&wait_set, 0, 0, 0, 0, 1, 0, context, rcl_get_default_allocator());
41-
if (ret != RCL_RET_OK) {
42-
RCUTILS_LOG_ERROR_NAMED(
43-
ROS_PACKAGE_NAME, "Error in wait set init: %s", rcl_get_error_string().str);
44-
return false;
45-
}
46-
OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT(
47-
{
48-
if (rcl_wait_set_fini(&wait_set) != RCL_RET_OK) {
49-
RCUTILS_LOG_ERROR_NAMED(
50-
ROS_PACKAGE_NAME, "Error in wait set fini: %s", rcl_get_error_string().str);
51-
throw std::runtime_error("error waiting for service to be ready");
52-
}
53-
});
54-
size_t iteration = 0;
55-
do {
56-
++iteration;
57-
if (rcl_wait_set_clear(&wait_set) != RCL_RET_OK) {
58-
RCUTILS_LOG_ERROR_NAMED(
59-
ROS_PACKAGE_NAME, "Error in wait_set_clear: %s", rcl_get_error_string().str);
60-
return false;
61-
}
62-
if (rcl_wait_set_add_service(&wait_set, service, NULL) != RCL_RET_OK) {
63-
RCUTILS_LOG_ERROR_NAMED(
64-
ROS_PACKAGE_NAME, "Error in wait_set_add_service: %s", rcl_get_error_string().str);
65-
return false;
66-
}
67-
ret = rcl_wait(&wait_set, RCL_MS_TO_NS(period_ms));
68-
if (ret == RCL_RET_TIMEOUT) {
69-
continue;
70-
}
71-
if (ret != RCL_RET_OK) {
72-
RCUTILS_LOG_ERROR_NAMED(ROS_PACKAGE_NAME, "Error in wait: %s", rcl_get_error_string().str);
73-
return false;
74-
}
75-
for (size_t i = 0; i < wait_set.size_of_services; ++i) {
76-
if (wait_set.services[i] && wait_set.services[i] == service) {
77-
return true;
78-
}
79-
}
80-
} while (iteration < max_tries);
81-
return false;
82-
}
8330

8431
int main(int argc, char ** argv)
8532
{

rcl/test/rcl/test_service.cpp

Lines changed: 4 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -14,18 +14,14 @@
1414

1515
#include <gtest/gtest.h>
1616

17-
#include <chrono>
18-
#include <string>
19-
#include <thread>
20-
2117
#include "rcl/service.h"
22-
2318
#include "rcl/rcl.h"
2419

2520
#include "test_msgs/srv/basic_types.h"
2621

2722
#include "osrf_testing_tools_cpp/scope_exit.hpp"
2823
#include "rcl/error_handling.h"
24+
#include "wait_for_entity_helpers.hpp"
2925

3026
#ifdef RMW_IMPLEMENTATION
3127
# define CLASSNAME_(NAME, SUFFIX) NAME ## __ ## SUFFIX
@@ -76,45 +72,6 @@ class CLASSNAME (TestServiceFixture, RMW_IMPLEMENTATION) : public ::testing::Tes
7672
}
7773
};
7874

79-
void
80-
wait_for_service_to_be_ready(
81-
rcl_service_t * service,
82-
rcl_context_t * context,
83-
size_t max_tries,
84-
int64_t period_ms,
85-
bool & success)
86-
{
87-
rcl_wait_set_t wait_set = rcl_get_zero_initialized_wait_set();
88-
rcl_ret_t ret =
89-
rcl_wait_set_init(&wait_set, 0, 0, 0, 0, 1, 0, context, rcl_get_default_allocator());
90-
ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str;
91-
OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT(
92-
{
93-
rcl_ret_t ret = rcl_wait_set_fini(&wait_set);
94-
ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str;
95-
});
96-
size_t iteration = 0;
97-
do {
98-
++iteration;
99-
ret = rcl_wait_set_clear(&wait_set);
100-
ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str;
101-
ret = rcl_wait_set_add_service(&wait_set, service, NULL);
102-
ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str;
103-
ret = rcl_wait(&wait_set, RCL_MS_TO_NS(period_ms));
104-
if (ret == RCL_RET_TIMEOUT) {
105-
continue;
106-
}
107-
ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str;
108-
for (size_t i = 0; i < wait_set.size_of_services; ++i) {
109-
if (wait_set.services[i] && wait_set.services[i] == service) {
110-
success = true;
111-
return;
112-
}
113-
}
114-
} while (iteration < max_tries);
115-
success = false;
116-
}
117-
11875
/* Basic nominal test of a service.
11976
*/
12077
TEST_F(CLASSNAME(TestServiceFixture, RMW_IMPLEMENTATION), test_service_nominal) {
@@ -165,10 +122,7 @@ TEST_F(CLASSNAME(TestServiceFixture, RMW_IMPLEMENTATION), test_service_nominal)
165122
EXPECT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str;
166123
});
167124

168-
// TODO(wjwwood): add logic to wait for the connection to be established
169-
// use count_services busy wait mechanism
170-
// until then we will sleep for a short period of time
171-
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
125+
ASSERT_TRUE(wait_for_server_to_be_available(this->node_ptr, &client, 10, 1000));
172126

173127
// Initialize a request.
174128
test_msgs__srv__BasicTypes_Request client_request;
@@ -190,9 +144,7 @@ TEST_F(CLASSNAME(TestServiceFixture, RMW_IMPLEMENTATION), test_service_nominal)
190144
test_msgs__srv__BasicTypes_Request__fini(&client_request);
191145
ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str;
192146

193-
bool success;
194-
wait_for_service_to_be_ready(&service, context_ptr, 10, 100, success);
195-
ASSERT_TRUE(success);
147+
ASSERT_TRUE(wait_for_service_to_be_ready(&service, context_ptr, 10, 100));
196148

197149
// This scope simulates the service responding in a different context so that we can
198150
// test take_request/send_response in a single-threaded, deterministic execution.
@@ -234,7 +186,7 @@ TEST_F(CLASSNAME(TestServiceFixture, RMW_IMPLEMENTATION), test_service_nominal)
234186
ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str;
235187
test_msgs__srv__BasicTypes_Request__fini(&service_request);
236188
}
237-
wait_for_service_to_be_ready(&service, context_ptr, 10, 100, success);
189+
ASSERT_FALSE(wait_for_service_to_be_ready(&service, context_ptr, 10, 100));
238190

239191
// Initialize the response owned by the client and take the response.
240192
test_msgs__srv__BasicTypes_Response client_response;

0 commit comments

Comments
 (0)