Go to the documentation of this file.00001
00012
00013
00014
00015
00016 #ifndef ConnectorListener_cpp
00017 #define ConnectorListener_cpp
00018
00019 #include <iostream>
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/CdrBufferBase.h>
00031 #include <coil/Properties.h>
00032 #include <rtm/ConnectorListener.h>
00033
00034
00035 #define cdl_len 10
00036
00037 #define cl_len 7
00038
00044 namespace ConnectorListener
00045 {
00046
00047 static const char* str_cdl[] =
00048 {
00049 "ON_BUFFER_WRITE",
00050 "ON_BUFFER_FULL",
00051 "ON_BUFFER_WRITE_TIMEOUT",
00052 "ON_BUFFER_OVERWRITE",
00053 "ON_BUFFER_READ",
00054 "ON_SEND",
00055 "ON_RECEIVED",
00056 "ON_RECEIVER_FULL",
00057 "ON_RECEIVER_TIMEOUT",
00058 "ON_RECEIVER_ERROR"
00059 };
00060
00061
00062 static const char* str_cl[] =
00063 {
00064 "ON_BUFFER_EMPTY",
00065 "ON_BUFFER_READ_TIMEOUT",
00066 "ON_SENDER_EMPTY",
00067 "ON_SENDER_TIMEOUT",
00068 "ON_SENDER_ERROR",
00069 "ON_CONNECT",
00070 "ON_DISCONNECT"
00071 };
00072
00073 static int cdl_count;
00074 static int cl_count;
00075
00076 class DataListener
00077 : public RTC::ConnectorDataListenerT<RTC::TimedLong>
00078 {
00079 public:
00080 DataListener(const char* name) : m_name(name)
00081 {
00082 ++cdl_count;
00083 }
00084 virtual ~DataListener()
00085 {
00086 --cdl_count;
00087 }
00088
00089 virtual void operator()(const RTC::ConnectorInfo& info,
00090 const RTC::TimedLong& data)
00091 {
00092 m_data = data;
00093 std::cout << "-------------------------------------------" << std::endl;
00094 std::cout << "Data Listener: " << m_name << std::endl;
00095
00096 std::cout << "-------------------------------------------" << std::endl;
00097 }
00098
00099 RTC::TimedLong get_data()
00100 {
00101 RTC::TimedLong ret;
00102 ret = m_data;
00103 m_data.data = 0;
00104 return ret;
00105 };
00106
00107 std::string m_name;
00108 RTC::TimedLong m_data;
00109 };
00110
00111 class ConnListener
00112 : public RTC::ConnectorListener
00113 {
00114 public:
00115 ConnListener(const char* name) : m_name(name)
00116 {
00117 ++cl_count;
00118 }
00119 virtual ~ConnListener()
00120 {
00121 --cl_count;
00122 }
00123
00124 virtual void operator()(const RTC::ConnectorInfo& info)
00125 {
00126 std::cout << "-------------------------------------------" << std::endl;
00127 std::cout << "Connector Listener: " << m_name << std::endl;
00128 std::cout << "-------------------------------------------" << std::endl;
00129 };
00130
00131 std::string m_name;
00132 };
00133
00134
00135 class ConnectorListenerTests
00136 : public CppUnit::TestFixture
00137 {
00138 CPPUNIT_TEST_SUITE(ConnectorListenerTests);
00139
00140 CPPUNIT_TEST(test_ConnectorDataListener);
00141 CPPUNIT_TEST(test_ConnectorListener);
00142
00143 CPPUNIT_TEST_SUITE_END();
00144
00145 private:
00146 RTC::ConnectorListeners listeners;
00147 DataListener *datalisteners[cdl_len];
00148 ConnListener *connlisteners[cl_len];
00149
00150 public:
00151
00155 ConnectorListenerTests()
00156 {
00157 }
00158
00162 ~ConnectorListenerTests()
00163 {
00164 }
00165
00169 virtual void setUp()
00170 {
00171 }
00172
00176 virtual void tearDown()
00177 {
00178 }
00179
00183 void test_ConnectorDataListener()
00184 {
00185
00186 for (int i(0); i<cdl_len; ++i)
00187 {
00188 datalisteners[i] = new DataListener(str_cdl[i]);
00189 }
00190
00191
00192 coil::Properties prop;
00193 coil::vstring ports;
00194 RTC::ConnectorInfo info("name", "id", ports, prop);
00195 RTC::ConnectorInfo info_big("name", "id", ports, prop);
00196 info_big.properties.setProperty("serializer.cdr.endian", "big");
00197
00198
00199 for (int i(0); i<cdl_len; ++i)
00200 {
00201 listeners.connectorData_[i].addListener(datalisteners[i], true);
00202 }
00203
00204
00205 for (int i(0); i<cdl_len; ++i)
00206 {
00207 RTC::TimedLong rtd;
00208 cdrMemoryStream cdr;
00209 RTC::TimedLong td;
00210 td.data = i;
00211 cdr.setByteSwapFlag(true);
00212 td >>= cdr;
00213 listeners.connectorData_[i].notify(info, cdr);
00214 rtd = datalisteners[i]->get_data();
00215 CPPUNIT_ASSERT_EQUAL(i, (int)rtd.data);
00216 }
00217
00218
00219 for (int i(0); i<cdl_len; ++i)
00220 {
00221 RTC::TimedLong rtd;
00222 cdrMemoryStream cdr;
00223 RTC::TimedLong td;
00224 td.data = i;
00225 cdr.setByteSwapFlag(false);
00226 td >>= cdr;
00227 listeners.connectorData_[i].notify(info_big, cdr);
00228 rtd = datalisteners[i]->get_data();
00229 CPPUNIT_ASSERT_EQUAL(i, (int)rtd.data);
00230 }
00231
00232
00233 for (int i(0); i<cdl_len; ++i)
00234 {
00235 listeners.connectorData_[i].removeListener(datalisteners[i]);
00236 }
00237
00238
00239 for (int i(0); i<cdl_len; ++i)
00240 {
00241 RTC::TimedLong rtd;
00242 cdrMemoryStream cdr;
00243 RTC::TimedLong td;
00244 td.data = i;
00245 cdr.setByteSwapFlag(true);
00246 td >>= cdr;
00247 listeners.connectorData_[i].notify(info, cdr);
00248 rtd = datalisteners[i]->get_data();
00249 CPPUNIT_ASSERT_EQUAL(0, (int)rtd.data);
00250 }
00251
00252 CPPUNIT_ASSERT_EQUAL(0, cdl_count);
00253
00254
00255
00256 }
00257
00261 void test_ConnectorListener()
00262 {
00263
00264 for (int i(0); i<cl_len; ++i)
00265 {
00266 connlisteners[i] = new ConnListener(str_cl[i]);
00267 }
00268
00269
00270 coil::Properties prop;
00271 coil::vstring ports;
00272 RTC::ConnectorInfo info("name", "id", ports, prop);
00273
00274
00275 for (int i(0); i<cl_len; ++i)
00276 {
00277 listeners.connector_[i].addListener(connlisteners[i], true);
00278 }
00279
00280
00281 for (int i(0); i<cl_len; ++i)
00282 {
00283 listeners.connector_[i].notify(info);
00284 }
00285
00286
00287 for (int i(0); i<cl_len; ++i)
00288 {
00289 listeners.connector_[i].removeListener(connlisteners[i]);
00290 }
00291
00292
00293 for (int i(0); i<cl_len; ++i)
00294 {
00295 listeners.connector_[i].notify(info);
00296 }
00297 CPPUNIT_ASSERT_EQUAL(0, cl_count);
00298
00299
00300
00301 }
00302
00303 };
00304 };
00305
00306
00307
00308
00309 CPPUNIT_TEST_SUITE_REGISTRATION(ConnectorListener::ConnectorListenerTests);
00310
00311 #ifdef LOCAL_MAIN
00312 int main(int argc, char* argv[])
00313 {
00314
00315 FORMAT format = TEXT_OUT;
00316 int target = 0;
00317 std::string xsl;
00318 std::string ns;
00319 std::string fname;
00320 std::ofstream ofs;
00321
00322 int i(1);
00323 while (i < argc)
00324 {
00325 std::string arg(argv[i]);
00326 std::string next_arg;
00327 if (i + 1 < argc) next_arg = argv[i + 1];
00328 else next_arg = "";
00329
00330 if (arg == "--text") { format = TEXT_OUT; break; }
00331 if (arg == "--xml")
00332 {
00333 if (next_arg == "")
00334 {
00335 fname = argv[0];
00336 fname += ".xml";
00337 }
00338 else
00339 {
00340 fname = next_arg;
00341 }
00342 format = XML_OUT;
00343 ofs.open(fname.c_str());
00344 }
00345 if ( arg == "--compiler" ) { format = COMPILER_OUT; break; }
00346 if ( arg == "--cerr" ) { target = 1; break; }
00347 if ( arg == "--xsl" )
00348 {
00349 if (next_arg == "") xsl = "default.xsl";
00350 else xsl = next_arg;
00351 }
00352 if ( arg == "--namespace" )
00353 {
00354 if (next_arg == "")
00355 {
00356 std::cerr << "no namespace specified" << std::endl;
00357 exit(1);
00358 }
00359 else
00360 {
00361 xsl = next_arg;
00362 }
00363 }
00364 ++i;
00365 }
00366 CppUnit::TextUi::TestRunner runner;
00367 if ( ns.empty() )
00368 runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
00369 else
00370 runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest());
00371 CppUnit::Outputter* outputter = 0;
00372 std::ostream* stream = target ? &std::cerr : &std::cout;
00373 switch ( format )
00374 {
00375 case TEXT_OUT :
00376 outputter = new CppUnit::TextOutputter(&runner.result(),*stream);
00377 break;
00378 case XML_OUT :
00379 std::cout << "XML_OUT" << std::endl;
00380 outputter = new CppUnit::XmlOutputter(&runner.result(),
00381 ofs, "shift_jis");
00382 static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl);
00383 break;
00384 case COMPILER_OUT :
00385 outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream);
00386 break;
00387 }
00388 runner.setOutputter(outputter);
00389 runner.run();
00390 return 0;
00391 }
00392 #endif // MAIN
00393 #endif // ConnectorListener_cpp