Skip to content

Commit db66760

Browse files
committed
Pass headless mode from cmdline / CMakeLists
This way, both ways will end up in the coverage report and we don't have to run all tests twice.
1 parent 05620e1 commit db66760

File tree

6 files changed

+74
-42
lines changed

6 files changed

+74
-42
lines changed

.github/workflows/ci.yml

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ jobs:
1010
build:
1111
timeout-minutes: 30
1212
runs-on: ubuntu-latest
13-
name: build (${{matrix.env.URSIM_VERSION}}-${{matrix.env.ROBOT_MODEL}}-${{matrix.HEADLESS && 'headless' || 'urcap'}})
13+
name: build (${{matrix.env.URSIM_VERSION}}-${{matrix.env.ROBOT_MODEL}})
1414
strategy:
1515
fail-fast: false
1616
matrix:
@@ -24,7 +24,6 @@ jobs:
2424
- ROBOT_MODEL: 'ur20'
2525
URSIM_VERSION: 'latest'
2626
PROGRAM_FOLDER: 'tests/resources/dockerursim/programs/e-series'
27-
HEADLESS: [true, false]
2827

2928
steps:
3029
- uses: actions/checkout@v4
@@ -36,7 +35,6 @@ jobs:
3635
ROBOT_MODEL: ${{matrix.env.ROBOT_MODEL}}
3736
URSIM_VERSION: ${{matrix.env.URSIM_VERSION}}
3837
PROGRAM_FOLDER: ${{matrix.env.PROGRAM_FOLDER}}
39-
HEADLESS_MODE: ${{matrix.HEADLESS}}
4038
- name: configure
4139
run: mkdir build && cd build && cmake .. -DBUILDING_TESTS=1 -DINTEGRATION_TESTS=1 -DWITH_ASAN=ON
4240
env:
@@ -79,15 +77,15 @@ jobs:
7977
uses: actions/upload-artifact@v4
8078
if: always()
8179
with:
82-
name: ${{matrix.env.ROBOT_MODEL}}_${{matrix.env.URSIM_VERSION}}-${{matrix.HEADLESS && 'headless' || 'urcap'}}_URSim_Logs
80+
name: ${{matrix.env.ROBOT_MODEL}}_${{matrix.env.URSIM_VERSION}}_URSim_Logs
8381
path: ursim_logs
8482
if-no-files-found: error
8583
retention-days: 10
8684
- name: Upload test artifacts
8785
uses: actions/upload-artifact@v4
8886
if: always()
8987
with:
90-
name: ${{matrix.env.ROBOT_MODEL}}_${{matrix.env.URSIM_VERSION}}-${{matrix.HEADLESS && 'headless' || 'urcap'}}_test_artifacts
88+
name: ${{matrix.env.ROBOT_MODEL}}_${{matrix.env.URSIM_VERSION}}_test_artifacts
9189
path: test_artifacts
9290
if-no-files-found: error
9391
retention-days: 10

src/example_robot_wrapper.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030

3131
#include <ur_client_library/example_robot_wrapper.h>
3232
#include <iostream>
33+
#include "ur_client_library/log.h"
3334

