Skip to content

Commit 4747e5f

Browse files
authored
Merge branch 'master' into fix/rtde-reconnect-thread-blocking-destructor
2 parents 76ea146 + 757d512 commit 4747e5f

11 files changed

Lines changed: 61 additions & 27 deletions

.github/workflows/check_links.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
- uses: actions/checkout@v7
1414
- name: Restore lychee cache
1515
id: restore-cache
16-
uses: actions/cache/restore@v5
16+
uses: actions/cache/restore@v6
1717
with:
1818
path: .lycheecache
1919
key: cache-lychee-${{ github.run_id }}-${{ github.run_attempt }}
@@ -40,7 +40,7 @@ jobs:
4040
--max-concurrency 1
4141
'./**/*.md' './**/*.html' './**/*.rst' './**/*.cpp' './**/*.h' './**/*.py'
4242
- name: Save lychee cache
43-
uses: actions/cache/save@v5
43+
uses: actions/cache/save@v6
4444
if: always()
4545
with:
4646
path: .lycheecache

.github/workflows/industrial-ci.yml

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,28 @@ jobs:
3232
- main
3333
- testing
3434
env:
35-
DOCKER_RUN_OPTS: '-v /var/run/docker.sock:/var/run/docker.sock --network ursim_net'
35+
# /tmp/ur_test_artifacts: collection point for test artifacts (e.g. VNC
36+
# snapshots) written from inside the ICI container.
37+
# /tmp/ursim_urcaps: shared storage for the External Control URCap.
38+
# Mounted at the same path in the ICI container AND used as the bind
39+
# source for the URSim container that start_ursim.sh launches via the
40+
# host docker daemon, so the URCap downloaded inside the ICI container
41+
# is actually visible to URSim's /urcaps mount.
42+
# Both paths are kept outside ${{ github.workspace }} so they do not
43+
# collide with industrial_ci's read-only bind-mount of TARGET_REPO_PATH.
44+
DOCKER_RUN_OPTS: '-v /var/run/docker.sock:/var/run/docker.sock -v /tmp/ur_test_artifacts:/test_artifacts -v /tmp/ursim_urcaps:/tmp/ursim_urcaps -e UR_TEST_ARTIFACTS_DIR=/test_artifacts -e UR_CI_URCAP_FOLDER=/tmp/ursim_urcaps --network ursim_net --ip 192.168.56.1'
3645
steps:
3746
- uses: actions/checkout@v7
38-
- run: docker network create --subnet=192.168.56.0/24 ursim_net
47+
- run: docker network create --subnet=192.168.56.0/24 --gateway 192.168.56.254 ursim_net
3948
if: ${{ !env.ACT }}
49+
- name: Create shared host directories
50+
run: |
51+
mkdir -p /tmp/ur_test_artifacts /tmp/ursim_urcaps
52+
# Allow the container (running as root) to write here while keeping
53+
# the directory readable by the runner user for upload-artifact, and
54+
# writable by the host docker daemon when it bind-mounts /tmp/ursim_urcaps
55+
# into the URSim container.
56+
chmod 777 /tmp/ur_test_artifacts /tmp/ursim_urcaps
4057
- uses: 'ros-industrial/industrial_ci@master'
4158
env:
4259
IMMEDIATE_TEST_OUTPUT: true
@@ -47,3 +64,9 @@ jobs:
4764
ROS_REPO: ${{matrix.ROS_REPO}}
4865
CLANG_TIDY: ${{matrix.ROS_DISTRO.CLANG_TIDY}}
4966
OS_CODE_NAME: ${{matrix.ROS_DISTRO.OS_CODE_NAME}}
67+
- name: Upload test artifacts
68+
if: ${{ always() }}
69+
uses: actions/upload-artifact@v7
70+
with:
71+
name: ur_test_artifacts-${{matrix.ROS_DISTRO.NAME}}-${{matrix.ROS_REPO}}
72+
path: /tmp/ur_test_artifacts

