PeriodicExecutionContextTests.cpp
Go to the documentation of this file.
1 // -*- C++ -*-
12 /*
13  * $Log: PeriodicExecutionContextTests.cpp,v $
14  * Revision 1.3 2008/04/11 13:19:07 arafune
15  * Added some new tests.
16  *
17  * Revision 1.2 2008/04/09 13:10:37 arafune
18  * Added attach_executioncontext/detach_executioncontext method to the DFP class.
19  *
20  * Revision 1.1 2007/12/20 07:50:19 arafune
21  * *** empty log message ***
22  *
23  * Revision 1.2 2007/04/13 15:04:39 n-ando
24  * Now RTC::OK becomes RTC::RTC_OK in RTC.idl.
25  *
26  * Revision 1.1 2007/01/21 13:07:20 n-ando
27  * *** empty log message ***
28  *
29  *
30  */
31 
32 #ifndef PeriodicExecutionContext_cpp
33 #define PeriodicExecutionContext_cpp
34 
35 #include <cppunit/ui/text/TestRunner.h>
36 #include <cppunit/TextOutputter.h>
37 #include <cppunit/extensions/TestFactoryRegistry.h>
38 #include <cppunit/extensions/HelperMacros.h>
39 #include <cppunit/TestAssert.h>
40 
41 #include <rtm/idl/RTCSkel.h>
43 #include <rtm/CORBA_SeqUtil.h>
44 #include <rtm/RTObject.h>
45 
51 {
53  : public virtual POA_RTC::LightweightRTObject,
54  public virtual PortableServer::RefCountServantBase
55  {
56  protected:
57  typedef std::map<RTC::UniqueId, RTC::ExecutionContext_ptr> ExecContexts;
58  CORBA::Long m_nextUniqueId;
59  ExecContexts m_execContexts;
60  std::vector<std::string> m_log;
61  bool m_alive;
62  bool m_error;
63 
64  public:
66  : m_alive(true), m_error(false)
67  {
68  }
69 
70  // RTC::_impl_ComponentAction
71  virtual RTC::UniqueId attach_context(RTC::ExecutionContext_ptr exec_context)
72  {
73  m_log.push_back("attach_executioncontext");
74  m_execContexts.insert(
75  std::pair<RTC::UniqueId, RTC::ExecutionContext_ptr>(m_nextUniqueId++, exec_context));
76  return m_nextUniqueId;
77  }
79  {
80  m_log.push_back("detach_executioncontext");
81  m_execContexts.erase(ec_id);
82  return RTC::RTC_OK;
83  }
85  {
86  m_log.push_back("on_initialize");
87  return RTC::RTC_OK;
88  }
90  {
91  m_log.push_back("on_finalize");
92  return RTC::RTC_OK;
93  }
95  {
96  m_log.push_back("on_startup");
97  return RTC::RTC_OK;
98  }
100  {
101  m_log.push_back("on_shutdown");
102  return RTC::RTC_OK;
103  }
105  {
106  m_log.push_back("on_activated");
107  return returnCode(RTC::RTC_OK);
108  }
110  {
111  m_log.push_back("on_deactivated");
112  return RTC::RTC_OK;
113  }
115  {
116  m_log.push_back("on_aborting");
117  return RTC::RTC_OK;
118  }
120  {
121  m_log.push_back("on_error");
122  return RTC::RTC_OK;
123  }
125  {
126  m_log.push_back("on_reset");
127  return RTC::RTC_OK;
128  }
129 
130  // RTC::_impl_LightweightRTObject
132  {
133  m_log.push_back("initialize");
134  return RTC::RTC_OK;
135  }
137  {
138  m_log.push_back("finalize");
139  return RTC::RTC_OK;
140  }
142  {
143  m_log.push_back("exit");
144  return RTC::RTC_OK;
145  }
146  virtual CORBA::Boolean is_alive(RTC::_objref_ExecutionContext* exec_context)
147  {
148  m_log.push_back("is_alive");
149  return CORBA::Boolean(m_alive);
150  }
152  {
153  m_log.push_back("get_contexts");
154  return 0;
155  }
157  {
158  m_log.push_back("get_context");
159  return 0;
160 // return m_execContexts[ec_id];
161  }
162 
163  virtual RTC::_objref_ExecutionContext* get_context(RTC::ExecutionContextHandle_t)
164  {
165  return 0;
166  }
167  virtual RTC::ExecutionContextHandle_t get_context_handle(RTC::_objref_ExecutionContext*)
168  {
169  return 0;
170  }
171  public: // helper methods
172  int countLog(std::string line)
173  {
174  int count = 0;
175  for (int i = 0; i < (int) m_log.size(); ++i)
176  {
177  if (m_log[i] == line) ++count;
178  }
179  return count;
180  }
181 
182  void setAlive(bool alive)
183  {
184  m_alive = alive;
185  }
186 
187  void setError(bool error)
188  {
189  m_error = error;
190  }
191 
192  private:
194  {
195  return m_error ? RTC::RTC_ERROR : rc;
196  }
197  };
198 
200 // : public virtual POA_RTC::DataFlowComponent,
201  : public virtual POA_OpenRTM::DataFlowComponent,
202  public virtual LightweightRTObjectMock
203  {
204  public:
205  // SDOPackage::_impl_SDOSystemElement
206  virtual SDOPackage::OrganizationList* get_owned_organizations()
207  throw (SDOPackage::NotAvailable)
208  {
209  m_log.push_back("get_owned_organizations");
210  return 0; // dummy
211  }
212  virtual char* get_sdo_id()
213  throw (SDOPackage::NotAvailable, SDOPackage::InternalError)
214  {
215  m_log.push_back("get_sdo_id");
216  return 0; // dummy
217  }
218  virtual char* get_sdo_type()
219  throw (SDOPackage::NotAvailable, SDOPackage::InternalError)
220  {
221  m_log.push_back("get_sdo_type");
222  return 0; // dummy
223  }
224  virtual SDOPackage::DeviceProfile* get_device_profile()
225  throw (SDOPackage::NotAvailable, SDOPackage::InternalError)
226  {
227  m_log.push_back("get_device_profile");
228  return 0; // dummy
229  }
230  virtual SDOPackage::ServiceProfileList* get_service_profiles()
231  throw (SDOPackage::InvalidParameter, SDOPackage::NotAvailable, SDOPackage::InternalError)
232  {
233  m_log.push_back("get_service_profiles");
234  return 0; // dummy
235  }
236  virtual SDOPackage::ServiceProfile* get_service_profile(const char* id)
237  throw (SDOPackage::InvalidParameter, SDOPackage::NotAvailable, SDOPackage::InternalError)
238  {
239  m_log.push_back("get_service_profile");
240  return 0; // dummy
241  }
242  virtual SDOPackage::SDOService_ptr get_sdo_service(const char* id)
243  throw (SDOPackage::InvalidParameter, SDOPackage::NotAvailable, SDOPackage::InternalError)
244  {
245  m_log.push_back("get_sdo_service");
246  return SDOPackage::SDOService::_nil(); // dummy
247  }
248  virtual SDOPackage::Configuration_ptr get_configuration()
249  throw (SDOPackage::InterfaceNotImplemented, SDOPackage::NotAvailable, SDOPackage::InternalError)
250  {
251  m_log.push_back("get_configuration");
252  return SDOPackage::Configuration::_nil(); // dummy
253  }
254  virtual SDOPackage::Monitoring_ptr get_monitoring()
255  throw (SDOPackage::InterfaceNotImplemented, SDOPackage::NotAvailable, SDOPackage::InternalError)
256  {
257  m_log.push_back("get_monitoring");
258  return SDOPackage::Monitoring::_nil(); // dummy
259  }
260  virtual SDOPackage::OrganizationList* get_organizations()
261  throw (SDOPackage::NotAvailable, SDOPackage::InternalError)
262  {
263  m_log.push_back("get_organizations");
264  return 0; // dummy
265  }
267  throw (SDOPackage::NotAvailable, SDOPackage::InternalError)
268  {
269  m_log.push_back("get_status_list");
270  return 0; // dummy
271  }
272  virtual CORBA::Any* get_status(const char* name)
273  throw (SDOPackage::InvalidParameter, SDOPackage::NotAvailable, SDOPackage::InternalError)
274  {
275  m_log.push_back("get_status");
276  return 0; // dummy
277  }
278 
279  // RTC::_impl_RTObject
280  virtual RTC::ComponentProfile* get_component_profile()
281  {
282  m_log.push_back("get_component_profile");
283  // dummy
284  RTC::ComponentProfile_var prof(new RTC::ComponentProfile());
285  return prof._retn();
286  }
288  {
289  m_log.push_back("get_ports");
290  // dummy
291  RTC::PortServiceList_var ports(new RTC::PortServiceList());
292  ports->length(0);
293  return ports._retn();
294  }
295  virtual RTC::ExecutionContextServiceList* get_execution_context_services()
296  {
297  m_log.push_back("get_execution_context_services");
298  // dummy
299  RTC::ExecutionContextServiceList_var ec = new RTC::ExecutionContextServiceList();
300  ec->length(0);
301  return ec._retn();
302  }
303 
304  // RTC::_impl_DataFlowComponentAction
306  {
307  m_log.push_back("on_execute");
308  return RTC::RTC_OK; // dummy
309  }
311  {
312  m_log.push_back("on_state_update");
313  return RTC::RTC_OK; // dummy
314  }
316  {
317  m_log.push_back("on_rate_changed");
318  return RTC::RTC_OK; // dummy
319  }
320  };
321 
323  : public RTC::RTObject_impl
324  {
325  public:
326  RTObjectMock(CORBA::ORB_ptr orb, PortableServer::POA_ptr poa)
327  : RTC::RTObject_impl(orb, poa)
328  {
329  }
330  virtual ~RTObjectMock(void){}
331  };
332 
335  {
336  public:
339 
340  // protected: 変数をここで更新
341  void set_m_ref()
342  {
344  }
346  {
348  {
350  }
351  }
352  RTC::ExecutionContextService_var m_refmock;
353  };
354 
356  : public CppUnit::TestFixture
357  {
358  CPPUNIT_TEST_SUITE(PeriodicExecutionContextTests);
359 
360  CPPUNIT_TEST(test_is_running);
361  CPPUNIT_TEST(test_start_invoking_on_startup);
362  CPPUNIT_TEST(test_start_with_running);
363  CPPUNIT_TEST(test_start_with_not_alive);
364  CPPUNIT_TEST(test_stop_invoking_on_shutdown);
365  CPPUNIT_TEST(test_stop_with_not_running);
366  CPPUNIT_TEST(test_start_and_stop_multiple_times);
367  CPPUNIT_TEST(test_set_rate_and_get_rate);
368  CPPUNIT_TEST(test_set_rate_with_zero_or_negative_rate);
369  CPPUNIT_TEST(test_set_rate_invoking_on_rate_changed);
370  CPPUNIT_TEST(test_add_invoking_attach_executioncontext);
371  CPPUNIT_TEST(test_add_not_with_data_flow_component);
372  CPPUNIT_TEST(test_remove_invoking_detach_executioncontext);
373  CPPUNIT_TEST(test_remove_with_not_attached_component);
374  CPPUNIT_TEST(test_remove_when_component_is_still_active);
375  CPPUNIT_TEST(test_remove_when_component_is_inactive);
376  CPPUNIT_TEST(test_activate_component_invoking_on_activated);
377  CPPUNIT_TEST(test_activate_component_without_participating);
378  CPPUNIT_TEST(test_activate_component_in_Error_state);
379  CPPUNIT_TEST(test_activate_component_not_in_Alive_state);
380  CPPUNIT_TEST(test_deactivate_component_invoking_on_deactivated);
381  CPPUNIT_TEST(test_deactivate_component_without_participating);
382  CPPUNIT_TEST(test_deactivate_component_not_in_Alive_state);
383  CPPUNIT_TEST(test_reset_component_invoking_on_reset);
384  CPPUNIT_TEST(test_reset_component_not_in_Error_state);
385  CPPUNIT_TEST(test_reset_component_not_in_Alive_state);
386  CPPUNIT_TEST(test_bindComponent);
387 
388  CPPUNIT_TEST_SUITE_END();
389 
390  private:
391  CORBA::ORB_ptr m_pORB;
392  PortableServer::POA_ptr m_pPOA;
393 
394  public:
395 
400  {
401  int argc(0);
402  char** argv(NULL);
403  m_pORB = CORBA::ORB_init(argc, argv);
404  m_pPOA = PortableServer::POA::_narrow(
405  m_pORB->resolve_initial_references("RootPOA"));
406  m_pPOA->the_POAManager()->activate();
407  }
408 
413  {
414  }
415 
419  virtual void setUp()
420  {
421  coil::usleep(100000);
422  }
423 
427  virtual void tearDown()
428  {
429  }
430 
439  {
441  = new RTC::PeriodicExecutionContext(); // will be deleted automatically
442 
443  // start()呼出し前は、非running状態か?
444  CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running());
445 
446  // start()呼出し後は、running状態か?
447  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start());
448  CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(true), ec->is_running());
449 
450  // stop()呼出後は、非running状態か?
451  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop());
452  CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running());
453 
454  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
455  delete ec;
456  }
457 
464  {
465  // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_startup()は呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_startup")); // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // この時点で、on_startup()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_startup")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief start()メソッドのテスト * * - すでにrunning状態の際、start()呼出が意図どおりに失敗するか? */ void test_start_with_running() { RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // start()呼出し前は、非running状態のはず CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); // start()呼出し後は、running状態のはず ec->start(); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(true), ec->is_running()); // さらにstart()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->start()); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief start()メソッドのテスト * * - Alive状態にない場合にstart()メソッドを呼出して、意図どおりに失敗するか? */ void test_start_with_not_alive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief stop()メソッドのテスト * * - stop()メソッド呼出しにより、コンポーネントのon_shutdown()が呼び出されるか? */ void test_stop_invoking_on_shutdown() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // この時点では、まだon_shutdown()は呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_shutdown")); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); // この時点で、on_shutdown()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_shutdown")); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief stop()メソッドのテスト * * - 非running状態でstop()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_stop_with_not_running() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだstart()していない状態で、つまり非runningの状態で、 // stop()を呼び出し、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop()); // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(true), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); // さらにstop()を呼び出し、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop()); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief start()メソッドとstop()メソッドのテスト * * - start()とstop()を繰り返し連続で、正常に呼出しできるか? */ void test_start_and_stop_multiple_times() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // start(), stop()を連続して正常に呼び出せるか? for (int i = 0; i < 1000; ++i) { // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); } m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドとget_rate()メソッドのテスト * * - set_rate()で設定したレート値を、get_rate()で正しく取得できるか? */ void test_set_rate_and_get_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // set_rate()で設定したレートが、get_rate()で正しく取得できるか? for (int i = 1; i <= 10; ++i) { CORBA::Double rate((double) 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(rate)); CPPUNIT_ASSERT_EQUAL(rate, ec->get_rate()); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドのテスト * * - レート値に0を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? * - レート値に負値を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? */ void test_set_rate_with_zero_or_negative_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // 0または負数のレートを指定した場合、意図どおりのエラーコードで戻るか? for (int i = 0; i < 10; ++i) { CORBA::Double rate((double) - 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->set_rate(rate)); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @biref set_rate()メソッドのテスト * * - set_rate()呼出しにより、コンポーネントのon_rate_changed()が呼び出されるか? */ void test_set_rate_invoking_on_rate_changed() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、on_rate_changed()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_rate_changed")); RTC::ExecutionContextProfile* ecp; ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1000000), ecp->rate); // set_rate()を呼出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(CORBA::Double(1.0))); ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1.0), ecp->rate); // この時点で、on_rate_changed()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_rate_changed")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - add()メソッド呼出しにより、コンポーネントのattach_executioncontext()が呼び出されるか? */ void test_add_invoking_attach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("attach_executioncontext")); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点で、attach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("attach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - データフローコンポーネントではないLightweightRTObjectを指定してadd()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_add_not_with_data_flow_component() { // RTObjectを生成する // POA_RTC::LightweightRTObject* rto POA_RTC::LightweightRTObject* rto = new LightweightRTObjectMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // LightweightRTObjectではあるが、DataFlowComponentではないRTObjectを用いて、 // add()呼出しを試みて、意図どおりエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->add(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - remove()呼出しにより、コンポーネントのdetach_executioncontext()が呼び出されるか? */ void test_remove_invoking_detach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
466  POA_RTC::LightweightRTObject* rto
467  = new DataFlowComponentMock(); // will be deleted automatically
469  = dynamic_cast<DataFlowComponentMock*>(rto);
470 
471  // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_startup()は呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_startup")); // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // この時点で、on_startup()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_startup")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief start()メソッドのテスト * * - すでにrunning状態の際、start()呼出が意図どおりに失敗するか? */ void test_start_with_running() { RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // start()呼出し前は、非running状態のはず CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); // start()呼出し後は、running状態のはず ec->start(); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(true), ec->is_running()); // さらにstart()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->start()); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief start()メソッドのテスト * * - Alive状態にない場合にstart()メソッドを呼出して、意図どおりに失敗するか? */ void test_start_with_not_alive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief stop()メソッドのテスト * * - stop()メソッド呼出しにより、コンポーネントのon_shutdown()が呼び出されるか? */ void test_stop_invoking_on_shutdown() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // この時点では、まだon_shutdown()は呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_shutdown")); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); // この時点で、on_shutdown()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_shutdown")); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief stop()メソッドのテスト * * - 非running状態でstop()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_stop_with_not_running() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだstart()していない状態で、つまり非runningの状態で、 // stop()を呼び出し、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop()); // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(true), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); // さらにstop()を呼び出し、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop()); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief start()メソッドとstop()メソッドのテスト * * - start()とstop()を繰り返し連続で、正常に呼出しできるか? */ void test_start_and_stop_multiple_times() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // start(), stop()を連続して正常に呼び出せるか? for (int i = 0; i < 1000; ++i) { // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); } m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドとget_rate()メソッドのテスト * * - set_rate()で設定したレート値を、get_rate()で正しく取得できるか? */ void test_set_rate_and_get_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // set_rate()で設定したレートが、get_rate()で正しく取得できるか? for (int i = 1; i <= 10; ++i) { CORBA::Double rate((double) 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(rate)); CPPUNIT_ASSERT_EQUAL(rate, ec->get_rate()); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドのテスト * * - レート値に0を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? * - レート値に負値を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? */ void test_set_rate_with_zero_or_negative_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // 0または負数のレートを指定した場合、意図どおりのエラーコードで戻るか? for (int i = 0; i < 10; ++i) { CORBA::Double rate((double) - 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->set_rate(rate)); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @biref set_rate()メソッドのテスト * * - set_rate()呼出しにより、コンポーネントのon_rate_changed()が呼び出されるか? */ void test_set_rate_invoking_on_rate_changed() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、on_rate_changed()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_rate_changed")); RTC::ExecutionContextProfile* ecp; ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1000000), ecp->rate); // set_rate()を呼出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(CORBA::Double(1.0))); ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1.0), ecp->rate); // この時点で、on_rate_changed()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_rate_changed")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - add()メソッド呼出しにより、コンポーネントのattach_executioncontext()が呼び出されるか? */ void test_add_invoking_attach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("attach_executioncontext")); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点で、attach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("attach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - データフローコンポーネントではないLightweightRTObjectを指定してadd()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_add_not_with_data_flow_component() { // RTObjectを生成する // POA_RTC::LightweightRTObject* rto POA_RTC::LightweightRTObject* rto = new LightweightRTObjectMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // LightweightRTObjectではあるが、DataFlowComponentではないRTObjectを用いて、 // add()呼出しを試みて、意図どおりエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->add(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - remove()呼出しにより、コンポーネントのdetach_executioncontext()が呼び出されるか? */ void test_remove_invoking_detach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
473  = new RTC::PeriodicExecutionContext(); // will be deleted automatically
474 
475  // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_startup()は呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_startup")); // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // この時点で、on_startup()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_startup")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief start()メソッドのテスト * * - すでにrunning状態の際、start()呼出が意図どおりに失敗するか? */ void test_start_with_running() { RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // start()呼出し前は、非running状態のはず CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); // start()呼出し後は、running状態のはず ec->start(); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(true), ec->is_running()); // さらにstart()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->start()); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief start()メソッドのテスト * * - Alive状態にない場合にstart()メソッドを呼出して、意図どおりに失敗するか? */ void test_start_with_not_alive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief stop()メソッドのテスト * * - stop()メソッド呼出しにより、コンポーネントのon_shutdown()が呼び出されるか? */ void test_stop_invoking_on_shutdown() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // この時点では、まだon_shutdown()は呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_shutdown")); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); // この時点で、on_shutdown()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_shutdown")); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief stop()メソッドのテスト * * - 非running状態でstop()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_stop_with_not_running() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだstart()していない状態で、つまり非runningの状態で、 // stop()を呼び出し、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop()); // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(true), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); // さらにstop()を呼び出し、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop()); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief start()メソッドとstop()メソッドのテスト * * - start()とstop()を繰り返し連続で、正常に呼出しできるか? */ void test_start_and_stop_multiple_times() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // start(), stop()を連続して正常に呼び出せるか? for (int i = 0; i < 1000; ++i) { // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); } m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドとget_rate()メソッドのテスト * * - set_rate()で設定したレート値を、get_rate()で正しく取得できるか? */ void test_set_rate_and_get_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // set_rate()で設定したレートが、get_rate()で正しく取得できるか? for (int i = 1; i <= 10; ++i) { CORBA::Double rate((double) 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(rate)); CPPUNIT_ASSERT_EQUAL(rate, ec->get_rate()); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドのテスト * * - レート値に0を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? * - レート値に負値を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? */ void test_set_rate_with_zero_or_negative_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // 0または負数のレートを指定した場合、意図どおりのエラーコードで戻るか? for (int i = 0; i < 10; ++i) { CORBA::Double rate((double) - 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->set_rate(rate)); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @biref set_rate()メソッドのテスト * * - set_rate()呼出しにより、コンポーネントのon_rate_changed()が呼び出されるか? */ void test_set_rate_invoking_on_rate_changed() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、on_rate_changed()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_rate_changed")); RTC::ExecutionContextProfile* ecp; ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1000000), ecp->rate); // set_rate()を呼出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(CORBA::Double(1.0))); ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1.0), ecp->rate); // この時点で、on_rate_changed()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_rate_changed")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - add()メソッド呼出しにより、コンポーネントのattach_executioncontext()が呼び出されるか? */ void test_add_invoking_attach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("attach_executioncontext")); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点で、attach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("attach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - データフローコンポーネントではないLightweightRTObjectを指定してadd()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_add_not_with_data_flow_component() { // RTObjectを生成する // POA_RTC::LightweightRTObject* rto POA_RTC::LightweightRTObject* rto = new LightweightRTObjectMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // LightweightRTObjectではあるが、DataFlowComponentではないRTObjectを用いて、 // add()呼出しを試みて、意図どおりエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->add(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - remove()呼出しにより、コンポーネントのdetach_executioncontext()が呼び出されるか? */ void test_remove_invoking_detach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
476  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this()));
477 
478  // この時点では、まだon_startup()は呼び出されていないはず
479  CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_startup"));
480 
481  // start()を呼び出す
482  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start());
483 
484  // この時点で、on_startup()が1回だけ呼び出されているはず
485  CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_startup"));
486 
487  ec->stop();
488  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
489  delete ec;
490  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto));
491  delete rto;
492  }
493 
500  {
502  = new RTC::PeriodicExecutionContext(); // will be deleted automatically
503 
504  // start()呼出し前は、非running状態のはず
505  CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running());
506 
507  // start()呼出し後は、running状態のはず
508  ec->start();
509  CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(true), ec->is_running());
510 
511  // さらにstart()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->start()); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief start()メソッドのテスト * * - Alive状態にない場合にstart()メソッドを呼出して、意図どおりに失敗するか? */ void test_start_with_not_alive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief stop()メソッドのテスト * * - stop()メソッド呼出しにより、コンポーネントのon_shutdown()が呼び出されるか? */ void test_stop_invoking_on_shutdown() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // この時点では、まだon_shutdown()は呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_shutdown")); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); // この時点で、on_shutdown()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_shutdown")); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief stop()メソッドのテスト * * - 非running状態でstop()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_stop_with_not_running() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだstart()していない状態で、つまり非runningの状態で、 // stop()を呼び出し、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop()); // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(true), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); // さらにstop()を呼び出し、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop()); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief start()メソッドとstop()メソッドのテスト * * - start()とstop()を繰り返し連続で、正常に呼出しできるか? */ void test_start_and_stop_multiple_times() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // start(), stop()を連続して正常に呼び出せるか? for (int i = 0; i < 1000; ++i) { // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); } m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドとget_rate()メソッドのテスト * * - set_rate()で設定したレート値を、get_rate()で正しく取得できるか? */ void test_set_rate_and_get_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // set_rate()で設定したレートが、get_rate()で正しく取得できるか? for (int i = 1; i <= 10; ++i) { CORBA::Double rate((double) 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(rate)); CPPUNIT_ASSERT_EQUAL(rate, ec->get_rate()); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドのテスト * * - レート値に0を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? * - レート値に負値を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? */ void test_set_rate_with_zero_or_negative_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // 0または負数のレートを指定した場合、意図どおりのエラーコードで戻るか? for (int i = 0; i < 10; ++i) { CORBA::Double rate((double) - 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->set_rate(rate)); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @biref set_rate()メソッドのテスト * * - set_rate()呼出しにより、コンポーネントのon_rate_changed()が呼び出されるか? */ void test_set_rate_invoking_on_rate_changed() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、on_rate_changed()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_rate_changed")); RTC::ExecutionContextProfile* ecp; ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1000000), ecp->rate); // set_rate()を呼出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(CORBA::Double(1.0))); ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1.0), ecp->rate); // この時点で、on_rate_changed()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_rate_changed")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - add()メソッド呼出しにより、コンポーネントのattach_executioncontext()が呼び出されるか? */ void test_add_invoking_attach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("attach_executioncontext")); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点で、attach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("attach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - データフローコンポーネントではないLightweightRTObjectを指定してadd()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_add_not_with_data_flow_component() { // RTObjectを生成する // POA_RTC::LightweightRTObject* rto POA_RTC::LightweightRTObject* rto = new LightweightRTObjectMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // LightweightRTObjectではあるが、DataFlowComponentではないRTObjectを用いて、 // add()呼出しを試みて、意図どおりエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->add(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - remove()呼出しにより、コンポーネントのdetach_executioncontext()が呼び出されるか? */ void test_remove_invoking_detach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
512  CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->start());
513 
514  ec->stop();
515  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
516  delete ec;
517  }
518 
525  {
526  // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief stop()メソッドのテスト * * - stop()メソッド呼出しにより、コンポーネントのon_shutdown()が呼び出されるか? */ void test_stop_invoking_on_shutdown() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // この時点では、まだon_shutdown()は呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_shutdown")); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); // この時点で、on_shutdown()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_shutdown")); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief stop()メソッドのテスト * * - 非running状態でstop()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_stop_with_not_running() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだstart()していない状態で、つまり非runningの状態で、 // stop()を呼び出し、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop()); // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(true), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); // さらにstop()を呼び出し、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop()); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief start()メソッドとstop()メソッドのテスト * * - start()とstop()を繰り返し連続で、正常に呼出しできるか? */ void test_start_and_stop_multiple_times() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // start(), stop()を連続して正常に呼び出せるか? for (int i = 0; i < 1000; ++i) { // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); } m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドとget_rate()メソッドのテスト * * - set_rate()で設定したレート値を、get_rate()で正しく取得できるか? */ void test_set_rate_and_get_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // set_rate()で設定したレートが、get_rate()で正しく取得できるか? for (int i = 1; i <= 10; ++i) { CORBA::Double rate((double) 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(rate)); CPPUNIT_ASSERT_EQUAL(rate, ec->get_rate()); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドのテスト * * - レート値に0を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? * - レート値に負値を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? */ void test_set_rate_with_zero_or_negative_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // 0または負数のレートを指定した場合、意図どおりのエラーコードで戻るか? for (int i = 0; i < 10; ++i) { CORBA::Double rate((double) - 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->set_rate(rate)); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @biref set_rate()メソッドのテスト * * - set_rate()呼出しにより、コンポーネントのon_rate_changed()が呼び出されるか? */ void test_set_rate_invoking_on_rate_changed() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、on_rate_changed()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_rate_changed")); RTC::ExecutionContextProfile* ecp; ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1000000), ecp->rate); // set_rate()を呼出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(CORBA::Double(1.0))); ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1.0), ecp->rate); // この時点で、on_rate_changed()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_rate_changed")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - add()メソッド呼出しにより、コンポーネントのattach_executioncontext()が呼び出されるか? */ void test_add_invoking_attach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("attach_executioncontext")); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点で、attach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("attach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - データフローコンポーネントではないLightweightRTObjectを指定してadd()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_add_not_with_data_flow_component() { // RTObjectを生成する // POA_RTC::LightweightRTObject* rto POA_RTC::LightweightRTObject* rto = new LightweightRTObjectMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // LightweightRTObjectではあるが、DataFlowComponentではないRTObjectを用いて、 // add()呼出しを試みて、意図どおりエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->add(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - remove()呼出しにより、コンポーネントのdetach_executioncontext()が呼び出されるか? */ void test_remove_invoking_detach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
527  POA_RTC::LightweightRTObject* rto
528  = new DataFlowComponentMock(); // will be deleted automatically
530  = dynamic_cast<DataFlowComponentMock*>(rto);
531 
532  // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief stop()メソッドのテスト * * - stop()メソッド呼出しにより、コンポーネントのon_shutdown()が呼び出されるか? */ void test_stop_invoking_on_shutdown() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // この時点では、まだon_shutdown()は呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_shutdown")); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); // この時点で、on_shutdown()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_shutdown")); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief stop()メソッドのテスト * * - 非running状態でstop()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_stop_with_not_running() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだstart()していない状態で、つまり非runningの状態で、 // stop()を呼び出し、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop()); // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(true), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); // さらにstop()を呼び出し、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop()); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief start()メソッドとstop()メソッドのテスト * * - start()とstop()を繰り返し連続で、正常に呼出しできるか? */ void test_start_and_stop_multiple_times() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // start(), stop()を連続して正常に呼び出せるか? for (int i = 0; i < 1000; ++i) { // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); } m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドとget_rate()メソッドのテスト * * - set_rate()で設定したレート値を、get_rate()で正しく取得できるか? */ void test_set_rate_and_get_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // set_rate()で設定したレートが、get_rate()で正しく取得できるか? for (int i = 1; i <= 10; ++i) { CORBA::Double rate((double) 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(rate)); CPPUNIT_ASSERT_EQUAL(rate, ec->get_rate()); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドのテスト * * - レート値に0を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? * - レート値に負値を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? */ void test_set_rate_with_zero_or_negative_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // 0または負数のレートを指定した場合、意図どおりのエラーコードで戻るか? for (int i = 0; i < 10; ++i) { CORBA::Double rate((double) - 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->set_rate(rate)); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @biref set_rate()メソッドのテスト * * - set_rate()呼出しにより、コンポーネントのon_rate_changed()が呼び出されるか? */ void test_set_rate_invoking_on_rate_changed() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、on_rate_changed()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_rate_changed")); RTC::ExecutionContextProfile* ecp; ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1000000), ecp->rate); // set_rate()を呼出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(CORBA::Double(1.0))); ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1.0), ecp->rate); // この時点で、on_rate_changed()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_rate_changed")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - add()メソッド呼出しにより、コンポーネントのattach_executioncontext()が呼び出されるか? */ void test_add_invoking_attach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("attach_executioncontext")); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点で、attach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("attach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - データフローコンポーネントではないLightweightRTObjectを指定してadd()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_add_not_with_data_flow_component() { // RTObjectを生成する // POA_RTC::LightweightRTObject* rto POA_RTC::LightweightRTObject* rto = new LightweightRTObjectMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // LightweightRTObjectではあるが、DataFlowComponentではないRTObjectを用いて、 // add()呼出しを試みて、意図どおりエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->add(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - remove()呼出しにより、コンポーネントのdetach_executioncontext()が呼び出されるか? */ void test_remove_invoking_detach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
534  = new RTC::PeriodicExecutionContext(); // will be deleted automatically
535 
536  // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief stop()メソッドのテスト * * - stop()メソッド呼出しにより、コンポーネントのon_shutdown()が呼び出されるか? */ void test_stop_invoking_on_shutdown() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // この時点では、まだon_shutdown()は呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_shutdown")); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); // この時点で、on_shutdown()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_shutdown")); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief stop()メソッドのテスト * * - 非running状態でstop()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_stop_with_not_running() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだstart()していない状態で、つまり非runningの状態で、 // stop()を呼び出し、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop()); // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(true), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); // さらにstop()を呼び出し、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop()); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief start()メソッドとstop()メソッドのテスト * * - start()とstop()を繰り返し連続で、正常に呼出しできるか? */ void test_start_and_stop_multiple_times() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // start(), stop()を連続して正常に呼び出せるか? for (int i = 0; i < 1000; ++i) { // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); } m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドとget_rate()メソッドのテスト * * - set_rate()で設定したレート値を、get_rate()で正しく取得できるか? */ void test_set_rate_and_get_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // set_rate()で設定したレートが、get_rate()で正しく取得できるか? for (int i = 1; i <= 10; ++i) { CORBA::Double rate((double) 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(rate)); CPPUNIT_ASSERT_EQUAL(rate, ec->get_rate()); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドのテスト * * - レート値に0を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? * - レート値に負値を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? */ void test_set_rate_with_zero_or_negative_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // 0または負数のレートを指定した場合、意図どおりのエラーコードで戻るか? for (int i = 0; i < 10; ++i) { CORBA::Double rate((double) - 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->set_rate(rate)); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @biref set_rate()メソッドのテスト * * - set_rate()呼出しにより、コンポーネントのon_rate_changed()が呼び出されるか? */ void test_set_rate_invoking_on_rate_changed() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、on_rate_changed()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_rate_changed")); RTC::ExecutionContextProfile* ecp; ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1000000), ecp->rate); // set_rate()を呼出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(CORBA::Double(1.0))); ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1.0), ecp->rate); // この時点で、on_rate_changed()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_rate_changed")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - add()メソッド呼出しにより、コンポーネントのattach_executioncontext()が呼び出されるか? */ void test_add_invoking_attach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("attach_executioncontext")); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点で、attach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("attach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - データフローコンポーネントではないLightweightRTObjectを指定してadd()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_add_not_with_data_flow_component() { // RTObjectを生成する // POA_RTC::LightweightRTObject* rto POA_RTC::LightweightRTObject* rto = new LightweightRTObjectMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // LightweightRTObjectではあるが、DataFlowComponentではないRTObjectを用いて、 // add()呼出しを試みて、意図どおりエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->add(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - remove()呼出しにより、コンポーネントのdetach_executioncontext()が呼び出されるか? */ void test_remove_invoking_detach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
537  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this()));
538 
539  // 非Alive状態にしておく
540  mock->setAlive(false);
541  CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL));
542 
543  ec->stop();
544  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
545  delete ec;
546  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto));
547  delete rto;
548  }
549 
556  {
557  // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // この時点では、まだon_shutdown()は呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_shutdown")); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); // この時点で、on_shutdown()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_shutdown")); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief stop()メソッドのテスト * * - 非running状態でstop()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_stop_with_not_running() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだstart()していない状態で、つまり非runningの状態で、 // stop()を呼び出し、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop()); // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(true), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); // さらにstop()を呼び出し、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop()); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief start()メソッドとstop()メソッドのテスト * * - start()とstop()を繰り返し連続で、正常に呼出しできるか? */ void test_start_and_stop_multiple_times() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // start(), stop()を連続して正常に呼び出せるか? for (int i = 0; i < 1000; ++i) { // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); } m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドとget_rate()メソッドのテスト * * - set_rate()で設定したレート値を、get_rate()で正しく取得できるか? */ void test_set_rate_and_get_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // set_rate()で設定したレートが、get_rate()で正しく取得できるか? for (int i = 1; i <= 10; ++i) { CORBA::Double rate((double) 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(rate)); CPPUNIT_ASSERT_EQUAL(rate, ec->get_rate()); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドのテスト * * - レート値に0を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? * - レート値に負値を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? */ void test_set_rate_with_zero_or_negative_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // 0または負数のレートを指定した場合、意図どおりのエラーコードで戻るか? for (int i = 0; i < 10; ++i) { CORBA::Double rate((double) - 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->set_rate(rate)); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @biref set_rate()メソッドのテスト * * - set_rate()呼出しにより、コンポーネントのon_rate_changed()が呼び出されるか? */ void test_set_rate_invoking_on_rate_changed() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、on_rate_changed()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_rate_changed")); RTC::ExecutionContextProfile* ecp; ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1000000), ecp->rate); // set_rate()を呼出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(CORBA::Double(1.0))); ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1.0), ecp->rate); // この時点で、on_rate_changed()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_rate_changed")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - add()メソッド呼出しにより、コンポーネントのattach_executioncontext()が呼び出されるか? */ void test_add_invoking_attach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("attach_executioncontext")); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点で、attach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("attach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - データフローコンポーネントではないLightweightRTObjectを指定してadd()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_add_not_with_data_flow_component() { // RTObjectを生成する // POA_RTC::LightweightRTObject* rto POA_RTC::LightweightRTObject* rto = new LightweightRTObjectMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // LightweightRTObjectではあるが、DataFlowComponentではないRTObjectを用いて、 // add()呼出しを試みて、意図どおりエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->add(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - remove()呼出しにより、コンポーネントのdetach_executioncontext()が呼び出されるか? */ void test_remove_invoking_detach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
558  POA_RTC::LightweightRTObject* rto
559  = new DataFlowComponentMock(); // will be deleted automatically
561  = dynamic_cast<DataFlowComponentMock*>(rto);
562 
563  // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // この時点では、まだon_shutdown()は呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_shutdown")); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); // この時点で、on_shutdown()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_shutdown")); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief stop()メソッドのテスト * * - 非running状態でstop()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_stop_with_not_running() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだstart()していない状態で、つまり非runningの状態で、 // stop()を呼び出し、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop()); // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(true), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); // さらにstop()を呼び出し、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop()); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief start()メソッドとstop()メソッドのテスト * * - start()とstop()を繰り返し連続で、正常に呼出しできるか? */ void test_start_and_stop_multiple_times() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // start(), stop()を連続して正常に呼び出せるか? for (int i = 0; i < 1000; ++i) { // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); } m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドとget_rate()メソッドのテスト * * - set_rate()で設定したレート値を、get_rate()で正しく取得できるか? */ void test_set_rate_and_get_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // set_rate()で設定したレートが、get_rate()で正しく取得できるか? for (int i = 1; i <= 10; ++i) { CORBA::Double rate((double) 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(rate)); CPPUNIT_ASSERT_EQUAL(rate, ec->get_rate()); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドのテスト * * - レート値に0を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? * - レート値に負値を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? */ void test_set_rate_with_zero_or_negative_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // 0または負数のレートを指定した場合、意図どおりのエラーコードで戻るか? for (int i = 0; i < 10; ++i) { CORBA::Double rate((double) - 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->set_rate(rate)); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @biref set_rate()メソッドのテスト * * - set_rate()呼出しにより、コンポーネントのon_rate_changed()が呼び出されるか? */ void test_set_rate_invoking_on_rate_changed() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、on_rate_changed()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_rate_changed")); RTC::ExecutionContextProfile* ecp; ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1000000), ecp->rate); // set_rate()を呼出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(CORBA::Double(1.0))); ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1.0), ecp->rate); // この時点で、on_rate_changed()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_rate_changed")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - add()メソッド呼出しにより、コンポーネントのattach_executioncontext()が呼び出されるか? */ void test_add_invoking_attach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("attach_executioncontext")); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点で、attach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("attach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - データフローコンポーネントではないLightweightRTObjectを指定してadd()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_add_not_with_data_flow_component() { // RTObjectを生成する // POA_RTC::LightweightRTObject* rto POA_RTC::LightweightRTObject* rto = new LightweightRTObjectMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // LightweightRTObjectではあるが、DataFlowComponentではないRTObjectを用いて、 // add()呼出しを試みて、意図どおりエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->add(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - remove()呼出しにより、コンポーネントのdetach_executioncontext()が呼び出されるか? */ void test_remove_invoking_detach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
565  = new RTC::PeriodicExecutionContext(); // will be deleted automatically
566 
567  // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // この時点では、まだon_shutdown()は呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_shutdown")); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); // この時点で、on_shutdown()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_shutdown")); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief stop()メソッドのテスト * * - 非running状態でstop()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_stop_with_not_running() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだstart()していない状態で、つまり非runningの状態で、 // stop()を呼び出し、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop()); // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(true), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); // さらにstop()を呼び出し、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop()); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief start()メソッドとstop()メソッドのテスト * * - start()とstop()を繰り返し連続で、正常に呼出しできるか? */ void test_start_and_stop_multiple_times() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // start(), stop()を連続して正常に呼び出せるか? for (int i = 0; i < 1000; ++i) { // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); } m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドとget_rate()メソッドのテスト * * - set_rate()で設定したレート値を、get_rate()で正しく取得できるか? */ void test_set_rate_and_get_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // set_rate()で設定したレートが、get_rate()で正しく取得できるか? for (int i = 1; i <= 10; ++i) { CORBA::Double rate((double) 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(rate)); CPPUNIT_ASSERT_EQUAL(rate, ec->get_rate()); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドのテスト * * - レート値に0を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? * - レート値に負値を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? */ void test_set_rate_with_zero_or_negative_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // 0または負数のレートを指定した場合、意図どおりのエラーコードで戻るか? for (int i = 0; i < 10; ++i) { CORBA::Double rate((double) - 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->set_rate(rate)); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @biref set_rate()メソッドのテスト * * - set_rate()呼出しにより、コンポーネントのon_rate_changed()が呼び出されるか? */ void test_set_rate_invoking_on_rate_changed() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、on_rate_changed()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_rate_changed")); RTC::ExecutionContextProfile* ecp; ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1000000), ecp->rate); // set_rate()を呼出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(CORBA::Double(1.0))); ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1.0), ecp->rate); // この時点で、on_rate_changed()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_rate_changed")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - add()メソッド呼出しにより、コンポーネントのattach_executioncontext()が呼び出されるか? */ void test_add_invoking_attach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("attach_executioncontext")); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点で、attach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("attach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - データフローコンポーネントではないLightweightRTObjectを指定してadd()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_add_not_with_data_flow_component() { // RTObjectを生成する // POA_RTC::LightweightRTObject* rto POA_RTC::LightweightRTObject* rto = new LightweightRTObjectMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // LightweightRTObjectではあるが、DataFlowComponentではないRTObjectを用いて、 // add()呼出しを試みて、意図どおりエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->add(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - remove()呼出しにより、コンポーネントのdetach_executioncontext()が呼び出されるか? */ void test_remove_invoking_detach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
568  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this()));
569 
570  // start()を呼び出す
571  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start());
572 
573  // この時点では、まだon_shutdown()は呼び出されていないはず
574  CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_shutdown"));
575 
576  // stop()を呼び出す
577  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop());
578 
579  // この時点で、on_shutdown()が1回だけ呼び出されているはず
580  CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_shutdown"));
581 
582  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
583  delete ec;
584  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto));
585  delete rto;
586  }
587 
594  {
595  // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだstart()していない状態で、つまり非runningの状態で、 // stop()を呼び出し、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop()); // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(true), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); // さらにstop()を呼び出し、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop()); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief start()メソッドとstop()メソッドのテスト * * - start()とstop()を繰り返し連続で、正常に呼出しできるか? */ void test_start_and_stop_multiple_times() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // start(), stop()を連続して正常に呼び出せるか? for (int i = 0; i < 1000; ++i) { // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); } m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドとget_rate()メソッドのテスト * * - set_rate()で設定したレート値を、get_rate()で正しく取得できるか? */ void test_set_rate_and_get_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // set_rate()で設定したレートが、get_rate()で正しく取得できるか? for (int i = 1; i <= 10; ++i) { CORBA::Double rate((double) 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(rate)); CPPUNIT_ASSERT_EQUAL(rate, ec->get_rate()); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドのテスト * * - レート値に0を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? * - レート値に負値を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? */ void test_set_rate_with_zero_or_negative_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // 0または負数のレートを指定した場合、意図どおりのエラーコードで戻るか? for (int i = 0; i < 10; ++i) { CORBA::Double rate((double) - 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->set_rate(rate)); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @biref set_rate()メソッドのテスト * * - set_rate()呼出しにより、コンポーネントのon_rate_changed()が呼び出されるか? */ void test_set_rate_invoking_on_rate_changed() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、on_rate_changed()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_rate_changed")); RTC::ExecutionContextProfile* ecp; ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1000000), ecp->rate); // set_rate()を呼出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(CORBA::Double(1.0))); ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1.0), ecp->rate); // この時点で、on_rate_changed()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_rate_changed")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - add()メソッド呼出しにより、コンポーネントのattach_executioncontext()が呼び出されるか? */ void test_add_invoking_attach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("attach_executioncontext")); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点で、attach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("attach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - データフローコンポーネントではないLightweightRTObjectを指定してadd()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_add_not_with_data_flow_component() { // RTObjectを生成する // POA_RTC::LightweightRTObject* rto POA_RTC::LightweightRTObject* rto = new LightweightRTObjectMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // LightweightRTObjectではあるが、DataFlowComponentではないRTObjectを用いて、 // add()呼出しを試みて、意図どおりエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->add(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - remove()呼出しにより、コンポーネントのdetach_executioncontext()が呼び出されるか? */ void test_remove_invoking_detach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
597  = new RTC::PeriodicExecutionContext(); // will be deleted automatically
598 
599  // まだstart()していない状態で、つまり非runningの状態で、
600  // stop()を呼び出し、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop()); // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(true), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); // さらにstop()を呼び出し、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop()); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief start()メソッドとstop()メソッドのテスト * * - start()とstop()を繰り返し連続で、正常に呼出しできるか? */ void test_start_and_stop_multiple_times() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // start(), stop()を連続して正常に呼び出せるか? for (int i = 0; i < 1000; ++i) { // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); } m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドとget_rate()メソッドのテスト * * - set_rate()で設定したレート値を、get_rate()で正しく取得できるか? */ void test_set_rate_and_get_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // set_rate()で設定したレートが、get_rate()で正しく取得できるか? for (int i = 1; i <= 10; ++i) { CORBA::Double rate((double) 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(rate)); CPPUNIT_ASSERT_EQUAL(rate, ec->get_rate()); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドのテスト * * - レート値に0を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? * - レート値に負値を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? */ void test_set_rate_with_zero_or_negative_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // 0または負数のレートを指定した場合、意図どおりのエラーコードで戻るか? for (int i = 0; i < 10; ++i) { CORBA::Double rate((double) - 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->set_rate(rate)); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @biref set_rate()メソッドのテスト * * - set_rate()呼出しにより、コンポーネントのon_rate_changed()が呼び出されるか? */ void test_set_rate_invoking_on_rate_changed() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、on_rate_changed()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_rate_changed")); RTC::ExecutionContextProfile* ecp; ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1000000), ecp->rate); // set_rate()を呼出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(CORBA::Double(1.0))); ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1.0), ecp->rate); // この時点で、on_rate_changed()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_rate_changed")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - add()メソッド呼出しにより、コンポーネントのattach_executioncontext()が呼び出されるか? */ void test_add_invoking_attach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("attach_executioncontext")); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点で、attach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("attach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - データフローコンポーネントではないLightweightRTObjectを指定してadd()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_add_not_with_data_flow_component() { // RTObjectを生成する // POA_RTC::LightweightRTObject* rto POA_RTC::LightweightRTObject* rto = new LightweightRTObjectMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // LightweightRTObjectではあるが、DataFlowComponentではないRTObjectを用いて、 // add()呼出しを試みて、意図どおりエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->add(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - remove()呼出しにより、コンポーネントのdetach_executioncontext()が呼び出されるか? */ void test_remove_invoking_detach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
601  CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running());
602  CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop());
603 
604  // start()を呼び出す
605  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start());
606 
607  // stop()を呼び出す
608  CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(true), ec->is_running());
609  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop());
610 
611  // さらにstop()を呼び出し、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running()); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop()); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief start()メソッドとstop()メソッドのテスト * * - start()とstop()を繰り返し連続で、正常に呼出しできるか? */ void test_start_and_stop_multiple_times() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // start(), stop()を連続して正常に呼び出せるか? for (int i = 0; i < 1000; ++i) { // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); } m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドとget_rate()メソッドのテスト * * - set_rate()で設定したレート値を、get_rate()で正しく取得できるか? */ void test_set_rate_and_get_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // set_rate()で設定したレートが、get_rate()で正しく取得できるか? for (int i = 1; i <= 10; ++i) { CORBA::Double rate((double) 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(rate)); CPPUNIT_ASSERT_EQUAL(rate, ec->get_rate()); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドのテスト * * - レート値に0を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? * - レート値に負値を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? */ void test_set_rate_with_zero_or_negative_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // 0または負数のレートを指定した場合、意図どおりのエラーコードで戻るか? for (int i = 0; i < 10; ++i) { CORBA::Double rate((double) - 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->set_rate(rate)); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @biref set_rate()メソッドのテスト * * - set_rate()呼出しにより、コンポーネントのon_rate_changed()が呼び出されるか? */ void test_set_rate_invoking_on_rate_changed() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、on_rate_changed()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_rate_changed")); RTC::ExecutionContextProfile* ecp; ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1000000), ecp->rate); // set_rate()を呼出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(CORBA::Double(1.0))); ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1.0), ecp->rate); // この時点で、on_rate_changed()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_rate_changed")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - add()メソッド呼出しにより、コンポーネントのattach_executioncontext()が呼び出されるか? */ void test_add_invoking_attach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("attach_executioncontext")); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点で、attach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("attach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - データフローコンポーネントではないLightweightRTObjectを指定してadd()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_add_not_with_data_flow_component() { // RTObjectを生成する // POA_RTC::LightweightRTObject* rto POA_RTC::LightweightRTObject* rto = new LightweightRTObjectMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // LightweightRTObjectではあるが、DataFlowComponentではないRTObjectを用いて、 // add()呼出しを試みて、意図どおりエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->add(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - remove()呼出しにより、コンポーネントのdetach_executioncontext()が呼び出されるか? */ void test_remove_invoking_detach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
612  CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), ec->is_running());
613  CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->stop());
614 
615  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
616  delete ec;
617  }
618 
625  {
626  // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // start(), stop()を連続して正常に呼び出せるか? for (int i = 0; i < 1000; ++i) { // start()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // stop()を呼び出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop()); } m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドとget_rate()メソッドのテスト * * - set_rate()で設定したレート値を、get_rate()で正しく取得できるか? */ void test_set_rate_and_get_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // set_rate()で設定したレートが、get_rate()で正しく取得できるか? for (int i = 1; i <= 10; ++i) { CORBA::Double rate((double) 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(rate)); CPPUNIT_ASSERT_EQUAL(rate, ec->get_rate()); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドのテスト * * - レート値に0を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? * - レート値に負値を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? */ void test_set_rate_with_zero_or_negative_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // 0または負数のレートを指定した場合、意図どおりのエラーコードで戻るか? for (int i = 0; i < 10; ++i) { CORBA::Double rate((double) - 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->set_rate(rate)); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @biref set_rate()メソッドのテスト * * - set_rate()呼出しにより、コンポーネントのon_rate_changed()が呼び出されるか? */ void test_set_rate_invoking_on_rate_changed() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、on_rate_changed()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_rate_changed")); RTC::ExecutionContextProfile* ecp; ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1000000), ecp->rate); // set_rate()を呼出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(CORBA::Double(1.0))); ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1.0), ecp->rate); // この時点で、on_rate_changed()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_rate_changed")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - add()メソッド呼出しにより、コンポーネントのattach_executioncontext()が呼び出されるか? */ void test_add_invoking_attach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("attach_executioncontext")); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点で、attach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("attach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - データフローコンポーネントではないLightweightRTObjectを指定してadd()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_add_not_with_data_flow_component() { // RTObjectを生成する // POA_RTC::LightweightRTObject* rto POA_RTC::LightweightRTObject* rto = new LightweightRTObjectMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // LightweightRTObjectではあるが、DataFlowComponentではないRTObjectを用いて、 // add()呼出しを試みて、意図どおりエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->add(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - remove()呼出しにより、コンポーネントのdetach_executioncontext()が呼び出されるか? */ void test_remove_invoking_detach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
628  = new RTC::PeriodicExecutionContext(); // will be deleted automatically
629 
630  // start(), stop()を連続して正常に呼び出せるか?
631  for (int i = 0; i < 1000; ++i)
632  {
633  // start()を呼び出す
634  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start());
635 
636  // stop()を呼び出す
637  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->stop());
638  }
639 
640  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
641  delete ec;
642  }
643 
650  {
651  // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // set_rate()で設定したレートが、get_rate()で正しく取得できるか? for (int i = 1; i <= 10; ++i) { CORBA::Double rate((double) 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(rate)); CPPUNIT_ASSERT_EQUAL(rate, ec->get_rate()); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @brief set_rate()メソッドのテスト * * - レート値に0を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? * - レート値に負値を指定してset_rate()を呼び出した場合、意図どおりに失敗するか? */ void test_set_rate_with_zero_or_negative_rate() { // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // 0または負数のレートを指定した場合、意図どおりのエラーコードで戻るか? for (int i = 0; i < 10; ++i) { CORBA::Double rate((double) - 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->set_rate(rate)); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @biref set_rate()メソッドのテスト * * - set_rate()呼出しにより、コンポーネントのon_rate_changed()が呼び出されるか? */ void test_set_rate_invoking_on_rate_changed() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、on_rate_changed()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_rate_changed")); RTC::ExecutionContextProfile* ecp; ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1000000), ecp->rate); // set_rate()を呼出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(CORBA::Double(1.0))); ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1.0), ecp->rate); // この時点で、on_rate_changed()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_rate_changed")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - add()メソッド呼出しにより、コンポーネントのattach_executioncontext()が呼び出されるか? */ void test_add_invoking_attach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("attach_executioncontext")); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点で、attach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("attach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - データフローコンポーネントではないLightweightRTObjectを指定してadd()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_add_not_with_data_flow_component() { // RTObjectを生成する // POA_RTC::LightweightRTObject* rto POA_RTC::LightweightRTObject* rto = new LightweightRTObjectMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // LightweightRTObjectではあるが、DataFlowComponentではないRTObjectを用いて、 // add()呼出しを試みて、意図どおりエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->add(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - remove()呼出しにより、コンポーネントのdetach_executioncontext()が呼び出されるか? */ void test_remove_invoking_detach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
653  = new RTC::PeriodicExecutionContext(); // will be deleted automatically
654 
655  // set_rate()で設定したレートが、get_rate()で正しく取得できるか?
656  for (int i = 1; i <= 10; ++i)
657  {
658  CORBA::Double rate((double) 1.0 * i);
659  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(rate));
660  CPPUNIT_ASSERT_EQUAL(rate, ec->get_rate());
661  }
662 
663  ec->stop();
664  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
665  delete ec;
666  }
667 
675  {
676  // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // 0または負数のレートを指定した場合、意図どおりのエラーコードで戻るか? for (int i = 0; i < 10; ++i) { CORBA::Double rate((double) - 1.0 * i); CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->set_rate(rate)); } ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; } /*! * @biref set_rate()メソッドのテスト * * - set_rate()呼出しにより、コンポーネントのon_rate_changed()が呼び出されるか? */ void test_set_rate_invoking_on_rate_changed() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、on_rate_changed()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_rate_changed")); RTC::ExecutionContextProfile* ecp; ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1000000), ecp->rate); // set_rate()を呼出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(CORBA::Double(1.0))); ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1.0), ecp->rate); // この時点で、on_rate_changed()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_rate_changed")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - add()メソッド呼出しにより、コンポーネントのattach_executioncontext()が呼び出されるか? */ void test_add_invoking_attach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("attach_executioncontext")); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点で、attach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("attach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - データフローコンポーネントではないLightweightRTObjectを指定してadd()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_add_not_with_data_flow_component() { // RTObjectを生成する // POA_RTC::LightweightRTObject* rto POA_RTC::LightweightRTObject* rto = new LightweightRTObjectMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // LightweightRTObjectではあるが、DataFlowComponentではないRTObjectを用いて、 // add()呼出しを試みて、意図どおりエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->add(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - remove()呼出しにより、コンポーネントのdetach_executioncontext()が呼び出されるか? */ void test_remove_invoking_detach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
678  = new RTC::PeriodicExecutionContext(); // will be deleted automatically
679 
680  // 0または負数のレートを指定した場合、意図どおりのエラーコードで戻るか?
681  for (int i = 0; i < 10; ++i)
682  {
683  CORBA::Double rate((double) - 1.0 * i);
684  CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->set_rate(rate));
685  }
686 
687  ec->stop();
688  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
689  delete ec;
690  }
691 
698  {
699  // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、on_rate_changed()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_rate_changed")); RTC::ExecutionContextProfile* ecp; ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1000000), ecp->rate); // set_rate()を呼出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(CORBA::Double(1.0))); ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1.0), ecp->rate); // この時点で、on_rate_changed()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_rate_changed")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - add()メソッド呼出しにより、コンポーネントのattach_executioncontext()が呼び出されるか? */ void test_add_invoking_attach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("attach_executioncontext")); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点で、attach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("attach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - データフローコンポーネントではないLightweightRTObjectを指定してadd()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_add_not_with_data_flow_component() { // RTObjectを生成する // POA_RTC::LightweightRTObject* rto POA_RTC::LightweightRTObject* rto = new LightweightRTObjectMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // LightweightRTObjectではあるが、DataFlowComponentではないRTObjectを用いて、 // add()呼出しを試みて、意図どおりエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->add(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - remove()呼出しにより、コンポーネントのdetach_executioncontext()が呼び出されるか? */ void test_remove_invoking_detach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
700  POA_RTC::LightweightRTObject* rto
701  = new DataFlowComponentMock(); // will be deleted automatically
703  = dynamic_cast<DataFlowComponentMock*>(rto);
704 
705  // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、on_rate_changed()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_rate_changed")); RTC::ExecutionContextProfile* ecp; ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1000000), ecp->rate); // set_rate()を呼出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(CORBA::Double(1.0))); ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1.0), ecp->rate); // この時点で、on_rate_changed()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_rate_changed")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - add()メソッド呼出しにより、コンポーネントのattach_executioncontext()が呼び出されるか? */ void test_add_invoking_attach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("attach_executioncontext")); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点で、attach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("attach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - データフローコンポーネントではないLightweightRTObjectを指定してadd()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_add_not_with_data_flow_component() { // RTObjectを生成する // POA_RTC::LightweightRTObject* rto POA_RTC::LightweightRTObject* rto = new LightweightRTObjectMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // LightweightRTObjectではあるが、DataFlowComponentではないRTObjectを用いて、 // add()呼出しを試みて、意図どおりエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->add(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - remove()呼出しにより、コンポーネントのdetach_executioncontext()が呼び出されるか? */ void test_remove_invoking_detach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
707  = new RTC::PeriodicExecutionContext(); // will be deleted automatically
708  CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind());
709 
710  // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、on_rate_changed()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_rate_changed")); RTC::ExecutionContextProfile* ecp; ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1000000), ecp->rate); // set_rate()を呼出す CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(CORBA::Double(1.0))); ecp = ec->get_profile(); CPPUNIT_ASSERT_EQUAL(CORBA::Double(1.0), ecp->rate); // この時点で、on_rate_changed()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_rate_changed")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - add()メソッド呼出しにより、コンポーネントのattach_executioncontext()が呼び出されるか? */ void test_add_invoking_attach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("attach_executioncontext")); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点で、attach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("attach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - データフローコンポーネントではないLightweightRTObjectを指定してadd()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_add_not_with_data_flow_component() { // RTObjectを生成する // POA_RTC::LightweightRTObject* rto POA_RTC::LightweightRTObject* rto = new LightweightRTObjectMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // LightweightRTObjectではあるが、DataFlowComponentではないRTObjectを用いて、 // add()呼出しを試みて、意図どおりエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->add(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - remove()呼出しにより、コンポーネントのdetach_executioncontext()が呼び出されるか? */ void test_remove_invoking_detach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
711  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this()));
712 
713  // この時点では、on_rate_changed()は1回も呼び出されていないはず
714  CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_rate_changed"));
715 
717  ecp = ec->get_profile();
718  CPPUNIT_ASSERT_EQUAL(CORBA::Double(1000000), ecp->rate);
719 
720  // set_rate()を呼出す
721  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->set_rate(CORBA::Double(1.0)));
722  ecp = ec->get_profile();
723  CPPUNIT_ASSERT_EQUAL(CORBA::Double(1.0), ecp->rate);
724 
725  // この時点で、on_rate_changed()が1回だけ呼び出されているはず
726  CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_rate_changed"));
727 
728  ec->stop();
729  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
730  delete ec;
731  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto));
732  delete rto;
733  }
734 
741  {
742  // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("attach_executioncontext")); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点で、attach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("attach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - データフローコンポーネントではないLightweightRTObjectを指定してadd()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_add_not_with_data_flow_component() { // RTObjectを生成する // POA_RTC::LightweightRTObject* rto POA_RTC::LightweightRTObject* rto = new LightweightRTObjectMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // LightweightRTObjectではあるが、DataFlowComponentではないRTObjectを用いて、 // add()呼出しを試みて、意図どおりエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->add(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - remove()呼出しにより、コンポーネントのdetach_executioncontext()が呼び出されるか? */ void test_remove_invoking_detach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
743  POA_RTC::LightweightRTObject* rto
744  = new DataFlowComponentMock(); // will be deleted automatically
746  = dynamic_cast<DataFlowComponentMock*>(rto);
747 
748  // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("attach_executioncontext")); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点で、attach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("attach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - データフローコンポーネントではないLightweightRTObjectを指定してadd()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_add_not_with_data_flow_component() { // RTObjectを生成する // POA_RTC::LightweightRTObject* rto POA_RTC::LightweightRTObject* rto = new LightweightRTObjectMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // LightweightRTObjectではあるが、DataFlowComponentではないRTObjectを用いて、 // add()呼出しを試みて、意図どおりエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->add(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - remove()呼出しにより、コンポーネントのdetach_executioncontext()が呼び出されるか? */ void test_remove_invoking_detach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
750  = new RTC::PeriodicExecutionContext(); // will be deleted automatically
751 
752  // この時点では、attach_executioncontext()は1回も呼び出されていないはず
753  CPPUNIT_ASSERT_EQUAL(0, mock->countLog("attach_executioncontext"));
754 
755  // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点で、attach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("attach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief add()メソッドのテスト * * - データフローコンポーネントではないLightweightRTObjectを指定してadd()メソッドを呼び出した場合、意図どおりに失敗するか? */ void test_add_not_with_data_flow_component() { // RTObjectを生成する // POA_RTC::LightweightRTObject* rto POA_RTC::LightweightRTObject* rto = new LightweightRTObjectMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // LightweightRTObjectではあるが、DataFlowComponentではないRTObjectを用いて、 // add()呼出しを試みて、意図どおりエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->add(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - remove()呼出しにより、コンポーネントのdetach_executioncontext()が呼び出されるか? */ void test_remove_invoking_detach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
756  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this()));
757 
758  // この時点で、attach_executioncontext()が1回だけ呼び出されているはず
759  CPPUNIT_ASSERT_EQUAL(1, mock->countLog("attach_executioncontext"));
760 
761  ec->stop();
762  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
763  delete ec;
764  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto));
765  delete rto;
766  }
767 
774  {
775  // RTObjectを生成する// POA_RTC::LightweightRTObject* rto POA_RTC::LightweightRTObject* rto = new LightweightRTObjectMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // LightweightRTObjectではあるが、DataFlowComponentではないRTObjectを用いて、 // add()呼出しを試みて、意図どおりエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->add(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - remove()呼出しにより、コンポーネントのdetach_executioncontext()が呼び出されるか? */ void test_remove_invoking_detach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
776 // POA_RTC::LightweightRTObject* rto
777  POA_RTC::LightweightRTObject* rto
778  = new LightweightRTObjectMock(); // will be deleted automatically
779 
780  // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind()); // LightweightRTObjectではあるが、DataFlowComponentではないRTObjectを用いて、 // add()呼出しを試みて、意図どおりエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->add(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - remove()呼出しにより、コンポーネントのdetach_executioncontext()が呼び出されるか? */ void test_remove_invoking_detach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
782  = new RTC::PeriodicExecutionContext(); // will be deleted automatically
783  CPPUNIT_ASSERT_EQUAL(RTC::PERIODIC, ec->get_kind());
784 
785  // LightweightRTObjectではあるが、DataFlowComponentではないRTObjectを用いて、
786  // add()呼出しを試みて、意図どおりエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->add(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - remove()呼出しにより、コンポーネントのdetach_executioncontext()が呼び出されるか? */ void test_remove_invoking_detach_executioncontext() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
787  // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->add(rto->_this()));
788 
789  ec->stop();
790  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
791  delete ec;
792  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto));
793  delete rto;
794  }
795 
802  {
803  // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
804  POA_RTC::LightweightRTObject* rto
805  = new DataFlowComponentMock(); // will be deleted automatically
807  = dynamic_cast<DataFlowComponentMock*>(rto);
808 
809  // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
811  = new RTC::PeriodicExecutionContext(); // will be deleted automatically
812 
813  // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、attach_executioncontext()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext")); // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
814  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this()));
815 
816  // この時点では、attach_executioncontext()は1回も呼び出されていないはず
817  CPPUNIT_ASSERT_EQUAL(0, mock->countLog("detach_executioncontext"));
818 
819  // ExecutionContextへの登録を解除する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); // この時点で、detach_executioncontext()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - まだExecutionContextに登録していないコンポーネントについて登録解除を試みて、意図どおりに失敗するか? */ void test_remove_with_not_attached_component() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
820  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this()));
821 
822  // この時点で、detach_executioncontext()が1回だけ呼び出されているはず
823  CPPUNIT_ASSERT_EQUAL(1, mock->countLog("detach_executioncontext"));
824 
825  ec->stop();
826  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
827  delete ec;
828  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto));
829  delete rto;
830  }
831 
838  {
839  // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // Error状態でactivate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // activate_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - deactivate_component()呼出しにより、コンポーネントのon_deactivated()が呼び出されるか? */ void test_deactivate_component_invoking_on_deactivated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated")); // コンポーネントをdeactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // この時点で、on_deactivated()は1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してdeactivate_component()を呼出し、意図どおりに失敗するか? */ void test_deactivate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief deactivate_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してdeactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_deactivate_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically ec->start(); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをactivateする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // 非Alive状態にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // 非Alive状態のコンポーネントに対してdeactivateを試みて、意図どおりのエラーコードで戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - reset_component()呼出しにより、コンポーネントのon_reset()が呼び出されるか? */ void test_reset_component_invoking_on_reset() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // コンポーネントをError状態にまで遷移させる mock->setError(true); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か? CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this())); // この時点では、on_reset()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset")); // reset_component()を呼出し、成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this())); coil::usleep(100000); // この時点で、on_reset()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset")); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Error状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Inactive)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief reset_component()メソッドのテスト * * - 非Alive状態のコンポーネントに対してreset_component()呼出しを行い、意図どおりに失敗するか? */ void test_reset_component_not_in_Alive_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // 非Alive状態(Create状態)にしておく mock->setAlive(false); CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL)); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この状態(Created)でreset_component()呼出しを行い、意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief bindComponent()メソッドのテスト * * - コンポーネントの参加者リストへ正しく登録されるか? */ void test_bindComponent() { // RTObjectを生成する RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA); coil::Properties prop; prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext"); prop.setProperty("exec_cxt.periodic.rate","1000"); rto->setProperties(prop); // ExecutionContextを生成する PeriodicExecutionContextMock* ec = new PeriodicExecutionContextMock(); // RTC::BAD_PARAMETER を返すか? CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL)); // RTC::RTC_OK を返すか? CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto)); // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか? for (int i = 0; i < 1000; ++i) { ec->bindComponent(rto); } CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか? ec->m_refmock = RTC::ExecutionContextService::_nil(); ec->set_m_ref(); CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto)); // 登録したコンポーネントの削除 ec->clear_m_comps(); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } }; }; // namespace PeriodicExecutionContext /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // PeriodicExecutionContext_cpp
840  POA_RTC::LightweightRTObject* rto
841  = new DataFlowComponentMock(); // will be deleted automatically
842 
843  // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、 // 意図どおりのエラーコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Active状態のコンポーネントに対してremove()を試みた場合、意図どおりに失敗するか? */ void test_remove_when_component_is_still_active() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントがActiveのままでremove()を試みて、意図どおりのエラーコードが戻ることを確認する // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief remove()メソッドのテスト * * - Inactive状態のコンポーネントに対して、正常にremove()できるか? */ void test_remove_when_component_is_inactive() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); // コンポーネントをInactiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this())); coil::usleep(100000); CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this())); // remove()が成功することを確認する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate()メソッドのテスト * * - activate()呼出しにより、コンポーネントのon_activated()が呼び出されるか? */ void test_activate_component_invoking_on_activated() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto); // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにRTObjectを登録する CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this())); // この時点では、まだon_activated()は1回も呼び出されていないはず CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated")); // コンポーネントをActiveにする CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this())); coil::usleep(100000); // activate_component()からon_activated()の呼出しは同期呼出であり、 // この時点で、on_activated()が1回だけ呼び出されているはず CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated")); // activate_component()からon_activated()の呼出しは同期呼出であり、 // スレッドコンテキストを切替えることなく、Active状態に遷移していることを確認する CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * activate()メソッドのテスト * * - ExecutionContextに未登録のコンポーネントに対してactivate()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_without_participating() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically // ExecutionContextを生成する RTC::PeriodicExecutionContext* ec = new RTC::PeriodicExecutionContext(); // will be deleted automatically CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start()); // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、 // 意図どおりのエラコードで戻ることを確認する CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this())); ec->stop(); m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec)); delete ec; m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto)); delete rto; } /*! * @brief activate_component()メソッドのテスト * * - Error状態でactivate_component()呼出しを行い、意図どおりに失敗するか? */ void test_activate_component_in_Error_state() { // RTObjectを生成する POA_RTC::LightweightRTObject* rto = new DataFlowComponentMock(); // will be deleted automatically DataFlowComponentMock* mock = dynamic_cast<DataFlowComponentMock*>(rto);