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); // 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
845  = new RTC::PeriodicExecutionContext(); // will be deleted automatically
846 
847  // まだ登録していないコンポーネントについてExecutionContextからの登録解除を試みて、
848  // 意図どおりのエラーコードで戻ることを確認する 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
849  CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->remove_component(rto->_this()));
850 
851  ec->stop();
852  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
853  delete ec;
854  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto));
855  delete rto;
856  }
857 
864  {
865  // 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
866  POA_RTC::LightweightRTObject* rto
867  = new DataFlowComponentMock(); // will be deleted automatically
868 
869  // 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
871  = new RTC::PeriodicExecutionContext(); // will be deleted automatically
872  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start());
873 
874  // 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
875  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this()));
876 
877  // コンポーネントを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
878  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this()));
879  usleep(100000);
880  CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this()));
881 
882  // コンポーネントが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
883  // CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->remove(rto->_this()));
884 
885  ec->stop();
886  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
887  delete ec;
888  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto));
889  delete rto;
890  }
891 
898  {
899  // 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
900  POA_RTC::LightweightRTObject* rto
901  = new DataFlowComponentMock(); // will be deleted automatically
902 
903  // 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
905  = new RTC::PeriodicExecutionContext(); // will be deleted automatically
906  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start());
907 
908  // 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
909  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this()));
910 
911  // コンポーネントを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
912  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this()));
913  coil::usleep(100000);
914  CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this()));
915 
916  // コンポーネントを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
917  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this()));
918  coil::usleep(100000);
919  CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this()));
920 
921  // 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
922  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->remove_component(rto->_this()));
923 
924  ec->stop();
925  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
926  delete ec;
927  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto));
928  delete rto;
929  }
930 
937  {
938  // RTObjectを生成する POA_RTC::LightweightRTObject* 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
939  POA_RTC::LightweightRTObject* rto
940  = new DataFlowComponentMock(); // will be deleted automatically
942  = dynamic_cast<DataFlowComponentMock*>(rto);
943 
944  // 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
946  = new RTC::PeriodicExecutionContext(); // will be deleted automatically
947  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start());
948 
949  // 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
950  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this()));
951 
952  // この時点では、まだon_activated()は1回も呼び出されていないはず
953  CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_activated"));
954 
955  // コンポーネントを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
956  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this()));
957 
958  coil::usleep(100000);
959  // activate_component()からon_activated()の呼出しは同期呼出であり、
960  // この時点で、on_activated()が1回だけ呼び出されているはず
961  CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_activated"));
962 
963  // activate_component()からon_activated()の呼出しは同期呼出であり、
964  // スレッドコンテキストを切替えることなく、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
965  CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this()));
966 
967  ec->stop();
968  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
969  delete ec;
970  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto));
971  delete rto;
972  }
973 
980  {
981  // 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
982  POA_RTC::LightweightRTObject* rto
983  = new DataFlowComponentMock(); // will be deleted automatically
984 
985  // 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
987  = new RTC::PeriodicExecutionContext(); // will be deleted automatically
988  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start());
989 
990  // ExecutionContextにコンポーネント登録することなくactivate_component()を呼出し、
991  // 意図どおりのエラコードで戻ることを確認する 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
992  CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this()));
993 
994  ec->stop();
995  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
996  delete ec;
997  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto));
998  delete rto;
999  }
1000 
1007  {
1008  // RTObjectを生成する POA_RTC::LightweightRTObject* 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
1009  POA_RTC::LightweightRTObject* rto
1010  = new DataFlowComponentMock(); // will be deleted automatically
1011  DataFlowComponentMock* mock
1012  = dynamic_cast<DataFlowComponentMock*>(rto);
1013 
1014  // 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
1016  = new RTC::PeriodicExecutionContext(); // will be deleted automatically
1017  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start());
1018 
1019  // コンポーネントを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
1020  mock->setError(true);
1021  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this()));
1022  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this()));
1023  coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か?
1024  CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this()));
1025 
1026  // 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
1027  CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->activate_component(rto->_this()));
1028 
1029  ec->stop();
1030  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
1031  delete ec;
1032  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto));
1033  delete rto;
1034  }
1035 
1042  {
1043  // RTObjectを生成する POA_RTC::LightweightRTObject* 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
1044  POA_RTC::LightweightRTObject* rto
1045  = new DataFlowComponentMock(); // will be deleted automatically
1046  DataFlowComponentMock* mock
1047  = dynamic_cast<DataFlowComponentMock*>(rto);
1048 
1049  // 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
1051  = new RTC::PeriodicExecutionContext(); // will be deleted automatically
1052 
1053  // 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
1054  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this()));
1055 
1056  // 非Alive状態にしておく
1057  mock->setAlive(false);
1058  CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL));
1059 
1060  // 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
1061  // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->activate_component(rto->_this()));
1062 
1063  ec->stop();
1064  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
1065  delete ec;
1066  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto));
1067  delete rto;
1068  }
1069 
1076  {
1077  // RTObjectを生成する POA_RTC::LightweightRTObject* 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
1078  POA_RTC::LightweightRTObject* rto
1079  = new DataFlowComponentMock(); // will be deleted automatically
1080  DataFlowComponentMock* mock
1081  = dynamic_cast<DataFlowComponentMock*>(rto);
1082 
1083  // 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
1085  = new RTC::PeriodicExecutionContext(); // will be deleted automatically
1086  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start());
1087 
1088  // 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
1089  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this()));
1090 
1091  // コンポーネントを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
1092  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this()));
1093  coil::usleep(100000);
1094  CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this()));
1095 
1096  // この時点では、まだon_activated()は1回も呼び出されていないはず
1097  CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_deactivated"));
1098 
1099  // コンポーネントを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
1100  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->deactivate_component(rto->_this()));
1101  coil::usleep(100000);
1102  CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this()));
1103 
1104  // この時点で、on_deactivated()は1回だけ呼び出されているはず
1105  CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_deactivated"));
1106 
1107  ec->stop();
1108  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
1109  delete ec;
1110  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto));
1111  delete rto;
1112  }
1113 
1120  {
1121  // 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
1122  POA_RTC::LightweightRTObject* rto
1123  = new DataFlowComponentMock(); // will be deleted automatically
1124 
1125  // 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
1127  = new RTC::PeriodicExecutionContext(); // will be deleted automatically
1128  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start());
1129 
1130  // ExecutionContextに登録していないコンポーネントに対してdeactivateを試みて、
1131  // 意図どおりのエラーコードで戻ることを確認する 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
1132  CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this()));
1133 
1134  ec->stop();
1135  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
1136  delete ec;
1137  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto));
1138  delete rto;
1139  }
1140 
1147  {
1148  // RTObjectを生成する POA_RTC::LightweightRTObject* 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
1149  POA_RTC::LightweightRTObject* rto
1150  = new DataFlowComponentMock(); // will be deleted automatically
1151  DataFlowComponentMock* mock
1152  = dynamic_cast<DataFlowComponentMock*>(rto);
1153 
1154  // 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
1156  = new RTC::PeriodicExecutionContext(); // will be deleted automatically
1157 
1158  ec->start();
1159 
1160  // 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
1161  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this()));
1162 
1163  // コンポーネントを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
1164  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this()));
1165  usleep(100000);
1166  CPPUNIT_ASSERT_EQUAL(RTC::ACTIVE_STATE, ec->get_component_state(rto->_this()));
1167 
1168  // 非Alive状態にしておく
1169  mock->setAlive(false);
1170  CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL));
1171 
1172  // 非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
1173  // CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->deactivate_component(rto->_this()));
1174 
1175  ec->stop();
1176  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
1177  delete ec;
1178  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto));
1179  delete rto;
1180  }
1181 
1188  {
1189  // RTObjectを生成する POA_RTC::LightweightRTObject* 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
1190  POA_RTC::LightweightRTObject* rto
1191  = new DataFlowComponentMock(); // will be deleted automatically
1192  DataFlowComponentMock* mock
1193  = dynamic_cast<DataFlowComponentMock*>(rto);
1194 
1195  // 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
1197  = new RTC::PeriodicExecutionContext(); // will be deleted automatically
1198  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start());
1199 
1200  // コンポーネントを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
1201  mock->setError(true);
1202  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this()));
1203  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->activate_component(rto->_this()));
1204  coil::sleep(1); // Error状態へ遷移するまで待つ。本来、このスリープが仕様上必要か否か?
1205  CPPUNIT_ASSERT_EQUAL(RTC::ERROR_STATE, ec->get_component_state(rto->_this()));
1206 
1207  // この時点では、on_reset()は1回も呼び出されていないはず
1208  CPPUNIT_ASSERT_EQUAL(0, mock->countLog("on_reset"));
1209 
1210  // 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
1211  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->reset_component(rto->_this()));
1212  coil::usleep(100000);
1213  // この時点で、on_reset()が1回だけ呼び出されているはず
1214  CPPUNIT_ASSERT_EQUAL(1, mock->countLog("on_reset"));
1215 
1216  ec->stop();
1217  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
1218  delete ec;
1219  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto));
1220  delete rto;
1221  }
1222 
1229  {
1230  // 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
1231  POA_RTC::LightweightRTObject* rto
1232  = new DataFlowComponentMock(); // will be deleted automatically
1233 
1234  // 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
1236  = new RTC::PeriodicExecutionContext(); // will be deleted automatically
1237  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->start());
1238 
1239  // 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
1240  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this()));
1241 
1242  // この状態(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
1243  CPPUNIT_ASSERT_EQUAL(RTC::INACTIVE_STATE, ec->get_component_state(rto->_this()));
1244  CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this()));
1245 
1246  ec->stop();
1247  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
1248  delete ec;
1249  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto));
1250  delete rto;
1251  }
1252 
1259  {
1260  // 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
1261  POA_RTC::LightweightRTObject* rto
1262  = new DataFlowComponentMock(); // will be deleted automatically
1263  DataFlowComponentMock* mock
1264  = dynamic_cast<DataFlowComponentMock*>(rto);
1265 
1266  // 非Alive状態(Create状態)にしておく
1267  mock->setAlive(false);
1268  CPPUNIT_ASSERT_EQUAL(CORBA::Boolean(false), rto->is_alive(NULL));
1269 
1270  // 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
1272  = new RTC::PeriodicExecutionContext(); // will be deleted automatically
1273 
1274  // 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
1275  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->add_component(rto->_this()));
1276 
1277  // この状態(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
1278  CPPUNIT_ASSERT_EQUAL(RTC::PRECONDITION_NOT_MET, ec->reset_component(rto->_this()));
1279 
1280  ec->stop();
1281  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
1282  delete ec;
1283  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto));
1284  delete rto;
1285  }
1286 
1293  {
1294  // 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
1295  RTObjectMock* rto = new RTObjectMock(m_pORB, m_pPOA);
1297  prop.setProperty("exec_cxt.periodic.type","PeriodicExecutionContext");
1298  prop.setProperty("exec_cxt.periodic.rate","1000");
1299  rto->setProperties(prop);
1300 
1301  // 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
1303 
1304  // RTC::BAD_PARAMETER を返すか?
1305  CPPUNIT_ASSERT_EQUAL(RTC::BAD_PARAMETER, ec->bindComponent(NULL));
1306 
1307  // RTC::RTC_OK を返すか?
1308  CPPUNIT_ASSERT_EQUAL(RTC::RTC_OK, ec->bindComponent(rto));
1309 
1310  // 1000件登録後、(id > ECOTHER_OFFSET)判定のRTC::RTC_ERROR を返すか?
1311  for (int i = 0; i < 1000; ++i)
1312  {
1313  ec->bindComponent(rto);
1314  }
1315  CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto));
1316 
1317  // m_ref=_nil()値の場合、(id < 0)判定のRTC::RTC_ERROR を返すか?
1318  ec->m_refmock = RTC::ExecutionContextService::_nil();
1319  ec->set_m_ref();
1320  CPPUNIT_ASSERT_EQUAL(RTC::RTC_ERROR, ec->bindComponent(rto));
1321 
1322  // 登録したコンポーネントの削除 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
1323  ec->clear_m_comps();
1324 
1325  ec->stop();
1326  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ec));
1327  delete ec;
1328  m_pPOA->deactivate_object(*m_pPOA->servant_to_id(rto));
1329  delete rto;
1330  }
1331 
1332  };
1333 }; // namespace PeriodicExecutionContext
1334 
1335 /*
1336  * Register test suite
1337  */
1339 
1340 #ifdef LOCAL_MAIN
1341 int main(int argc, char* argv[])
1342 {
1343 
1344  FORMAT format = TEXT_OUT;
1345  int target = 0;
1346  std::string xsl;
1347  std::string ns;
1348  std::string fname;
1349  std::ofstream ofs;
1350 
1351  int i(1);
1352  while (i < argc)
1353  {
1354  std::string arg(argv[i]);
1355  std::string next_arg;
1356  if (i + 1 < argc) next_arg = argv[i + 1];
1357  else next_arg = "";
1358 
1359  if (arg == "--text") { format = TEXT_OUT; break; }
1360  if (arg == "--xml")
1361  {
1362  if (next_arg == "")
1363  {
1364  fname = argv[0];
1365  fname += ".xml";
1366  }
1367  else
1368  {
1369  fname = next_arg;
1370  }
1371  format = XML_OUT;
1372  ofs.open(fname.c_str());
1373  }
1374  if ( arg == "--compiler" ) { format = COMPILER_OUT; break; }
1375  if ( arg == "--cerr" ) { target = 1; break; }
1376  if ( arg == "--xsl" )
1377  {
1378  if (next_arg == "") xsl = "default.xsl";
1379  else xsl = next_arg;
1380  }
1381  if ( arg == "--namespace" )
1382  {
1383  if (next_arg == "")
1384  {
1385  std::cerr << "no namespace specified" << std::endl;
1386  exit(1);
1387  }
1388  else
1389  {
1390  xsl = next_arg;
1391  }
1392  }
1393  ++i;
1394  }
1395  CppUnit::TextUi::TestRunner runner;
1396  if ( ns.empty() )
1397  runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
1398  else
1399  runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest());
1400  CppUnit::Outputter* outputter = 0;
1401  std::ostream* stream = target ? &std::cerr : &std::cout;
1402  switch ( format )
1403  {
1404  case TEXT_OUT :
1405  outputter = new CppUnit::TextOutputter(&runner.result(),*stream);
1406  break;
1407  case XML_OUT :
1408  std::cout << "XML_OUT" << std::endl;
1409  outputter = new CppUnit::XmlOutputter(&runner.result(),
1410  ofs, "shift_jis");
1411  static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl);
1412  break;
1413  case COMPILER_OUT :
1414  outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream);
1415  break;
1416  }
1417  runner.setOutputter(outputter);
1418  runner.run();
1419  return 0; // runner.run() ? 0 : 1;
1420 }
1421 #endif // MAIN
1422 #endif // PeriodicExecutionContext_cpp
virtual RTC::ReturnCode_t on_activated(RTC::UniqueId ec_id)
#define RTC_ERROR(fmt)
Error log output macro.
Definition: SystemLogger.h:422
virtual SDOPackage::SDOService_ptr get_sdo_service(const char *id)
int main(int argc, char **argv)
EXECUTION_HANDLE_TYPE_NATIVE ExecutionContextHandle_t
Definition: IRTC.h:63
RT-Component.
void test_start_and_stop_multiple_times()
start()メソッドとstop()メソッドのテスト
void test_deactivate_component_invoking_on_deactivated()
deactivate_component()メソッドのテスト
void test_reset_component_invoking_on_reset()
reset_component()メソッドのテスト
virtual ReturnCode_t remove_component(LightweightRTObject_ptr comp)
Remove the RT-Component from participant list.
virtual RTC::ReturnCode_t on_state_update(RTC::UniqueId ec_id)
void test_add_invoking_attach_executioncontext()
add()メソッドのテスト
unsigned int sleep(unsigned int seconds)
Stop a processing at specified second time.
Definition: ace/coil/Time.h:40
std::vector< Comp > m_comps
List of the participating component.
virtual SDOPackage::ServiceProfileList * get_service_profiles()
virtual RTC::ExecutionContextList * get_participating_contexts()
ReturnCode_t
Definition: doil.h:53
virtual CORBA::Boolean is_alive(RTC::_objref_ExecutionContext *exec_context)
std::vector< std::pair< std::string, std::string > > NVList
Definition: IRTC.h:67
virtual RTC::ReturnCode_t bindComponent(RTObject_impl *rtc)
Bind the component.
void test_remove_invoking_detach_executioncontext()
remove()メソッドのテスト
RT-Component class.
Definition: RTObject.h:89
void test_activate_component_in_Error_state()
activate_component()メソッドのテスト
void test_remove_when_component_is_inactive()
remove()メソッドのテスト
virtual ReturnCode_t add_component(LightweightRTObject_ptr comp)
Add an RT-component.
virtual RTC::ReturnCode_t on_reset(RTC::UniqueId ec_id)
virtual CORBA::Boolean is_running(void)
Check for ExecutionContext running state.
virtual RTC::ReturnCode_t detach_context(RTC::UniqueId ec_id)
void test_reset_component_not_in_Alive_state()
reset_component()メソッドのテスト
SDO Package.
void test_activate_component_not_in_Alive_state()
activate_component()メソッドのテスト
void test_reset_component_not_in_Error_state()
reset_component()メソッドのテスト
std::vector< ExecutionContext * > ExecutionContextList
Definition: IRTC.h:69
RTObjectMock(CORBA::ORB_ptr orb, PortableServer::POA_ptr poa)
ExecutionContextHandle_t UniqueId
virtual RTC::ReturnCode_t on_error(RTC::UniqueId ec_id)
virtual RTC::ReturnCode_t on_execute(RTC::UniqueId ec_id)
virtual RTC::ReturnCode_t on_shutdown(RTC::UniqueId ec_id)
virtual SDOPackage::ServiceProfile * get_service_profile(const char *id)
virtual ReturnCode_t start(void)
Start the ExecutionContext.
void test_set_rate_with_zero_or_negative_rate()
set_rate()メソッドのテスト
void test_remove_with_not_attached_component()
remove()メソッドのテスト
void test_deactivate_component_without_participating()
deactivate_component()メソッドのテスト
std::string setProperty(const std::string &key, const std::string &value)
Set a value associated with key in the property list.
Definition: Properties.cpp:236
std::map< RTC::UniqueId, RTC::ExecutionContext_ptr > ExecContexts
virtual ReturnCode_t activate_component(LightweightRTObject_ptr comp)
Activate an RT-component.
CORBA sequence utility template functions.
virtual RTC::ReturnCode_t on_deactivated(RTC::UniqueId ec_id)
virtual SDOPackage::OrganizationList * get_organizations()
virtual ReturnCode_t reset_component(LightweightRTObject_ptr comp)
Reset the RT-component.
prop
Organization::get_organization_property ();.
virtual ReturnCode_t stop(void)
Stop the ExecutionContext.
virtual ReturnCode_t deactivate_component(LightweightRTObject_ptr comp)
Deactivate an RT-component.
Class represents a set of properties.
Definition: Properties.h:101
virtual ReturnCode_t set_rate(CORBA::Double rate)
Set execution rate(Hz) of ExecutionContext.
virtual RTC::UniqueId attach_context(RTC::ExecutionContext_ptr exec_context)
virtual ExecutionKind get_kind(void)
Get the ExecutionKind.
std::vector< IPortService * > PortServiceList
Definition: IPortService.h:39
void test_activate_component_invoking_on_activated()
activate()メソッドのテスト
PeriodicExecutionContext class.
virtual RTC::ReturnCode_t on_aborting(RTC::UniqueId ec_id)
virtual RTC::_objref_ExecutionContext * get_context(RTC::ExecutionContextHandle_t)
virtual RTC::ReturnCode_t on_rate_changed(RTC::UniqueId ec_id)
ExecutionContextService_var m_ref
Reference to ExecutionContextService object.
PeriodicExecutionContext class.
virtual LifeCycleState get_component_state(LightweightRTObject_ptr comp)
Get RT-component&#39;s state.
void test_remove_when_component_is_still_active()
remove()メソッドのテスト
virtual CORBA::Double get_rate(void)
Get execution rate(Hz) of ExecutionContext.
void test_set_rate_and_get_rate()
set_rate()メソッドとget_rate()メソッドのテスト
virtual RTC::ExecutionContextServiceList * get_execution_context_services()
void test_bindComponent()
bindComponent()メソッドのテスト
CPPUNIT_TEST_SUITE_REGISTRATION(PeriodicExecutionContext::PeriodicExecutionContextTests)
virtual SDOPackage::Configuration_ptr get_configuration()
void setProperties(const coil::Properties &prop)
[local interface] Set RTC property
Definition: RTObject.cpp:1497
virtual ExecutionContextProfile * get_profile(void)
Get the ExecutionContextProfile.
virtual RTC::ReturnCode_t on_startup(RTC::UniqueId ec_id)
RTC::Local::ExecutionContextProfile ExecutionContextProfile
int usleep(useconds_t usec)
Stop a processing at specified micro second time.
Definition: ace/coil/Time.h:51
virtual RTC::ExecutionContextHandle_t get_context_handle(RTC::_objref_ExecutionContext *)
void test_deactivate_component_not_in_Alive_state()
deactivate_component()メソッドのテスト
virtual SDOPackage::OrganizationList * get_owned_organizations()


openrtm_aist
Author(s): Noriaki Ando
autogenerated on Mon Jun 10 2019 14:07:54