tests/CMakeLists.txt

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,17 @@ include(GoogleTest)
2525
option(INTEGRATION_TESTS "Build the integration tests that require a running robot / URSim" OFF)
2626
option(POLYSCOPE_X_TESTS_WITH_REMOTE_CONTROL "Run Polyscope X tests that require remote control" OFF)
2727
option(CHECK_RTDE_DOCS_RECIPE "Fetch the RTDE documentation to auto-generate a recipe containing all output fields and check that with the RTDE client. Requires python3 and pandas and an internet connection." OFF)
28+
set(INTEGRATION_TESTS_ROBOT_IP "" CACHE STRING "If set, override the default robot IP (192.168.56.101) compiled into each integration test main() by passing --robot_ip <ip> to every ctest-registered integration test.")
2829
# Build Tests
2930
if (INTEGRATION_TESTS)
30-
# Integration tests require a robot reachable at 192.168.56.101. Therefore, they have to be
31-
# activated separately.
32-
31+
# Integration tests require a reachable robot / URSim. The compiled-in default
32+
# address is 192.168.56.101; configure with -DINTEGRATION_TESTS_ROBOT_IP=<ip>
33+
# to override (e.g. 127.0.0.1 for a host-networked URSim).
34+
set(INTEGRATION_TESTS_ROBOT_IP_ARG "")
35+
if(INTEGRATION_TESTS_ROBOT_IP)
36+
set(INTEGRATION_TESTS_ROBOT_IP_ARG --robot_ip ${INTEGRATION_TESTS_ROBOT_IP})
37+
endif()
38+
3339
if(POLYSCOPE_X_TESTS_WITH_REMOTE_CONTROL)
3440
add_compile_definitions(POLYSCOPE_X_TESTS_WITH_REMOTE_CONTROL=1 )
3541
endif()
@@ -38,6 +44,7 @@ if (INTEGRATION_TESTS)
3844
target_link_libraries(rtde_tests PRIVATE ur_client_library::urcl GTest::gtest_main)
3945
gtest_add_tests(TARGET rtde_tests
4046
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
47+
EXTRA_ARGS ${INTEGRATION_TESTS_ROBOT_IP_ARG}
4148
)
4249
# Bound this teardown regression test so a hang fails CI fast instead of timing out the job.
4350
set_tests_properties(RTDEClientTest.destructor_not_blocked_by_stuck_reconnect_thread
@@ -52,27 +59,29 @@ if (INTEGRATION_TESTS)
5259
add_executable(dashboard_client_g5_tests test_dashboard_client_g5.cpp)
5360
target_link_libraries(dashboard_client_g5_tests PRIVATE ur_client_library::urcl GTest::gtest_main)
5461
gtest_add_tests(TARGET dashboard_client_g5_tests
62+
EXTRA_ARGS ${INTEGRATION_TESTS_ROBOT_IP_ARG}
5563
)
5664

5765
add_executable(dashboard_client_x_tests test_dashboard_client_x.cpp)
5866
target_link_libraries(dashboard_client_x_tests PRIVATE ur_client_library::urcl GTest::gtest_main)
5967
gtest_add_tests(TARGET dashboard_client_x_tests
6068
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
69+
EXTRA_ARGS ${INTEGRATION_TESTS_ROBOT_IP_ARG}
6170
)
6271

6372
# Spline tests
6473
add_executable(spline_tests_urcap test_spline_interpolation.cpp)
6574
target_link_libraries(spline_tests_urcap PRIVATE ur_client_library::urcl GTest::gtest_main)
6675
gtest_add_tests(TARGET spline_tests_urcap
6776
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
68-
EXTRA_ARGS --headless false
77+
EXTRA_ARGS --headless false ${INTEGRATION_TESTS_ROBOT_IP_ARG}
6978
TEST_SUFFIX _urcap
7079
)
7180
add_executable(spline_tests_headless test_spline_interpolation.cpp)
7281
target_link_libraries(spline_tests_headless PRIVATE ur_client_library::urcl GTest::gtest_main)
7382
gtest_add_tests(TARGET spline_tests_headless
7483
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
75-
EXTRA_ARGS --headless true
84+
EXTRA_ARGS --headless true ${INTEGRATION_TESTS_ROBOT_IP_ARG}
7685
TEST_SUFFIX _headless
7786
)
7887

@@ -81,14 +90,14 @@ if (INTEGRATION_TESTS)
8190
target_link_libraries(ur_driver_tests_urcap PRIVATE ur_client_library::urcl GTest::gtest_main)
8291
gtest_add_tests(TARGET ur_driver_tests_urcap
8392
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
84-
EXTRA_ARGS --headless false
93+
EXTRA_ARGS --headless false ${INTEGRATION_TESTS_ROBOT_IP_ARG}
8594
TEST_SUFFIX _urcap
8695
)
8796
add_executable(ur_driver_tests_headless test_ur_driver.cpp)
8897
target_link_libraries(ur_driver_tests_headless PRIVATE ur_client_library::urcl GTest::gtest_main)
8998
gtest_add_tests(TARGET ur_driver_tests_headless
9099
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
91-
EXTRA_ARGS --headless true
100+
EXTRA_ARGS --headless true ${INTEGRATION_TESTS_ROBOT_IP_ARG}
92101
TEST_SUFFIX _headless
93102
)
94103

@@ -97,14 +106,14 @@ if (INTEGRATION_TESTS)
97106
target_link_libraries(external_control_program_tests_urcap PRIVATE ur_client_library::urcl GTest::gtest_main)
98107
gtest_add_tests(TARGET external_control_program_tests_urcap
99108
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
100-
EXTRA_ARGS --headless false
109+
EXTRA_ARGS --headless false ${INTEGRATION_TESTS_ROBOT_IP_ARG}
101110
TEST_SUFFIX _urcap
102111
)
103112
add_executable(external_control_program_tests_headless test_external_control_program.cpp)
104113
target_link_libraries(external_control_program_tests_headless PRIVATE ur_client_library::urcl GTest::gtest_main)
105114
gtest_add_tests(TARGET external_control_program_tests_headless
106115
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
107-
EXTRA_ARGS --headless true
116+
EXTRA_ARGS --headless true ${INTEGRATION_TESTS_ROBOT_IP_ARG}
108117
TEST_SUFFIX _headless
109118
)
110119

@@ -113,27 +122,29 @@ if (INTEGRATION_TESTS)
113122
target_link_libraries(instruction_executor_test_urcap PRIVATE ur_client_library::urcl GTest::gtest_main)
114123
gtest_add_tests(TARGET instruction_executor_test_urcap
115124
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
116-
EXTRA_ARGS --headless false
125+
EXTRA_ARGS --headless false ${INTEGRATION_TESTS_ROBOT_IP_ARG}
117126
TEST_SUFFIX _urcap
118127
)
119128
add_executable(instruction_executor_test_headless test_instruction_executor.cpp)
120129
target_link_libraries(instruction_executor_test_headless PRIVATE ur_client_library::urcl GTest::gtest_main)
121130
gtest_add_tests(TARGET instruction_executor_test_headless
122131
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
123-
EXTRA_ARGS --headless true
132+
EXTRA_ARGS --headless true ${INTEGRATION_TESTS_ROBOT_IP_ARG}
124133
TEST_SUFFIX _headless
125134
)
126135

127136
add_executable(primary_client_test_headless test_primary_client.cpp fake_primary_server.cpp)
128137
target_link_libraries(primary_client_test_headless PRIVATE ur_client_library::urcl GTest::gtest_main)
129138
gtest_add_tests(TARGET primary_client_test_headless
130139
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
140+
EXTRA_ARGS ${INTEGRATION_TESTS_ROBOT_IP_ARG}
131141
)
132142

133143
add_executable(ur_driver_deprecated_constructor_test test_deprecated_ur_driver_construction.cpp)
134144
target_link_libraries(ur_driver_deprecated_constructor_test PRIVATE ur_client_library::urcl GTest::gtest_main)
135145
gtest_add_tests(TARGET ur_driver_deprecated_constructor_test
136146
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
147+
EXTRA_ARGS ${INTEGRATION_TESTS_ROBOT_IP_ARG}
137148
)
138149
else()
139150
message(STATUS "Skipping integration tests.")

tests/test_dashboard_client_g5.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -667,7 +667,7 @@ int main(int argc, char* argv[])
667667
if (std::string(argv[i]) == "--robot_ip" && i + 1 < argc)
668668
{
669669
g_ROBOT_IP = argv[i + 1];
670-
break;
670+
++i;
671671
}
672672
}
673673

