Skip to content

Commit 2147c7f

Browse files
committed
Bump test coverage.
* init/shutdown API * context fini API * node init/fini API * guard condition init/fini API * security APIs Signed-off-by: Michel Hidalgo <[email protected]>
1 parent 0980f88 commit 2147c7f

File tree

6 files changed

+271
-6
lines changed

6 files changed

+271
-6
lines changed

rcl/test/CMakeLists.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ function(test_target_function)
7575
SRCS rcl/test_context.cpp
7676
ENV ${rmw_implementation_env_var} ${memory_tools_ld_preload_env_var}
7777
APPEND_LIBRARY_DIRS ${extra_lib_dirs}
78-
LIBRARIES ${PROJECT_NAME} osrf_testing_tools_cpp::memory_tools
78+
LIBRARIES ${PROJECT_NAME} mimick osrf_testing_tools_cpp::memory_tools
7979
AMENT_DEPENDENCIES ${rmw_implementation}
8080
)
8181

@@ -166,7 +166,7 @@ function(test_target_function)
166166
SRCS rcl/test_node.cpp
167167
ENV ${rmw_implementation_env_var} ${memory_tools_ld_preload_env_var}
168168
APPEND_LIBRARY_DIRS ${extra_lib_dirs}
169-
LIBRARIES ${PROJECT_NAME} osrf_testing_tools_cpp::memory_tools
169+
LIBRARIES ${PROJECT_NAME} mimick osrf_testing_tools_cpp::memory_tools
170170
AMENT_DEPENDENCIES ${rmw_implementation} "osrf_testing_tools_cpp"
171171
)
172172

@@ -201,7 +201,7 @@ function(test_target_function)
201201
SRCS rcl/test_guard_condition.cpp
202202
ENV ${rmw_implementation_env_var} ${memory_tools_ld_preload_env_var}
203203
APPEND_LIBRARY_DIRS ${extra_lib_dirs}
204-
LIBRARIES ${PROJECT_NAME} osrf_testing_tools_cpp::memory_tools
204+
LIBRARIES ${PROJECT_NAME} mimick osrf_testing_tools_cpp::memory_tools
205205
AMENT_DEPENDENCIES ${rmw_implementation} "osrf_testing_tools_cpp"
206206
)
207207

