Go to the documentation of this file.00001
00012
00013
00014
00015
00016
00017
00018 #ifndef OutPortCorbaCdrProvider_cpp
00019 #define OutPortCorbaCdrProvider_cpp
00020
00021 #include <cppunit/ui/text/TestRunner.h>
00022 #include <cppunit/TextOutputter.h>
00023 #include <cppunit/extensions/TestFactoryRegistry.h>
00024 #include <cppunit/extensions/HelperMacros.h>
00025 #include <cppunit/TestAssert.h>
00026
00027 #include <rtm/idl/BasicDataTypeSkel.h>
00028 #include <rtm/idl/DataPortSkel.h>
00029 #include <rtm/RTC.h>
00030 #include <rtm/Typename.h>
00031 #include <rtm/OutPortCorbaCdrProvider.h>
00032 #include <rtm/OutPortCorbaCdrConsumer.h>
00033 #include <rtm/CdrBufferBase.h>
00034 #include <rtm/PortAdmin.h>
00035 #include <rtm/CORBA_SeqUtil.h>
00036 #include <rtm/NVUtil.h>
00037 #include <rtm/DataPortStatus.h>
00038 #include <rtm/ConnectorListener.h>
00039 #include <rtm/OutPortPullConnector.h>
00040
00045 namespace OutPortCorbaCdrProvider
00046 {
00047
00048 class DataListener
00049 : public RTC::ConnectorDataListenerT<RTC::TimedLong>
00050 {
00051 public:
00052 DataListener(const char* name) : m_name(name) {}
00053 virtual ~DataListener()
00054 {
00055
00056 }
00057
00058 virtual void operator()(const RTC::ConnectorInfo& info,
00059 const RTC::TimedLong& data)
00060 {
00061 std::cout << "------------------------------" << std::endl;
00062 std::cout << "Data Listener: " << m_name << std::endl;
00063 std::cout << "Profile::name: " << info.name << std::endl;
00064 std::cout << "------------------------------" << std::endl;
00065 };
00066 std::string m_name;
00067 };
00068
00069
00070 class ConnListener
00071 : public RTC::ConnectorListener
00072 {
00073 public:
00074 ConnListener(const char* name) : m_name(name) {}
00075 virtual ~ConnListener()
00076 {
00077
00078 }
00079
00080 virtual void operator()(const RTC::ConnectorInfo& info)
00081 {
00082 std::cout << "------------------------------" << std::endl;
00083 std::cout << "Connector Listener: " << m_name << std::endl;
00084 std::cout << "Profile::name: " << info.name << std::endl;
00085 std::cout << "------------------------------" << std::endl;
00086 };
00087 std::string m_name;
00088 };
00089
00094 class OutPortCorbaCdrProviderMock
00095 : public RTC::OutPortCorbaCdrProvider
00096 {
00097 public:
00102 OutPortCorbaCdrProviderMock(void)
00103 {
00104 }
00109 virtual ~OutPortCorbaCdrProviderMock()
00110 {
00111 }
00116 SDOPackage::NVList get_m_properties()
00117 {
00118 return m_properties;
00119 }
00120 };
00121 class OutPortCorbaCdrProviderTests
00122 : public CppUnit::TestFixture
00123 {
00124 CPPUNIT_TEST_SUITE(OutPortCorbaCdrProviderTests);
00125
00126 CPPUNIT_TEST(test_case0);
00127 CPPUNIT_TEST_SUITE_END();
00128
00129 private:
00130 CORBA::ORB_ptr m_pORB;
00131 PortableServer::POA_ptr m_pPOA;
00132
00133 public:
00134 RTC::ConnectorListeners m_listeners;
00135
00139 OutPortCorbaCdrProviderTests()
00140 {
00141 int argc(0);
00142 char** argv(NULL);
00143 m_pORB = CORBA::ORB_init(argc, argv);
00144 m_pPOA = PortableServer::POA::_narrow(
00145 m_pORB->resolve_initial_references("RootPOA"));
00146 m_pPOA->the_POAManager()->activate();
00147 }
00148
00152 ~OutPortCorbaCdrProviderTests()
00153 {
00154 }
00155
00159 virtual void setUp()
00160 {
00161 }
00162
00166 virtual void tearDown()
00167 {
00168 }
00169
00174 void test_case0()
00175 {
00176
00177
00178
00179 OutPortCorbaCdrProviderMock* provider
00180 = new OutPortCorbaCdrProviderMock();
00181
00182
00183 coil::Properties prop;
00184 coil::vstring ports;
00185 RTC::ConnectorInfo info("name", "id", ports, prop);
00186
00187
00188 m_listeners.connectorData_[RTC::ON_BUFFER_WRITE].addListener(
00189 new DataListener("ON_BUFFER_WRITE"), true);
00190 m_listeners.connectorData_[RTC::ON_BUFFER_FULL].addListener(
00191 new DataListener("ON_BUFFER_FULL"), true);
00192 m_listeners.connectorData_[RTC::ON_BUFFER_WRITE_TIMEOUT].addListener(
00193 new DataListener("ON_BUFFER_WRITE_TIMEOUT"), true);
00194 m_listeners.connectorData_[RTC::ON_BUFFER_OVERWRITE].addListener(
00195 new DataListener("ON_BUFFER_OVERWRITE"), true);
00196 m_listeners.connectorData_[RTC::ON_BUFFER_READ].addListener(
00197 new DataListener("ON_BUFFER_READ"), true);
00198 m_listeners.connectorData_[RTC::ON_SEND].addListener(
00199 new DataListener("ON_SEND"), true);
00200 m_listeners.connectorData_[RTC::ON_RECEIVED].addListener(
00201 new DataListener("ON_RECEIVED"), true);
00202 m_listeners.connectorData_[RTC::ON_RECEIVER_FULL].addListener(
00203 new DataListener("ON_RECEIVER_FULL"), true);
00204 m_listeners.connectorData_[RTC::ON_RECEIVER_TIMEOUT].addListener(
00205 new DataListener("ON_RECEIVER_TIMEOUT"), true);
00206 m_listeners.connectorData_[RTC::ON_RECEIVER_ERROR].addListener(
00207 new DataListener("ON_RECEIVER_ERROR"), true);
00208
00209
00210 m_listeners.connector_[RTC::ON_BUFFER_EMPTY].addListener(
00211 new ConnListener("ON_BUFFER_EMPTY"), true);
00212 m_listeners.connector_[RTC::ON_BUFFER_READ_TIMEOUT].addListener(
00213 new ConnListener("ON_BUFFER_READ_TIMEOUT"), true);
00214 m_listeners.connector_[RTC::ON_SENDER_EMPTY].addListener(
00215 new ConnListener("ON_SENDER_EMPTY"), true);
00216 m_listeners.connector_[RTC::ON_SENDER_TIMEOUT].addListener(
00217 new ConnListener("ON_SENDER_TIMEOUT"), true);
00218 m_listeners.connector_[RTC::ON_SENDER_ERROR].addListener(
00219 new ConnListener("ON_SENDER_ERROR"), true);
00220 m_listeners.connector_[RTC::ON_CONNECT].addListener(
00221 new ConnListener("ON_CONNECT"), true);
00222 m_listeners.connector_[RTC::ON_DISCONNECT].addListener(
00223 new ConnListener("ON_DISCONNECT"), true);
00224
00225 provider->setListener(info, &m_listeners);
00226
00227 int index;
00228
00229 index = NVUtil::find_index(provider->get_m_properties(),
00230 "dataport.corba_cdr.outport_ior");
00231 CPPUNIT_ASSERT(0<=index);
00232
00233
00234 index = NVUtil::find_index(provider->get_m_properties(),
00235 "dataport.corba_cdr.outport_ref");
00236 CPPUNIT_ASSERT(0<=index);
00237
00238 provider->init(prop);
00239
00240 RTC::CdrBufferBase* buffer;
00241 buffer = RTC::CdrBufferFactory::instance().createObject("ring_buffer");
00242
00243 ::OpenRTM::PortStatus retcode;
00244
00245 ::OpenRTM::CdrData_var cdr_data;
00246
00247
00248 retcode = provider->get(cdr_data.out());
00249 CPPUNIT_ASSERT_EQUAL((::OpenRTM::PortStatus)5, retcode);
00250
00251 provider->setBuffer(buffer);
00252
00253 RTC::OutPortConnector* connector;
00254 connector = new RTC::OutPortPullConnector(info,
00255 provider,
00256 m_listeners,
00257 buffer);
00258 if (connector == 0)
00259 {
00260 std::cout << "ERROR: Connector creation failed." << std::endl;
00261 }
00262 provider->setConnector(connector);
00263
00264
00265 retcode = provider->get(cdr_data);
00266 CPPUNIT_ASSERT_EQUAL((::OpenRTM::PortStatus)3, retcode);
00267
00268 int testdata[8] = { 12,34,56,78,90,23,45,99 };
00269 cdrMemoryStream cdr;
00270 RTC::TimedLong td;
00271 for(int ic(0);ic<8;++ic)
00272 {
00273 td.data = testdata[ic];
00274 td >>= cdr;
00275 buffer->write(cdr);
00276
00277 }
00278
00279 retcode = provider->get(cdr_data);
00280 CPPUNIT_ASSERT_EQUAL((::OpenRTM::PortStatus)0, retcode);
00281
00282
00283 SDOPackage::NVList list = provider->get_m_properties();
00284 index = NVUtil::find_index(list,
00285 "dataport.corba_cdr.outport_ior");
00286
00287 const char* ior;
00288 if (list[index].value >>= ior)
00289 {
00290 CORBA::Object_ptr var = m_pORB->string_to_object(ior);
00291 PortableServer::Servant ser = m_pPOA->reference_to_servant(var);
00292 m_pPOA->deactivate_object(*m_pPOA->servant_to_id(ser));
00293 }
00294
00295
00296 delete connector;
00297 }
00298 };
00299 };
00300
00301
00302
00303
00304 CPPUNIT_TEST_SUITE_REGISTRATION(OutPortCorbaCdrProvider::OutPortCorbaCdrProviderTests);
00305
00306 #ifdef LOCAL_MAIN
00307 int main(int argc, char* argv[])
00308 {
00309
00310 FORMAT format = TEXT_OUT;
00311 int target = 0;
00312 std::string xsl;
00313 std::string ns;
00314 std::string fname;
00315 std::ofstream ofs;
00316
00317 int i(1);
00318 while (i < argc)
00319 {
00320 std::string arg(argv[i]);
00321 std::string next_arg;
00322 if (i + 1 < argc) next_arg = argv[i + 1];
00323 else next_arg = "";
00324
00325 if (arg == "--text") { format = TEXT_OUT; break; }
00326 if (arg == "--xml")
00327 {
00328 if (next_arg == "")
00329 {
00330 fname = argv[0];
00331 fname += ".xml";
00332 }
00333 else
00334 {
00335 fname = next_arg;
00336 }
00337 format = XML_OUT;
00338 ofs.open(fname.c_str());
00339 }
00340 if ( arg == "--compiler" ) { format = COMPILER_OUT; break; }
00341 if ( arg == "--cerr" ) { target = 1; break; }
00342 if ( arg == "--xsl" )
00343 {
00344 if (next_arg == "") xsl = "default.xsl";
00345 else xsl = next_arg;
00346 }
00347 if ( arg == "--namespace" )
00348 {
00349 if (next_arg == "")
00350 {
00351 std::cerr << "no namespace specified" << std::endl;
00352 exit(1);
00353 }
00354 else
00355 {
00356 xsl = next_arg;
00357 }
00358 }
00359 ++i;
00360 }
00361 CppUnit::TextUi::TestRunner runner;
00362 if ( ns.empty() )
00363 runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
00364 else
00365 runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest());
00366 CppUnit::Outputter* outputter = 0;
00367 std::ostream* stream = target ? &std::cerr : &std::cout;
00368 switch ( format )
00369 {
00370 case TEXT_OUT :
00371 outputter = new CppUnit::TextOutputter(&runner.result(),*stream);
00372 break;
00373 case XML_OUT :
00374 std::cout << "XML_OUT" << std::endl;
00375 outputter = new CppUnit::XmlOutputter(&runner.result(),
00376 ofs, "shift_jis");
00377 static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl);
00378 break;
00379 case COMPILER_OUT :
00380 outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream);
00381 break;
00382 }
00383 runner.setOutputter(outputter);
00384 runner.run();
00385 return 0;
00386 }
00387 #endif // MAIN
00388 #endif // OutPortCorbaCdrProvider_cpp