DDS  ver. 2.0
OctopusTestImpl.h
Go to the documentation of this file.
1 // Copyright 2016 GSI, Inc. All rights reserved.
2 //
3 //
4 //
5 #ifndef DDS_OCTOPUS_TESTIMPL_H
6 #define DDS_OCTOPUS_TESTIMPL_H
7 
8 // DDS
9 #include "OctopusProtocol.h"
10 #include "Options.h"
11 #include "dds_intercom.h"
12 // STD
13 #include <condition_variable>
14 #include <iostream>
15 #include <mutex>
16 // BOOST
17 #include <boost/property_tree/json_parser.hpp>
18 
19 #define BEGIN_OCTOPUS_MSG_MAP(name) \
20  std::string _name() const \
21  { \
22  return name; \
23  } \
24  \
25  void _onCustomCmd(const std::string& _command, const std::string& _condition, uint64_t _senderId) \
26  { \
27  boost::property_tree::ptree root; \
28  std::stringstream ss; \
29  ss << _command; \
30  boost::property_tree::read_json(ss, root); \
31  for (const auto& node : root) \
32  { \
33  if (node.first == dds_octopus::SOctopusProtocol_Log::class_name()) \
34  { \
35  dds_octopus::SOctopusProtocol_Log log; \
36  log.init(node.second); \
37  std::cout << "Task: " << log.m_sVal << std::endl; \
38  continue; \
39  }
40 
41 #define OCTOPUS_MSG_HANDLER(func, cmd) \
42  else if (node.first == cmd::class_name()) \
43  { \
44  cmd var; \
45  var.init(node.second); \
46  func(var, _senderId); \
47  continue; \
48  }
49 
50 #define END_OCTOPUS_MSG_MAP \
51  } \
52  }
53 
54 namespace dds
55 {
56  namespace dds_octopus
57  {
59  {
63  };
64 
65  template <class T>
67  {
68  public:
69  COctopusTestImpl(const SOptions_t& _options)
71  , m_options(_options)
72  {
73  }
75  {
76  }
77 
78  public:
79  void init()
80  {
82  m_customCmd.subscribe(boost::bind(&COctopusTestImpl::onCustomCmd, this, _1, _2, _3));
83 
85  }
86 
87  ETestStatus execute(const size_t _timeoutInSec)
88  {
89  auto start_time = std::chrono::high_resolution_clock::now();
90 
91  T* pThis = static_cast<T*>(this);
92  std::cout << "================================\n";
93  std::cout << "Test case: " << pThis->_name() << "\n";
94 
95  pThis->_init();
96 
97  std::unique_lock<std::mutex> lock(m_waitMutex);
98  if (std::cv_status::timeout ==
99  m_waitCondition.wait_until(lock, start_time + std::chrono::seconds(_timeoutInSec)))
100  {
102  std::cout << "RESULT: FAILED. Timeout (" << _timeoutInSec << " sec) reached\n";
103  }
104  else
105  {
106  switch (m_status)
107  {
108  case TS_OK:
109  std::cout << "RESULT: OK\n";
110  break;
111  default:
112  std::cout << "RESULT: FAILED\n";
113  }
114  }
115  auto execTime = std::chrono::high_resolution_clock::now() - start_time;
116  std::chrono::milliseconds execTimeMs = std::chrono::duration_cast<std::chrono::milliseconds>(execTime);
117  std::cout << "Execution time: " << std::chrono::duration<double>(execTimeMs).count() << " s\n";
118  std::cout << "================================" << std::endl;
119 
120  return m_status;
121  }
122 
123  protected:
124  void onServiceError(const dds::intercom_api::EErrorCode _errorCode, const std::string& _errorMsg)
125  {
126  std::cerr << "Error: " << _errorMsg << std::endl;
127  }
128 
129  void onCustomCmd(const std::string& _command, const std::string& _condition, uint64_t _senderId)
130  {
131  T* pThis = static_cast<T*>(this);
132  pThis->_onCustomCmd(_command, _condition, _senderId);
133  }
134 
135  protected:
138  std::mutex m_waitMutex;
139  std::condition_variable m_waitCondition;
142  };
143  }
144 }
145 #endif
std::mutex m_waitMutex
Definition: OctopusTestImpl.h:138
Definition: OctopusTestImpl.h:61
ETestStatus execute(const size_t _timeoutInSec)
Definition: OctopusTestImpl.h:87
COctopusTestImpl(const SOptions_t &_options)
Definition: OctopusTestImpl.h:69
dds::intercom_api::CCustomCmd m_customCmd
Definition: OctopusTestImpl.h:137
Definition: dds_intercom.h:77
std::condition_variable m_waitCondition
Definition: OctopusTestImpl.h:139
ETestStatus
Definition: OctopusTestImpl.h:58
void init()
Definition: OctopusTestImpl.h:79
void start(const std::string &_sessionID="")
Start DDS service, i.e. receiving and sending messages.
Definition: dds_intercom.cpp:25
~COctopusTestImpl()
Definition: OctopusTestImpl.h:74
Definition: dds-octopus/src/Options.h:23
EErrorCode
Error codes for intercom API.
Definition: dds_intercom_error_codes.h:17
dds::intercom_api::CIntercomService m_intercomService
Definition: OctopusTestImpl.h:136
ETestStatus m_status
Definition: OctopusTestImpl.h:140
Definition: dds-agent/src/AgentConnectionManager.h:18
Definition: dds_intercom.h:32
void subscribeOnError(errorSignal_t::slot_function_type _subscriber)
Subscribe on error messages from DDS intercom service.
Definition: dds_intercom.cpp:20
void subscribe(signal_t::slot_function_type _subscriber)
Definition: dds_intercom.cpp:86
SOptions_t m_options
Definition: OctopusTestImpl.h:141
void onServiceError(const dds::intercom_api::EErrorCode _errorCode, const std::string &_errorMsg)
Definition: OctopusTestImpl.h:124
Definition: OctopusTestImpl.h:62
Definition: OctopusTestImpl.h:66
void onCustomCmd(const std::string &_command, const std::string &_condition, uint64_t _senderId)
Definition: OctopusTestImpl.h:129
Definition: OctopusTestImpl.h:60