@@ -392,7 +392,7 @@ rcl_add_custom_gtest(test_expand_topic_name
392392
rcl_add_custom_gtest(test_security
393393
SRCS rcl/test_security.cpp
394394
APPEND_LIBRARY_DIRS ${extra_lib_dirs}
395-
LIBRARIES ${PROJECT_NAME}
395+
LIBRARIES ${PROJECT_NAME} mimick
396396
AMENT_DEPENDENCIES "osrf_testing_tools_cpp"
397397
)
398398

rcl/test/rcl/test_context.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020
#include "rcl/error_handling.h"
2121
#include "rcl/init.h"
2222

23+
#include "rmw/rmw.h"
24+
25+
#include "../mocking_utils/patch.hpp"
26+
2327
#ifdef RMW_IMPLEMENTATION
2428
# define CLASSNAME_(NAME, SUFFIX) NAME ## __ ## SUFFIX
2529
# define CLASSNAME(NAME, SUFFIX) CLASSNAME_(NAME, SUFFIX)
@@ -170,6 +174,10 @@ TEST_F(CLASSNAME(TestContextFixture, RMW_IMPLEMENTATION), bad_fini) {
170174
ret = rcl_shutdown(&context);
171175
EXPECT_EQ(ret, RCL_RET_OK);
172176

173-
ret = rcl_context_fini(&context);
174-
EXPECT_EQ(ret, RCL_RET_OK);
177+
{
178+
auto mock = mocking_utils::inject_on_return(
179+
"lib:rcl", rmw_context_fini, RMW_RET_ERROR);
180+
EXPECT_EQ(RCL_RET_ERROR, rcl_context_fini(&context));
181+
rcl_reset_error();
182+
}
175183
}

rcl/test/rcl/test_guard_condition.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@
2424
#include "osrf_testing_tools_cpp/scope_exit.hpp"
2525
#include "rcl/error_handling.h"
2626

27+
#include "rmw/rmw.h"
28+
29+
#include "../mocking_utils/patch.hpp"
30+
2731
#ifdef RMW_IMPLEMENTATION
2832
# define CLASSNAME_(NAME, SUFFIX) NAME ## __ ## SUFFIX
2933
# define CLASSNAME(NAME, SUFFIX) CLASSNAME_(NAME, SUFFIX)
@@ -188,6 +192,14 @@ TEST_F(
188192
ASSERT_EQ(RCL_RET_BAD_ALLOC, ret) << "Expected RCL_RET_BAD_ALLOC";
189193
ASSERT_TRUE(rcl_error_is_set());
190194
rcl_reset_error();
195+
// Try init but force an internal error.
196+
{
197+
auto mock = mocking_utils::patch_to_fail(
198+
"lib:rcl", rmw_create_guard_condition, "internal error", nullptr);
199+
ret = rcl_guard_condition_init(&guard_condition, &context, default_options);
200+
EXPECT_EQ(RCL_RET_ERROR, ret);
201+
rcl_reset_error();
202+
}
191203

192204
// Try fini with invalid arguments.
193205
ret = rcl_guard_condition_fini(nullptr);
@@ -202,6 +214,18 @@ TEST_F(
202214
EXPECT_EQ(RCL_RET_OK, ret);
203215
ret = rcl_guard_condition_fini(&guard_condition);
204216
EXPECT_EQ(RCL_RET_OK, ret);
217+
// Try normal init and fini, but force an internal error on first try.
218+
{
219+
auto mock = mocking_utils::inject_on_return(
220+
"lib:rcl", rmw_destroy_guard_condition, RMW_RET_ERROR);
221+
ret = rcl_guard_condition_init(&guard_condition, &context, default_options);
222+
EXPECT_EQ(RCL_RET_OK, ret);
223+
ret = rcl_guard_condition_fini(&guard_condition);
224+
EXPECT_EQ(RCL_RET_ERROR, ret);
225+
rcl_reset_error();
226+
}
227+
ret = rcl_guard_condition_fini(&guard_condition);
228+
EXPECT_EQ(RCL_RET_OK, ret);
205229
// Try repeated init and fini calls.
206230
ret = rcl_guard_condition_init(&guard_condition, &context, default_options);
207231
EXPECT_EQ(RCL_RET_OK, ret);

rcl/test/rcl/test_init.cpp

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@
2424
#include "rcutils/format_string.h"
2525
#include "rcutils/snprintf.h"
2626

27+
#include "rmw/rmw.h"
28+
2729
#include "./allocator_testing_utils.h"
2830
#include "../mocking_utils/patch.hpp"
2931
#include "../src/rcl/init_options_impl.h"
@@ -316,6 +318,54 @@ TEST_F(CLASSNAME(TestRCLFixture, RMW_IMPLEMENTATION), test_rcl_init_and_shutdown
316318
context = rcl_get_zero_initialized_context();
317319
}
318320

321+
/* Tests rcl_init() deals with internal errors correctly.
322+
*/
323+
TEST_F(CLASSNAME(TestRCLFixture, RMW_IMPLEMENTATION), test_rcl_init_internal_error) {
324+
rcl_init_options_t init_options = rcl_get_zero_initialized_init_options();
325+
rcl_ret_t ret = rcl_init_options_init(&init_options, rcl_get_default_allocator());
326+
ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str;
327+
OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT(
328+
{
329+
EXPECT_EQ(RCL_RET_OK, rcl_init_options_fini(&init_options)) << rcl_get_error_string().str;
330+
});
331+
rcl_context_t context = rcl_get_zero_initialized_context();
332+
333+
auto mock = mocking_utils::patch_to_fail(
334+
"lib:rcl", rmw_init, "internal error", RMW_RET_ERROR);
335+
336+
FakeTestArgv test_args;
337+
ret = rcl_init(test_args.argc, test_args.argv, &init_options, &context);
338+
EXPECT_EQ(RCL_RET_ERROR, ret);
339+
rcl_reset_error();
340+
}
341+
342+
/* Tests rcl_shutdown() deals with internal errors correctly.
343+
*/
344+
TEST_F(CLASSNAME(TestRCLFixture, RMW_IMPLEMENTATION), test_rcl_shutdown_internal_error) {
345+
rcl_init_options_t init_options = rcl_get_zero_initialized_init_options();
346+
rcl_ret_t ret = rcl_init_options_init(&init_options, rcl_get_default_allocator());
347+
ASSERT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str;
348+
OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT(
349+
{
350+
EXPECT_EQ(RCL_RET_OK, rcl_init_options_fini(&init_options)) << rcl_get_error_string().str;
351+
});
352+
rcl_context_t context = rcl_get_zero_initialized_context();
353+
354+
ret = rcl_init(0, nullptr, &init_options, &context);
355+
EXPECT_EQ(RCL_RET_OK, ret) << rcl_get_error_string().str;
356+
OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT(
357+
{
358+
EXPECT_EQ(RCL_RET_OK, rcl_shutdown(&context)) << rcl_get_error_string().str;
359+
EXPECT_EQ(RCL_RET_OK, rcl_context_fini(&context)) << rcl_get_error_string().str;
360+
});
361+
EXPECT_TRUE(rcl_context_is_valid(&context));
362+
363+
auto mock = mocking_utils::patch_to_fail(
364+
"lib:rcl", rmw_shutdown, "internal error", RMW_RET_ERROR);
365+
EXPECT_EQ(RCL_RET_ERROR, rcl_shutdown(&context));
366+
rcl_reset_error();
367+
}
368+
319369
/* Tests the rcl_get_instance_id() function.
320370
*/
321371
TEST_F(CLASSNAME(TestRCLFixture, RMW_IMPLEMENTATION), test_rcl_get_instance_id) {

rcl/test/rcl/test_node.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
#include "rcl/error_handling.h"
2929
#include "rcl/logging_rosout.h"
3030

31+
#include "../mocking_utils/patch.hpp"
32+
3133
#ifdef RMW_IMPLEMENTATION
3234
# define CLASSNAME_(NAME, SUFFIX) NAME ## __ ## SUFFIX
3335
# define CLASSNAME(NAME, SUFFIX) CLASSNAME_(NAME, SUFFIX)
@@ -410,6 +412,14 @@ TEST_F(CLASSNAME(TestNodeFixture, RMW_IMPLEMENTATION), test_rcl_node_life_cycle)
410412
EXPECT_EQ(RCL_RET_BAD_ALLOC, ret) << "Expected RCL_RET_BAD_ALLOC";
411413
ASSERT_TRUE(rcl_error_is_set());
412414
rcl_reset_error();
415+
// Try init but force an internal error.
416+
{
417+
auto mock = mocking_utils::patch_to_fail(
418+
"lib:rcl", rmw_create_node, "internal error", nullptr);
419+
ret = rcl_node_init(&node, name, namespace_, &context, &default_options);
420+
EXPECT_EQ(RCL_RET_ERROR, ret);
421+
rcl_reset_error();
422+
}
413423

414424
// Try fini with invalid arguments.
415425
ret = rcl_node_fini(nullptr);
@@ -424,6 +434,18 @@ TEST_F(CLASSNAME(TestNodeFixture, RMW_IMPLEMENTATION), test_rcl_node_life_cycle)
424434
EXPECT_EQ(RCL_RET_OK, ret);
425435
ret = rcl_node_fini(&node);
426436
EXPECT_EQ(RCL_RET_OK, ret);
437+
// Try normal init and fini, but force an internal error on first try.
438+
{
439+
ret = rcl_node_init(&node, name, namespace_, &context, &default_options);
440+
EXPECT_EQ(RCL_RET_OK, ret);
441+
auto mock = mocking_utils::inject_on_return(
442+
"lib:rcl", rmw_destroy_node, RMW_RET_ERROR);
443+
ret = rcl_node_fini(&node);
444+
EXPECT_EQ(RCL_RET_ERROR, ret);
445+
rcl_reset_error();
446+
}
447+
ret = rcl_node_fini(&node);
448+
EXPECT_EQ(RCL_RET_OK, ret);
427449
// Try repeated init and fini calls.
428450
ret = rcl_node_init(&node, name, namespace_, &context, &default_options);
429451
EXPECT_EQ(RCL_RET_OK, ret);

rcl/test/rcl/test_security.cpp

Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,15 @@
2222
#include "rcl/error_handling.h"
2323

2424
#include "rcutils/filesystem.h"
25+
#include "rcutils/get_env.h"
2526

2627
#include "rmw/error_handling.h"
28+
#include "rmw/rmw.h"
2729

2830
#include "osrf_testing_tools_cpp/scope_exit.hpp"
2931

32+
#include "./allocator_testing_utils.h"
33+
#include "../mocking_utils/patch.hpp"
3034

3135
#define TEST_SECURITY_DIRECTORY_RESOURCES_DIR_NAME "/test_security_directory"
3236
#define TEST_ENCLAVE "dummy_enclave"
@@ -253,3 +257,160 @@ TEST_F(TestGetSecureRoot, test_get_security_options) {
253257
PATH_SEPARATOR "enclaves" PATH_SEPARATOR TEST_ENCLAVE,
254258
options.security_root_path);
255259
}
260+
261+
TEST_F(TestGetSecureRoot, test_rcl_security_enabled) {
262+
EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_security_enabled(nullptr));
263+
rcl_reset_error();
264+
265+
{
266+
bool use_security;
267+
auto mock = mocking_utils::patch_and_return(
268+
"lib:rcl", rcutils_get_env, "internal error");
269+
EXPECT_EQ(RCL_RET_ERROR, rcl_security_enabled(&use_security));
270+
rcl_reset_error();
271+
}
272+
273+
{
274+
bool use_security = false;
275+
putenv_wrapper(ROS_SECURITY_ENABLE_VAR_NAME "=true");
276+
EXPECT_EQ(RCL_RET_OK, rcl_security_enabled(&use_security));
277+
EXPECT_TRUE(use_security);
278+
unsetenv_wrapper(ROS_SECURITY_ENABLE_VAR_NAME);
279+
}
280+
281+
{
282+
bool use_security = true;
283+
putenv_wrapper(ROS_SECURITY_ENABLE_VAR_NAME "=false");
284+
EXPECT_EQ(RCL_RET_OK, rcl_security_enabled(&use_security));
285+
EXPECT_FALSE(use_security);
286+
unsetenv_wrapper(ROS_SECURITY_ENABLE_VAR_NAME);
287+
}
288+
289+
{
290+
bool use_security = true;
291+
putenv_wrapper(ROS_SECURITY_ENABLE_VAR_NAME "=foo");
292+
EXPECT_EQ(RCL_RET_OK, rcl_security_enabled(&use_security));
293+
EXPECT_FALSE(use_security);
294+
unsetenv_wrapper(ROS_SECURITY_ENABLE_VAR_NAME);
295+
}
296+
297+
{
298+
bool use_security = true;
299+
EXPECT_EQ(RCL_RET_OK, rcl_security_enabled(&use_security));
300+
EXPECT_FALSE(use_security);
301+
}
302+
}
303+
304+
TEST_F(TestGetSecureRoot, test_rcl_get_enforcement_policy) {
305+
EXPECT_EQ(RCL_RET_INVALID_ARGUMENT, rcl_get_enforcement_policy(nullptr));
306+
rcl_reset_error();
307+
308+
{
309+
rmw_security_enforcement_policy_t policy;
310+
auto mock = mocking_utils::patch_and_return(
311+
"lib:rcl", rcutils_get_env, "internal error");
312+
EXPECT_EQ(RCL_RET_ERROR, rcl_get_enforcement_policy(&policy));
313+
rcl_reset_error();
314+
}
315+
316+
{
317+
rmw_security_enforcement_policy_t policy = RMW_SECURITY_ENFORCEMENT_PERMISSIVE;
318+
putenv_wrapper(ROS_SECURITY_STRATEGY_VAR_NAME "=Enforce");
319+
EXPECT_EQ(RCL_RET_OK, rcl_get_enforcement_policy(&policy));
320+
EXPECT_EQ(RMW_SECURITY_ENFORCEMENT_ENFORCE, policy);
321+
unsetenv_wrapper(ROS_SECURITY_STRATEGY_VAR_NAME);
322+
}
323+
324+
{
325+
rmw_security_enforcement_policy_t policy = RMW_SECURITY_ENFORCEMENT_ENFORCE;
326+
EXPECT_EQ(RCL_RET_OK, rcl_get_enforcement_policy(&policy));
327+
EXPECT_EQ(RMW_SECURITY_ENFORCEMENT_PERMISSIVE, policy);
328+
}
329+
330+
{
331+
rmw_security_enforcement_policy_t policy = RMW_SECURITY_ENFORCEMENT_ENFORCE;
332+
putenv_wrapper(ROS_SECURITY_STRATEGY_VAR_NAME "=foo");
333+
EXPECT_EQ(RCL_RET_OK, rcl_get_enforcement_policy(&policy));
334+
EXPECT_EQ(RMW_SECURITY_ENFORCEMENT_PERMISSIVE, policy);
335+
unsetenv_wrapper(ROS_SECURITY_STRATEGY_VAR_NAME);
336+
}
337+
338+
{
339+
rmw_security_enforcement_policy_t policy = RMW_SECURITY_ENFORCEMENT_ENFORCE;
340+
putenv_wrapper(ROS_SECURITY_STRATEGY_VAR_NAME "=ENFORCE");
341+
EXPECT_EQ(RCL_RET_OK, rcl_get_enforcement_policy(&policy));
342+
EXPECT_EQ(RMW_SECURITY_ENFORCEMENT_PERMISSIVE, policy);
343+
unsetenv_wrapper(ROS_SECURITY_STRATEGY_VAR_NAME);
344+
}
345+
}
346+
347+
TEST_F(TestGetSecureRoot, test_rcl_get_secure_root_with_bad_arguments) {
348+
rcl_allocator_t allocator = rcl_get_default_allocator();
349+
EXPECT_EQ(nullptr, rcl_get_secure_root(nullptr, &allocator));
350+
EXPECT_TRUE(rcl_error_is_set());
351+
rcl_reset_error();
352+
353+
EXPECT_EQ(nullptr, rcl_get_secure_root("test", nullptr));
354+
EXPECT_TRUE(rcl_error_is_set());
355+
rcl_reset_error();
356+
357+
rcl_allocator_t invalid_allocator = rcutils_get_zero_initialized_allocator();
358+
EXPECT_EQ(nullptr, rcl_get_secure_root("test", &invalid_allocator));
359+
EXPECT_TRUE(rcl_error_is_set());
360+
rcl_reset_error();
361+
}
362+
363+
TEST_F(TestGetSecureRoot, test_rcl_get_secure_root_with_internal_errors) {
364+
{
365+
auto mock = mocking_utils::patch(
366+
"lib:rcl", rcutils_get_env,
367+
[&](const char * name, const char ** value) -> const char * {
368+
if (strcmp(ROS_SECURITY_ENCLAVE_OVERRIDE, name) == 0) {
369+
return "internal error";
370+
}
371+
*value = "";
372+
return nullptr;
373+
});
374+
rcl_allocator_t allocator = rcl_get_default_allocator();
375+
EXPECT_EQ(nullptr, rcl_get_secure_root("test", &allocator));
376+
EXPECT_TRUE(rcl_error_is_set());
377+
rcl_reset_error();
378+
}
379+
380+
{
381+
putenv_wrapper(
382+
ROS_SECURITY_ENCLAVE_OVERRIDE "=" TEST_ENCLAVE_ABSOLUTE);
383+
rcl_allocator_t allocator = get_failing_allocator();
384+
EXPECT_EQ(nullptr, rcl_get_secure_root("test", &allocator));
385+
EXPECT_TRUE(rcl_error_is_set());
386+
rcl_reset_error();
387+
unsetenv_wrapper(ROS_SECURITY_ENCLAVE_OVERRIDE);
388+
}
389+
390+
{
391+
auto mock = mocking_utils::patch(
392+
"lib:rcl", rcutils_get_env,
393+
[&](const char * name, const char ** value) -> const char * {
394+
if (strcmp(ROS_SECURITY_KEYSTORE_VAR_NAME, name) == 0) {
395+
return "internal error";
396+
}
397+
*value = "";
398+
return nullptr;
399+
});
400+
rcl_allocator_t allocator = rcl_get_default_allocator();
401+
EXPECT_EQ(nullptr, rcl_get_secure_root("test", &allocator));
402+
EXPECT_TRUE(rcl_error_is_set());
403+
rcl_reset_error();
404+
}
405+
406+
{
407+
putenv_wrapper(
408+
ROS_SECURITY_KEYSTORE_VAR_NAME "="
409+
TEST_RESOURCES_DIRECTORY TEST_SECURITY_DIRECTORY_RESOURCES_DIR_NAME);
410+
rcl_allocator_t allocator = get_failing_allocator();
411+
EXPECT_EQ(nullptr, rcl_get_secure_root("test", &allocator));
412+
EXPECT_TRUE(rcl_error_is_set());
413+
rcl_reset_error();
414+
unsetenv_wrapper(ROS_SECURITY_KEYSTORE_VAR_NAME);
415+
}
416+
}

0 commit comments

Comments
 (0)