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