DDS  ver. 3.4
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/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_status(TS_OK)
72  , m_options(_options)
73  {
74  }
76  {
77  }
78 
79  public:
80  void init()
81  {
83  m_customCmd.subscribe(boost::bind(&COctopusTestImpl::onCustomCmd, this, _1, _2, _3));
84 
86  }
87 
88  ETestStatus execute(const size_t _timeoutInSec)
89  {
90  auto start_time = std::chrono::high_resolution_clock::now();
91 
92  T* pThis = static_cast<T*>(this);
93  std::cout << "================================\n";
94  std::cout << "Test case: " << pThis->_name() << "\n";
95 
96  pThis->_init();
97 
98  std::unique_lock<std::mutex> lock(m_waitMutex);
99  if (std::cv_status::timeout ==
100  m_waitCondition.wait_until(lock, start_time + std::chrono::seconds(_timeoutInSec)))
101  {
103  std::cout << "RESULT: FAILED. Timeout (" << _timeoutInSec << " sec) reached\n";
104  }
105  else
106  {
107  switch (m_status)
108  {
109  case TS_OK:
110  std::cout << "RESULT: OK\n";
111  break;
112  default:
113  std::cout << "RESULT: FAILED\n";
114  }
115  }
116  auto execTime = std::chrono::high_resolution_clock::now() - start_time;
117  std::chrono::milliseconds execTimeMs = std::chrono::duration_cast<std::chrono::milliseconds>(execTime);
118  std::cout << "Execution time: " << std::chrono::duration<double>(execTimeMs).count() << " s\n";
119  std::cout << "================================" << std::endl;
120 
121  return m_status;
122  }
123 
124  protected:
125  void onServiceError(const dds::intercom_api::EErrorCode _errorCode, const std::string& _errorMsg)
126  {
127  std::cerr << "Error: " << _errorMsg << std::endl;
128  }
129 
130  void onCustomCmd(const std::string& _command, const std::string& _condition, uint64_t _senderId)
131  {
132  T* pThis = static_cast<T*>(this);
133  pThis->_onCustomCmd(_command, _condition, _senderId);
134  }
135 
136  protected:
139  std::mutex m_waitMutex;
140  std::condition_variable m_waitCondition;
143  };
144  } // namespace dds_octopus
145 } // namespace dds
146 #endif
std::mutex m_waitMutex
Definition: OctopusTestImpl.h:139
Definition: OctopusTestImpl.h:61
ETestStatus execute(const size_t _timeoutInSec)
Definition: OctopusTestImpl.h:88
COctopusTestImpl(const SOptions_t &_options)
Definition: OctopusTestImpl.h:69
dds::intercom_api::CCustomCmd m_customCmd
Definition: OctopusTestImpl.h:138
Definition: Intercom.h:93
std::condition_variable m_waitCondition
Definition: OctopusTestImpl.h:140
ETestStatus
Definition: OctopusTestImpl.h:58
void init()
Definition: OctopusTestImpl.h:80
void start(const std::string &_sessionID="")
Start DDS service, i.e. receiving and sending messages.
Definition: Intercom.cpp:37
~COctopusTestImpl()
Definition: OctopusTestImpl.h:75
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:137
ETestStatus m_status
Definition: OctopusTestImpl.h:141
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:142
void onServiceError(const dds::intercom_api::EErrorCode _errorCode, const std::string &_errorMsg)
Definition: OctopusTestImpl.h:125
Definition: OctopusTestImpl.h:62
Definition: OctopusTestImpl.h:66
void onCustomCmd(const std::string &_command, const std::string &_condition, uint64_t _senderId)
Definition: OctopusTestImpl.h:130
Definition: OctopusTestImpl.h:60