unittest_canopen_braketest_adapter.cpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2019 Pilz GmbH & Co. KG
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8 
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU Lesser General Public License for more details.
13 
14  * You should have received a copy of the GNU Lesser General Public License
15  * along with this program. If not, see <http://www.gnu.org/licenses/>.
16  */
17 
18 #include <functional>
19 #include <memory>
20 
21 #include <gtest/gtest.h>
22 #include <gmock/gmock.h>
23 
24 #include <ros/ros.h>
25 #include <canopen_chain_node/GetObject.h>
26 #include <canopen_chain_node/SetObject.h>
27 
30 #include <prbt_hardware_support/BrakeTest.h>
33 
35 {
36 
37 using namespace prbt_hardware_support;
38 using namespace testing;
39 
40 using canopen_chain_node::GetObjectRequest;
41 using canopen_chain_node::GetObjectResponse;
42 using canopen_chain_node::SetObjectRequest;
43 using canopen_chain_node::SetObjectResponse;
44 
45 static const std::string BRAKE_TEST_SERVICE_NAME{"/prbt/braketest_adapter_node/trigger_braketest"};
46 
47 static const std::string BRAKE_TEST_DURATION_OBJECT_INDEX{"2060sub1"};
48 static const std::string START_BRAKE_TEST_OBJECT_INDEX{"2060sub2"};
49 static const std::string BRAKE_TEST_STATUS_OBJECT_INDEX{"2060sub3"};
50 
51 static const std::string NODE_NAMES_PARAMETER_NAME{"/prbt/driver/nodes"};
52 static const std::string BRAKETEST_REQUIRED_NAME{"braketest_required"};
53 static const std::string NODE_NAMES_PREFIX{"prbt_joint_"};
54 static constexpr int NODE_COUNT{6};
55 static const std::vector<size_t> NODE_TEST_SET{{0, 2, 5}};
56 
57 #define DEFAULT_SETUP \
58 CANOpenChainNodeMock canopen_chain_node;\
59 ros::NodeHandle nh_adapter("/prbt/braketest_adapter_node");\
60 prbt_hardware_support::CANOpenBrakeTestAdapter canopen_braketest_adapter(nh_adapter);\
61 ros::ServiceClient brake_test_srv_client = nh_.serviceClient<BrakeTest>(BRAKE_TEST_SERVICE_NAME);\
62 \
63 ASSERT_TRUE(brake_test_srv_client.exists()) << "Brake test service not available.";\
64 
65 
66 class CanOpenBraketestAdapterTest : public Test
67 {
68 protected:
70 };
71 
78 TEST_F(CanOpenBraketestAdapterTest, testCANOpenBrakeTestAdapterExceptionDtor)
79 {
80  {
81  std::shared_ptr<CANOpenBrakeTestAdapterException> ex {new CANOpenBrakeTestAdapterException("Test msg")};
82  }
83 }
84 
98 TEST_F(CanOpenBraketestAdapterTest, testBrakeTestServiceWithoutCANGetService)
99 {
100 
101  CANOpenChainNodeMock canopen_chain_node;
102  canopen_chain_node.shutdownGetService();
103 
104  EXPECT_THROW(prbt_hardware_support::CANOpenBrakeTestAdapter canopen_braketest_adapter(nh_),
106 }
107 
121 TEST_F(CanOpenBraketestAdapterTest, testBrakeTestServiceWithoutCANSetService)
122 {
123 
124  CANOpenChainNodeMock canopen_chain_node;
125  canopen_chain_node.shutdownSetService();
126 
127  EXPECT_THROW(prbt_hardware_support::CANOpenBrakeTestAdapter canopen_braketest_adapter(nh_),
129 }
130 
146 TEST_F(CanOpenBraketestAdapterTest, testBrakeTestServiceWithoutNodeParameters)
147 {
149 
150  /**********
151  * Step 1 *
152  **********/
154  ASSERT_TRUE(nh_.getParam(NODE_NAMES_PARAMETER_NAME, rpc));
155  nh_.deleteParam(NODE_NAMES_PARAMETER_NAME);
156 
157  /**********
158  * Step 3 *
159  **********/
160  BrakeTest srv;
161  EXPECT_TRUE(brake_test_srv_client.call(srv)) << "Failed to call brake test service.";
162  EXPECT_FALSE(srv.response.success);
163  EXPECT_EQ(BrakeTestErrorCodes::GET_NODE_NAMES_FAILURE, srv.response.error_code.value);
164 
165  nh_.setParam(NODE_NAMES_PARAMETER_NAME, rpc);
166 }
167 
184 TEST_F(CanOpenBraketestAdapterTest, testBrakeTestServiceWithNodeParametersTypeError)
185 {
187 
188  /**********
189  * Step 1 *
190  **********/
192  ASSERT_TRUE(nh_.getParam(NODE_NAMES_PARAMETER_NAME, rpc));
193  auto param_modified_name = NODE_NAMES_PARAMETER_NAME + "/" + NODE_NAMES_PREFIX + "1/" + BRAKETEST_REQUIRED_NAME;
194  nh_.setParam(param_modified_name, 99);
195 
196  /**********
197  * Step 3 *
198  **********/
199  BrakeTest srv;
200  EXPECT_TRUE(brake_test_srv_client.call(srv)) << "Failed to call brake test service.";
201  EXPECT_FALSE(srv.response.success);
202  EXPECT_EQ(BrakeTestErrorCodes::GET_NODE_NAMES_FAILURE, srv.response.error_code.value);
203 
204  nh_.setParam(NODE_NAMES_PARAMETER_NAME, rpc);
205 }
206 
228 TEST_F(CanOpenBraketestAdapterTest, testGetBrakeTestDurationServiceCallFailure)
229 {
231 
232  for (size_t node_index : NODE_TEST_SET)
233  {
234  std::string node{NODE_NAMES_PREFIX + std::to_string(node_index + 1)};
235 
236  /**********
237  * Step 1 *
238  **********/
239  // Avoid unmatched expectations
240  canopen_chain_node.expectAnything();
241 
242  EXPECT_CALL(canopen_chain_node, get_obj(AllOf(Field(&GetObjectRequest::node, node),
243  Field(&GetObjectRequest::object, BRAKE_TEST_DURATION_OBJECT_INDEX)),
244  _))
245  .Times(AtLeast(1))
246  .WillRepeatedly(Return(false));
247 
248  EXPECT_CALL(canopen_chain_node, set_obj(AllOf(Field(&SetObjectRequest::node, node),
249  Field(&SetObjectRequest::object, START_BRAKE_TEST_OBJECT_INDEX)), _))
250  .Times(0);
251 
252  /**********
253  * Step 2 *
254  **********/
255  BrakeTest srv;
256  EXPECT_TRUE(brake_test_srv_client.call(srv)) << "Failed to call brake test service.";
257  EXPECT_FALSE(srv.response.success);
258  EXPECT_EQ(BrakeTestErrorCodes::GET_DURATION_FAILURE, srv.response.error_code.value);
259 
260  /**********
261  * Step 3 *
262  **********/
263  ASSERT_TRUE(Mock::VerifyAndClearExpectations(&canopen_chain_node));
264  }
265 }
266 
288 TEST_F(CanOpenBraketestAdapterTest, testGetBrakeTestDurationServiceResponseFailure)
289 {
291 
292  GetObjectResponse duration_resp;
293  duration_resp.success = false;
294 
295  for (size_t node_index : NODE_TEST_SET)
296  {
297  std::string node{NODE_NAMES_PREFIX + std::to_string(node_index + 1)};
298 
299  /**********
300  * Step 1 *
301  **********/
302  // Avoid unmatched expectations
303  canopen_chain_node.expectAnything();
304 
305  EXPECT_CALL(canopen_chain_node, get_obj(AllOf(Field(&GetObjectRequest::node, node),
306  Field(&GetObjectRequest::object, BRAKE_TEST_DURATION_OBJECT_INDEX)),
307  _))
308  .Times(AtLeast(1))
309  .WillRepeatedly(DoAll(SetArgReferee<1>(duration_resp), Return(true)));
310 
311  EXPECT_CALL(canopen_chain_node, set_obj(AllOf(Field(&SetObjectRequest::node, node),
312  Field(&SetObjectRequest::object, START_BRAKE_TEST_OBJECT_INDEX)), _))
313  .Times(0);
314 
315  /**********
316  * Step 2 *
317  **********/
318  BrakeTest srv;
319  EXPECT_TRUE(brake_test_srv_client.call(srv)) << "Failed to call brake test service.";
320  EXPECT_FALSE(srv.response.success);
321  EXPECT_EQ(BrakeTestErrorCodes::GET_DURATION_FAILURE, srv.response.error_code.value);
322 
323  /**********
324  * Step 3 *
325  **********/
326  ASSERT_TRUE(Mock::VerifyAndClearExpectations(&canopen_chain_node));
327  }
328 }
329 
330 
350 TEST_F(CanOpenBraketestAdapterTest, testStartBrakeTestServiceCallSuccess)
351 {
353 
354  /**********
355  * Step 1 *
356  **********/
357  canopen_chain_node.setDefaultActions();
358 
359  /**********
360  * Step 2 *
361  **********/
362  BrakeTest srv;
363  EXPECT_TRUE(brake_test_srv_client.call(srv)) << "Failed to call brake test service.";
364  EXPECT_TRUE(srv.response.success);
365 }
366 
388 TEST_F(CanOpenBraketestAdapterTest, testStartBrakeTestServiceCallFailure)
389 {
391 
392  for (size_t node_index : NODE_TEST_SET)
393  {
394  std::string node{NODE_NAMES_PREFIX + std::to_string(node_index + 1)};
395 
396  /**********
397  * Step 1 *
398  **********/
399  // Avoid unmatched expectations
400  canopen_chain_node.expectAnything();
401 
402  EXPECT_CALL(canopen_chain_node, get_obj(AllOf(Field(&GetObjectRequest::node, node),
403  Field(&GetObjectRequest::object, BRAKE_TEST_DURATION_OBJECT_INDEX)),
404  _))
405  .Times(AtLeast(1));
406 
407  EXPECT_CALL(canopen_chain_node, set_obj(AllOf(Field(&SetObjectRequest::node, node),
408  Field(&SetObjectRequest::object, START_BRAKE_TEST_OBJECT_INDEX)), _))
409  .WillOnce(Return(false));
410 
411  /**********
412  * Step 2 *
413  **********/
414  BrakeTest srv;
415  EXPECT_TRUE(brake_test_srv_client.call(srv)) << "Failed to call brake test service.";
416  EXPECT_FALSE(srv.response.success);
417  EXPECT_EQ(BrakeTestErrorCodes::START_BRAKE_TEST_FAILURE, srv.response.error_code.value);
418 
419  /**********
420  * Step 3 *
421  **********/
422  Mock::VerifyAndClearExpectations(&canopen_chain_node);
423  }
424 }
425 
447 TEST_F(CanOpenBraketestAdapterTest, testStartBrakeTestServiceResponseFailure)
448 {
450 
451  SetObjectResponse start_resp;
452  start_resp.success = false;
453 
454  for (size_t node_index : NODE_TEST_SET)
455  {
456  std::string node{NODE_NAMES_PREFIX + std::to_string(node_index + 1)};
457 
458  /**********
459  * Step 1 *
460  **********/
461  // Avoid unmatched expectations
462  canopen_chain_node.expectAnything();
463 
464  EXPECT_CALL(canopen_chain_node, get_obj(AllOf(Field(&GetObjectRequest::node, node),
465  Field(&GetObjectRequest::object, BRAKE_TEST_DURATION_OBJECT_INDEX)),
466  _))
467  .Times(AtLeast(1));
468 
469  EXPECT_CALL(canopen_chain_node, set_obj(AllOf(Field(&SetObjectRequest::node, node),
470  Field(&SetObjectRequest::object, START_BRAKE_TEST_OBJECT_INDEX)), _))
471  .WillOnce(DoAll(SetArgReferee<1>(start_resp), Return(true)));
472 
473  /**********
474  * Step 2 *
475  **********/
476  BrakeTest srv;
477  EXPECT_TRUE(brake_test_srv_client.call(srv)) << "Failed to call brake test service.";
478  EXPECT_FALSE(srv.response.success);
479  EXPECT_EQ(BrakeTestErrorCodes::START_BRAKE_TEST_FAILURE, srv.response.error_code.value);
480 
481  /**********
482  * Step 3 *
483  **********/
484  Mock::VerifyAndClearExpectations(&canopen_chain_node);
485  }
486 }
487 
507 TEST_F(CanOpenBraketestAdapterTest, testBrakeTestStatusServiceCallFailure)
508 {
510 
511  for (size_t node_index : NODE_TEST_SET)
512  {
513  std::string node{NODE_NAMES_PREFIX + std::to_string(node_index + 1)};
514 
515  /**********
516  * Step 1 *
517  **********/
518  // Avoid unmatched expectations
519  canopen_chain_node.expectAnything();
520 
521  EXPECT_CALL(canopen_chain_node, get_obj(AllOf(Field(&GetObjectRequest::node, node),
522  Field(&GetObjectRequest::object, BRAKE_TEST_STATUS_OBJECT_INDEX)),
523  _))
524  .Times(AtLeast(1))
525  .WillRepeatedly(Return(false));
526 
527  /**********
528  * Step 2 *
529  **********/
530  BrakeTest srv;
531  EXPECT_TRUE(brake_test_srv_client.call(srv)) << "Failed to call brake test service.";
532  EXPECT_FALSE(srv.response.success);
533  EXPECT_EQ(BrakeTestErrorCodes::GET_STATUS_FAILURE, srv.response.error_code.value);
534 
535  /**********
536  * Step 3 *
537  **********/
538  Mock::VerifyAndClearExpectations(&canopen_chain_node);
539  }
540 }
541 
561 TEST_F(CanOpenBraketestAdapterTest, testBrakeTestStatusServiceResponseFailure)
562 {
564 
565  GetObjectResponse status_resp;
566  status_resp.success = false;
567 
568  for (size_t node_index : NODE_TEST_SET)
569  {
570  std::string node{NODE_NAMES_PREFIX + std::to_string(node_index + 1)};
571 
572  /**********
573  * Step 1 *
574  **********/
575  // Avoid unmatched expectations
576  canopen_chain_node.expectAnything();
577 
578  EXPECT_CALL(canopen_chain_node, get_obj(AllOf(Field(&GetObjectRequest::node, node),
579  Field(&GetObjectRequest::object, BRAKE_TEST_STATUS_OBJECT_INDEX)),
580  _))
581  .Times(AtLeast(1))
582  .WillRepeatedly(DoAll(SetArgReferee<1>(status_resp), Return(true)));
583 
584  /**********
585  * Step 2 *
586  **********/
587  BrakeTest srv;
588  EXPECT_TRUE(brake_test_srv_client.call(srv)) << "Failed to call brake test service.";
589  EXPECT_FALSE(srv.response.success);
590  EXPECT_EQ(BrakeTestErrorCodes::GET_STATUS_FAILURE, srv.response.error_code.value);
591 
592  /**********
593  * Step 3 *
594  **********/
595  Mock::VerifyAndClearExpectations(&canopen_chain_node);
596  }
597 }
598 
617 TEST_F(CanOpenBraketestAdapterTest, testBrakeTestStatusUnknown)
618 {
620 
621  GetObjectResponse status_resp;
622  status_resp.success = true;
623  status_resp.value = "\0";
624 
625  for (size_t node_index : NODE_TEST_SET)
626  {
627  std::string node{NODE_NAMES_PREFIX + std::to_string(node_index + 1)};
628 
629  /**********
630  * Step 1 *
631  **********/
632  // Avoid unmatched expectations
633  canopen_chain_node.expectAnything();
634 
635  EXPECT_CALL(canopen_chain_node, get_obj(AllOf(Field(&GetObjectRequest::node, node),
636  Field(&GetObjectRequest::object, BRAKE_TEST_STATUS_OBJECT_INDEX)),
637  _))
638  .Times(AtLeast(1))
639  .WillRepeatedly(DoAll(SetArgReferee<1>(status_resp), Return(true)));
640 
641  /**********
642  * Step 2 *
643  **********/
644  BrakeTest srv;
645  EXPECT_TRUE(brake_test_srv_client.call(srv)) << "Failed to call brake test service.";
646  EXPECT_FALSE(srv.response.success);
647  EXPECT_EQ(BrakeTestErrorCodes::STATUS_UNKNOWN, srv.response.error_code.value);
648 
649  /**********
650  * Step 3 *
651  **********/
652  Mock::VerifyAndClearExpectations(&canopen_chain_node);
653  }
654 }
655 
674 TEST_F(CanOpenBraketestAdapterTest, testBrakeTestStatusPerformed)
675 {
677 
678  GetObjectResponse status_resp;
679  status_resp.success = true;
680  status_resp.value = "\x01";
681 
682  for (size_t node_index : NODE_TEST_SET)
683  {
684  std::string node{NODE_NAMES_PREFIX + std::to_string(node_index + 1)};
685 
686  /**********
687  * Step 1 *
688  **********/
689  // Avoid unmatched expectations
690  canopen_chain_node.expectAnything();
691 
692  EXPECT_CALL(canopen_chain_node, get_obj(AllOf(Field(&GetObjectRequest::node, node),
693  Field(&GetObjectRequest::object, BRAKE_TEST_STATUS_OBJECT_INDEX)),
694  _))
695  .Times(AtLeast(1))
696  .WillRepeatedly(DoAll(SetArgReferee<1>(status_resp), Return(true)));
697 
698  /**********
699  * Step 2 *
700  **********/
701  BrakeTest srv;
702  EXPECT_TRUE(brake_test_srv_client.call(srv)) << "Failed to call brake test service.";
703  EXPECT_FALSE(srv.response.success);
704  EXPECT_EQ(BrakeTestErrorCodes::STATUS_PERFORMING, srv.response.error_code.value);
705 
706  /**********
707  * Step 3 *
708  **********/
709  Mock::VerifyAndClearExpectations(&canopen_chain_node);
710  }
711 }
712 
731 TEST_F(CanOpenBraketestAdapterTest, testBrakeTestStatusNotSuccessful)
732 {
734 
735  GetObjectResponse status_resp;
736  status_resp.success = true;
737  status_resp.value = "\x03";
738 
739  for (size_t node_index : NODE_TEST_SET)
740  {
741  std::string node{NODE_NAMES_PREFIX + std::to_string(node_index + 1)};
742 
743  /**********
744  * Step 1 *
745  **********/
746  // Avoid unmatched expectations
747  canopen_chain_node.expectAnything();
748 
749  EXPECT_CALL(canopen_chain_node, get_obj(AllOf(Field(&GetObjectRequest::node, node),
750  Field(&GetObjectRequest::object, BRAKE_TEST_STATUS_OBJECT_INDEX)),
751  _))
752  .Times(AtLeast(1))
753  .WillRepeatedly(DoAll(SetArgReferee<1>(status_resp), Return(true)));
754 
755  /**********
756  * Step 2 *
757  **********/
758  BrakeTest srv;
759  EXPECT_TRUE(brake_test_srv_client.call(srv)) << "Failed to call brake test service.";
760  EXPECT_FALSE(srv.response.success);
761  EXPECT_EQ(BrakeTestErrorCodes::STATUS_NO_SUCCESS, srv.response.error_code.value);
762 
763  /**********
764  * Step 3 *
765  **********/
766  Mock::VerifyAndClearExpectations(&canopen_chain_node);
767  }
768 }
769 
789 TEST_F(CanOpenBraketestAdapterTest, testBrakeTestStatusNotActivelyControlled)
790 {
792 
793  GetObjectResponse status_resp;
794  status_resp.success = true;
795  status_resp.value = "\x04";
796 
797  for (size_t node_index : NODE_TEST_SET)
798  {
799  std::string node{NODE_NAMES_PREFIX + std::to_string(node_index + 1)};
800 
801  /**********
802  * Step 1 *
803  **********/
804  // Avoid unmatched expectations
805  canopen_chain_node.expectAnything();
806 
807  EXPECT_CALL(canopen_chain_node, get_obj(AllOf(Field(&GetObjectRequest::node, node),
808  Field(&GetObjectRequest::object, BRAKE_TEST_STATUS_OBJECT_INDEX)),
809  _))
810  .Times(AtLeast(1))
811  .WillRepeatedly(DoAll(SetArgReferee<1>(status_resp), Return(true)));
812 
813  /**********
814  * Step 2 *
815  **********/
816  BrakeTest srv;
817  EXPECT_TRUE(brake_test_srv_client.call(srv)) << "Failed to call brake test service.";
818  EXPECT_FALSE(srv.response.success);
819  EXPECT_EQ(BrakeTestErrorCodes::STATUS_NO_CONTROL, srv.response.error_code.value);
820 
821  /**********
822  * Step 3 *
823  **********/
824  Mock::VerifyAndClearExpectations(&canopen_chain_node);
825  }
826 }
827 
828 } // namespace brake_test_executor_test
829 
830 int main(int argc, char *argv[])
831 {
832  ros::init(argc, argv, "unittest_brake_test_executor");
833  ros::NodeHandle nh;
834 
836  spinner.start();
837 
838  testing::InitGoogleMock(&argc, argv);
839  return RUN_ALL_TESTS();
840 }
static const std::vector< size_t > NODE_TEST_SET
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
void shutdownSetService()
Un-advertise the set service.
void shutdownGetService()
Un-advertise the get service.
int main(int argc, char *argv[])
void spinner()
Executes the brake test for all joints. A brake test is triggered via service call.
TEST_F(CanOpenBraketestAdapterTest, testCANOpenBrakeTestAdapterExceptionDtor)


prbt_hardware_support
Author(s):
autogenerated on Tue Feb 2 2021 03:50:17