tests/test_dashboard_client_x.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -516,7 +516,7 @@ int main(int argc, char* argv[])
516516
if (std::string(argv[i]) == "--robot_ip" && i + 1 < argc)
517517
{
518518
g_ROBOT_IP = argv[i + 1];
519-
break;
519+
++i;
520520
}
521521
}
522522

tests/test_deprecated_ur_driver_construction.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,13 +122,13 @@ int main(int argc, char* argv[])
122122
if (std::string(argv[i]) == "--robot_ip" && i + 1 < argc)
123123
{
124124
g_ROBOT_IP = argv[i + 1];
125-
break;
125+
++i;
126126
}
127127
if (std::string(argv[i]) == "--headless" && i + 1 < argc)
128128
{
129129
std::string headless = argv[i + 1];
130130
g_HEADLESS = headless == "true" || headless == "1" || headless == "True" || headless == "TRUE";
131-
break;
131+
++i;
132132
}
133133
}
134134

tests/test_instruction_executor.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -580,13 +580,13 @@ int main(int argc, char* argv[])
580580
if (std::string(argv[i]) == "--robot_ip" && i + 1 < argc)
581581
{
582582
g_ROBOT_IP = argv[i + 1];
583-
break;
583+
++i;
584584
}
585585
if (std::string(argv[i]) == "--headless" && i + 1 < argc)
586586
{
587587
std::string headless = argv[i + 1];
588588
g_HEADLESS = headless == "true" || headless == "1" || headless == "True" || headless == "TRUE";
589-
break;
589+
++i;
590590
}
591591
}
592592

