LCOV - code coverage report
Current view: top level - test - testUtils.h (source / functions) Hit Total Coverage
Test: main_coverage.info Lines: 45 48 93.8 %
Date: 2022-06-06 13:34:00 Functions: 6 6 100.0 %

          Line data    Source code
       1             : #ifndef TESTUTILS_H
       2             : #define TESTUTILS_H
       3             : 
       4             : #include <unistd.h>
       5             : #include <stdio.h>
       6             : #include <sys/types.h>
       7             : #include <sys/wait.h>
       8             : 
       9             : //for the function prepareROSForTests
      10             : #include <rclcpp/rclcpp.hpp>
      11             : #include <end_effector/Utils.h>
      12             : 
      13             : #include <ament_index_cpp/get_package_share_directory.hpp>
      14             : #include <ament_index_cpp/get_package_prefix.hpp>
      15             : 
      16             : 
      17             : /** Utils funcion to create process to run roscore,
      18             :  * gently copied from https://github.com/ADVRHumanoids/CartesianInterface/blob/refactor2020/tests/testutils.h
      19             :  */
      20             : 
      21             : namespace ROSEE {
      22             :     
      23             : namespace TestUtils {
      24             : 
      25             : class Process
      26             : {
      27             : 
      28             : public:
      29             : 
      30             :     Process(std::vector<std::string> args);
      31             : 
      32             :     int wait();
      33             : 
      34             :     void kill(int signal = SIGTERM);
      35             : 
      36             :     ~Process();
      37             : 
      38             : private:
      39             : 
      40             :     std::string _name;
      41             :     pid_t _pid;
      42             : 
      43             : };
      44             : 
      45          41 : Process::Process(std::vector<std::string>  args):
      46          41 :     _name(args[0])
      47             : {
      48          82 :     std::vector<const char *> args_cstr;
      49         205 :     for(auto& a : args) args_cstr.push_back(a.c_str());
      50          41 :     args_cstr.push_back(nullptr);
      51             : 
      52          41 :     char ** argv = (char**)args_cstr.data();
      53             : 
      54          41 :     _pid = ::fork();
      55             : 
      56          82 :     if(_pid == -1)
      57             :     {
      58           0 :         perror("fork");
      59           0 :         throw std::runtime_error("Unable to fork()");
      60             :     }
      61             : 
      62          82 :     if(_pid == 0)
      63             :     {
      64         164 :         std::vector<std::string> source_args{ament_index_cpp::get_package_prefix("end_effector") + "/../setup.bash"};
      65          41 :         char** source_args_char = (char**)source_args.data();
      66             :         
      67          41 :         ::execvp("source", source_args_char);
      68          41 :         ::execvp(argv[0], argv);
      69          41 :         perror("execvp");
      70           0 :         throw std::runtime_error("Unknown command");
      71             :     }
      72             : 
      73          41 : }
      74             : 
      75          41 : int Process::wait()
      76             : {
      77             :     int status;
      78          41 :     while(::waitpid(_pid, &status, 0) != _pid);
      79          41 :     printf("Child process '%s' exited with status %d\n", _name.c_str(), status);
      80          41 :     return status;
      81             : 
      82             : }
      83             : 
      84          41 : void Process::kill(int signal)
      85             : {
      86          41 :     ::kill(_pid, signal);
      87          41 :     printf("Killed process '%s' with signal %d\n", _name.c_str(), signal);
      88          41 : }
      89             : 
      90          41 : Process::~Process()
      91             : {
      92          41 :     kill(SIGINT);
      93          41 :     wait();
      94          41 : }
      95             : 
      96             : /**
      97             :  * @brief Function to be called in the main of each test, it runs roscore and fill
      98             :  * parameter server with robot models
      99             :  * 
     100             :  * @return a not 0 if some error happens
     101             :  */
     102         172 : rclcpp::Node::SharedPtr prepareROSForTests ( int argc, char **argv, std::string testName ) {
     103             :     
     104         172 :     auto node = rclcpp::Node::make_shared(testName);
     105             :     
     106             :     //fill ros param with file models, needed by moveit parserMoveIt
     107         516 :     std::string modelPathURDF = ament_index_cpp::get_package_share_directory("end_effector") + "/configs/urdf/" + argv[1];
     108         516 :     std::string modelPathSRDF = ament_index_cpp::get_package_share_directory("end_effector") + "/configs/srdf/" + argv[1];
     109             : 
     110             :     //Is there a better way to parse?
     111         344 :     std::ifstream urdf(modelPathURDF + ".urdf");
     112         344 :     std::ifstream srdf(modelPathSRDF + ".srdf");
     113         344 :     std::stringstream sUrdf, sSrdf;
     114         172 :     sUrdf << urdf.rdbuf();
     115         172 :     sSrdf << srdf.rdbuf();
     116             : 
     117         172 :     node->declare_parameter("robot_description", sUrdf.str()); 
     118         172 :     node->declare_parameter("robot_description_semantic", sSrdf.str()); 
     119             : //     node->declare_parameter("robot_name", argv[1]); 
     120             :     
     121         172 :     node->set_parameter(rclcpp::Parameter("robot_description", sUrdf.str()));
     122         172 :     node->set_parameter(rclcpp::Parameter("robot_description_semantic", sSrdf.str()));
     123             : //     node->set_parameter(rclcpp::Parameter("robot_name", argv[1]));
     124             : 
     125         344 :     return node;
     126             : }
     127             : 
     128             : 
     129             : } //namespace TestUtils
     130             : 
     131             : } //namespace ROSEE
     132             : 
     133             : 
     134             : namespace {
     135             :     
     136             : int argc_g;    
     137             : char** argv_g;
     138             : 
     139             : class MyTestEnvironment : public testing::Environment {
     140             :     
     141             : public:
     142             :     
     143          28 :     explicit MyTestEnvironment(int argc, char **argv ) {
     144          28 :         argc_g = argc;
     145          28 :         argv_g = argv;
     146          28 :     }
     147             : };
     148             :     
     149             : }
     150             : 
     151             : #endif // TESTUTILS_H

Generated by: LCOV version 1.14