3435
namespace urcl
3536
{
@@ -205,8 +206,10 @@ bool ExampleRobotWrapper::resendRobotProgram()
205206
{
206207
if (headless_mode_)
207208
{
209+
URCL_LOG_INFO("Directly sending robot program to primary interface.");
208210
return ur_driver_->sendRobotProgram();
209211
}
212+
URCL_LOG_INFO("Starting program '%s' on the robot.", autostart_program_.c_str());
210213
return startRobotProgram(autostart_program_);
211214
}
212215

tests/CMakeLists.txt

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,22 +31,52 @@ if (INTEGRATION_TESTS)
3131
gtest_add_tests(TARGET dashboard_client_tests
3232
)
3333

34-
add_executable(spline_tests test_spline_interpolation.cpp)
35-
target_link_libraries(spline_tests PRIVATE ur_client_library::urcl GTest::gtest_main)
36-
gtest_add_tests(TARGET spline_tests
34+
# Spline tests
35+
add_executable(spline_tests_urcap test_spline_interpolation.cpp)
36+
target_link_libraries(spline_tests_urcap PRIVATE ur_client_library::urcl GTest::gtest_main)
37+
gtest_add_tests(TARGET spline_tests_urcap
3738
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
39+
EXTRA_ARGS --headless false
40+
TEST_SUFFIX _urcap
41+
)
42+
add_executable(spline_tests_headless test_spline_interpolation.cpp)
43+
target_link_libraries(spline_tests_headless PRIVATE ur_client_library::urcl GTest::gtest_main)
44+
gtest_add_tests(TARGET spline_tests_headless
45+
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
46+
EXTRA_ARGS --headless true
47+
TEST_SUFFIX _headless
3848
)
3949

40-
add_executable(ur_driver_tests test_ur_driver.cpp)
41-
target_link_libraries(ur_driver_tests PRIVATE ur_client_library::urcl GTest::gtest_main)
42-
gtest_add_tests(TARGET ur_driver_tests
50+
# UrDriver tests
51+
add_executable(ur_driver_tests_urcap test_ur_driver.cpp)
52+
target_link_libraries(ur_driver_tests_urcap PRIVATE ur_client_library::urcl GTest::gtest_main)
53+
gtest_add_tests(TARGET ur_driver_tests_urcap
54+
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
55+
EXTRA_ARGS --headless false
56+
TEST_SUFFIX _urcap
57+
)
58+
add_executable(ur_driver_tests_headless test_ur_driver.cpp)
59+
target_link_libraries(ur_driver_tests_headless PRIVATE ur_client_library::urcl GTest::gtest_main)
60+
gtest_add_tests(TARGET ur_driver_tests_headless
4361
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
62+
EXTRA_ARGS --headless true
63+
TEST_SUFFIX _headless
4464
)
4565

46-
add_executable(instruction_executor_test test_instruction_executor.cpp)
47-
target_link_libraries(instruction_executor_test PRIVATE ur_client_library::urcl GTest::gtest_main)
48-
gtest_add_tests(TARGET instruction_executor_test
66+
# InstructionExecutor tests
67+
add_executable(instruction_executor_test_urcap test_instruction_executor.cpp)
68+
target_link_libraries(instruction_executor_test_urcap PRIVATE ur_client_library::urcl GTest::gtest_main)
69+
gtest_add_tests(TARGET instruction_executor_test_urcap
70+
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
71+
EXTRA_ARGS --headless false
72+
TEST_SUFFIX _urcap
73+
)
74+
add_executable(instruction_executor_test_headless test_instruction_executor.cpp)
75+
target_link_libraries(instruction_executor_test_headless PRIVATE ur_client_library::urcl GTest::gtest_main)
76+
gtest_add_tests(TARGET instruction_executor_test_headless
4977
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
78+
EXTRA_ARGS --headless true
79+
TEST_SUFFIX _headless
5080
)
5181
else()
5282
message(STATUS "Skipping integration tests.")

tests/test_instruction_executor.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ const std::string OUTPUT_RECIPE = "resources/rtde_output_recipe.txt";
4444
const std::string INPUT_RECIPE = "resources/rtde_input_recipe.txt";
4545
const std::string CALIBRATION_CHECKSUM = "calib_12788084448423163542";
4646
std::string ROBOT_IP = "192.168.56.101";
47+
bool g_HEADLESS = true;
4748

4849
std::unique_ptr<ExampleRobotWrapper> g_my_robot;
4950

@@ -55,14 +56,7 @@ class InstructionExecutorTest : public ::testing::Test
5556
static void SetUpTestSuite()
5657
{
5758
// Setup driver
58-
bool headless_mode = false;
59-
auto headless_env = std::getenv("HEADLESS_MODE");
60-
if (headless_env != nullptr)
61-
{
62-
headless_mode = std::string(headless_env) == "true" || std::string(headless_env) == "1" ||
63-
std::string(headless_env) == "True" || std::string(headless_env) == "TRUE";
64-
}
65-
g_my_robot = std::make_unique<ExampleRobotWrapper>(ROBOT_IP, OUTPUT_RECIPE, INPUT_RECIPE, headless_mode,
59+
g_my_robot = std::make_unique<ExampleRobotWrapper>(ROBOT_IP, OUTPUT_RECIPE, INPUT_RECIPE, g_HEADLESS,
6660
"external_control.urp", SCRIPT_FILE);
6761
}
6862
void SetUp() override
@@ -286,6 +280,12 @@ int main(int argc, char* argv[])
286280
ROBOT_IP = argv[i + 1];
287281
break;
288282
}
283+
if (std::string(argv[i]) == "--headless" && i + 1 < argc)
284+
{
285+
std::string headless = argv[i + 1];
286+
g_HEADLESS = headless == "true" || headless == "1" || headless == "True" || headless == "TRUE";
287+
break;
288+
}
289289
}
290290

291291
return RUN_ALL_TESTS();

tests/test_spline_interpolation.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ const std::string OUTPUT_RECIPE = "resources/rtde_output_recipe_spline.txt";
5151
const std::string INPUT_RECIPE = "resources/rtde_input_recipe.txt";
5252
const std::string CALIBRATION_CHECKSUM = "calib_12788084448423163542";
5353
std::string g_ROBOT_IP = "192.168.56.101";
54+
bool g_HEADLESS = true;
5455

5556
std::unique_ptr<ExampleRobotWrapper> g_my_robot;
5657

@@ -96,14 +97,7 @@ class SplineInterpolationTest : public ::testing::Test
9697
out_file.close();
9798

9899
// Setup driver
99-
bool headless_mode = false;
100-
auto headless_env = std::getenv("HEADLESS_MODE");
101-
if (headless_env != nullptr)
102-
{
103-
headless_mode = std::string(headless_env) == "true" || std::string(headless_env) == "1" ||
104-
std::string(headless_env) == "True" || std::string(headless_env) == "TRUE";
105-
}
106-
g_my_robot = std::make_unique<ExampleRobotWrapper>(g_ROBOT_IP, OUTPUT_RECIPE, INPUT_RECIPE, headless_mode,
100+
g_my_robot = std::make_unique<ExampleRobotWrapper>(g_ROBOT_IP, OUTPUT_RECIPE, INPUT_RECIPE, g_HEADLESS,
107101
"external_control.urp", SPLINE_SCRIPT_FILE);
108102

109103
g_my_robot->startRTDECommununication(true);
@@ -1111,6 +1105,12 @@ int main(int argc, char* argv[])
11111105
g_ROBOT_IP = argv[i + 1];
11121106
break;
11131107
}
1108+
if (std::string(argv[i]) == "--headless" && i + 1 < argc)
1109+
{
1110+
std::string headless = argv[i + 1];
1111+
g_HEADLESS = headless == "true" || headless == "1" || headless == "True" || headless == "TRUE";
1112+
break;
1113+
}
11141114
}
11151115

11161116
return RUN_ALL_TESTS();

tests/test_ur_driver.cpp

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include <gtest/gtest.h>
3232

3333
#include <ur_client_library/ur/dashboard_client.h>
34+
#include <thread>
3435
#define private public
3536
#include <ur_client_library/ur/ur_driver.h>
3637
#include <ur_client_library/example_robot_wrapper.h>
@@ -42,6 +43,7 @@ const std::string OUTPUT_RECIPE = "resources/rtde_output_recipe.txt";
4243
const std::string INPUT_RECIPE = "resources/rtde_input_recipe.txt";
4344
const std::string CALIBRATION_CHECKSUM = "calib_12788084448423163542";
4445
std::string g_ROBOT_IP = "192.168.56.101";
46+
bool g_HEADLESS = true;
4547

4648
std::unique_ptr<ExampleRobotWrapper> g_my_robot;
4749

@@ -51,14 +53,7 @@ class UrDriverTest : public ::testing::Test
5153
static void SetUpTestSuite()
5254
{
5355
// Setup driver
54-
bool headless_mode = false;
55-
auto headless_env = std::getenv("HEADLESS_MODE");
56-
if (headless_env != nullptr)
57-
{
58-
headless_mode = std::string(headless_env) == "true" || std::string(headless_env) == "1" ||
59-
std::string(headless_env) == "True" || std::string(headless_env) == "TRUE";
60-
}
61-
g_my_robot = std::make_unique<ExampleRobotWrapper>(g_ROBOT_IP, OUTPUT_RECIPE, INPUT_RECIPE, headless_mode,
56+
g_my_robot = std::make_unique<ExampleRobotWrapper>(g_ROBOT_IP, OUTPUT_RECIPE, INPUT_RECIPE, g_HEADLESS,
6257
"external_control.urp", SCRIPT_FILE);
6358

6459
g_my_robot->startRTDECommununication(true);
@@ -231,15 +226,15 @@ TEST_F(UrDriverTest, target_outside_limits_pose)
231226

232227
TEST_F(UrDriverTest, send_robot_program_retry_on_failure)
233228
{
234-
// Start robot program
235-
g_my_robot->resendRobotProgram();
236-
EXPECT_TRUE(g_my_robot->waitForProgramRunning(1000));
237-
238229
// Check that sendRobotProgram is robust to the secondary stream being disconnected. This is what happens when
239230
// switching from Remote to Local and back to Remote mode for example.
240231
g_my_robot->ur_driver_->secondary_stream_->close();
241232

233+
std::this_thread::sleep_for(std::chrono::milliseconds(100));
234+
242235
EXPECT_TRUE(g_my_robot->resendRobotProgram());
236+
237+
EXPECT_TRUE(g_my_robot->waitForProgramRunning());
243238
}
244239

245240
TEST_F(UrDriverTest, reset_rtde_client)
@@ -263,6 +258,12 @@ int main(int argc, char* argv[])
263258
g_ROBOT_IP = argv[i + 1];
264259
break;
265260
}
261+
if (std::string(argv[i]) == "--headless" && i + 1 < argc)
262+
{
263+
std::string headless = argv[i + 1];
264+
g_HEADLESS = headless == "true" || headless == "1" || headless == "True" || headless == "TRUE";
265+
break;
266+
}
266267
}
267268

268269
return RUN_ALL_TESTS();

0 commit comments

Comments
 (0)