tests/test_primary_client.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -763,7 +763,7 @@ int main(int argc, char* argv[])
763763
if (std::string(argv[i]) == "--robot_ip" && i + 1 < argc)
764764
{
765765
g_ROBOT_IP = argv[i + 1];
766-
break;
766+
++i;
767767
}
768768
}
769769

tests/test_rtde_client.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -907,7 +907,7 @@ int main(int argc, char* argv[])
907907
if (std::string(argv[i]) == "--robot_ip" && i + 1 < argc)
908908
{
909909
g_ROBOT_IP = argv[i + 1];
910-
break;
910+
++i;
911911
}
912912
}
913913

tests/test_spline_interpolation.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1232,13 +1232,13 @@ int main(int argc, char* argv[])
12321232
if (std::string(argv[i]) == "--robot_ip" && i + 1 < argc)
12331233
{
12341234
g_ROBOT_IP = argv[i + 1];
1235-
break;
1235+
++i;
12361236
}
12371237
if (std::string(argv[i]) == "--headless" && i + 1 < argc)
12381238
{
12391239
std::string headless = argv[i + 1];
12401240
g_HEADLESS = headless == "true" || headless == "1" || headless == "True" || headless == "TRUE";
1241-
break;
1241+
++i;
12421242
}
12431243
}
12441244

0 commit comments

Comments
 (0)