Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include "unit.hpp"
00020
00021 #include "mqueue_test.hpp"
00022
00023 #include <iostream>
00024
00025 #include <Service.hpp>
00026 #include <transports/mqueue/MQLib.hpp>
00027 #include <transports/mqueue/MQChannelElement.hpp>
00028 #include <transports/mqueue/MQTemplateProtocol.hpp>
00029 #include <os/fosi.h>
00030
00031 using namespace std;
00032 using namespace RTT;
00033 using namespace RTT::detail;
00034
00035 void
00036 MQueueTest::setUp()
00037 {
00038
00039 mr1 = new InputPort<double>("mr");
00040 mw1 = new OutputPort<double>("mw");
00041
00042 mr2 = new InputPort<double>("mr");
00043 mw2 = new OutputPort<double>("mw");
00044
00045 tc = new TaskContext( "root" );
00046 tc->ports()->addPort( mr1 );
00047 tc->ports()->addPort( mw1 );
00048
00049 t2 = new TaskContext("other");
00050 t2->ports()->addPort( mr2 );
00051 t2->ports()->addPort( mw2 );
00052
00053 }
00054
00055
00056 void
00057 MQueueTest::tearDown()
00058 {
00059 delete tc;
00060 delete t2;
00061
00062 delete mr1;
00063 delete mw1;
00064 delete mr2;
00065 delete mw2;
00066 }
00067
00068 void MQueueTest::new_data_listener(PortInterface* port)
00069 {
00070 signalled_port = port;
00071 }
00072
00073
00074 #define ASSERT_PORT_SIGNALLING(code, read_port) \
00075 signalled_port = 0; \
00076 code; \
00077 rtos_disable_rt_warning(); \
00078 usleep(100000); \
00079 rtos_enable_rt_warning(); \
00080 BOOST_CHECK( read_port == signalled_port );
00081
00082 void MQueueTest::testPortDataConnection()
00083 {
00084 rtos_enable_rt_warning();
00085
00086
00087 BOOST_CHECK( mw1->connected() );
00088 BOOST_CHECK( mr2->connected() );
00089
00090 double value = 0;
00091
00092
00093 BOOST_CHECK( NoData == mr2->read(value) );
00094
00095
00096 ASSERT_PORT_SIGNALLING(mw1->write(1.0), mr2)
00097 BOOST_CHECK( mr2->read(value) );
00098 BOOST_CHECK_EQUAL( 1.0, value );
00099 ASSERT_PORT_SIGNALLING(mw1->write(2.0), mr2);
00100 BOOST_CHECK( mr2->read(value) );
00101 BOOST_CHECK_EQUAL( 2.0, value );
00102 BOOST_CHECK( OldData == mr2->read(value) );
00103
00104 rtos_disable_rt_warning();
00105 }
00106
00107 void MQueueTest::testPortBufferConnection()
00108 {
00109 rtos_enable_rt_warning();
00110
00111
00112 BOOST_CHECK( mw1->connected() );
00113 BOOST_CHECK( mr2->connected() );
00114
00115 double value = 0;
00116
00117
00118 BOOST_CHECK( NoData == mr2->read(value) );
00119
00120
00121 ASSERT_PORT_SIGNALLING(mw1->write(1.0), mr2);
00122 ASSERT_PORT_SIGNALLING(mw1->write(2.0), mr2);
00123 ASSERT_PORT_SIGNALLING(mw1->write(3.0), mr2);
00124 ASSERT_PORT_SIGNALLING(mw1->write(4.0), 0);
00125 BOOST_CHECK( mr2->read(value) );
00126 BOOST_CHECK_EQUAL( 1.0, value );
00127 BOOST_CHECK( mr2->read(value) );
00128 BOOST_CHECK_EQUAL( 2.0, value );
00129 BOOST_CHECK( mr2->read(value) );
00130 BOOST_CHECK_EQUAL( 3.0, value );
00131 BOOST_CHECK( OldData == mr2->read(value) );
00132
00133 rtos_disable_rt_warning();
00134 }
00135
00136 void MQueueTest::testPortDisconnected()
00137 {
00138 BOOST_CHECK( !mw1->connected() );
00139 BOOST_CHECK( !mr2->connected() );
00140 }
00141
00142
00143
00144 BOOST_FIXTURE_TEST_SUITE( MQueueTestSuite, MQueueTest )
00145
00146
00150 BOOST_AUTO_TEST_CASE( testPortConnections )
00151 {
00152
00153 ConnPolicy policy;
00154 policy.type = ConnPolicy::DATA;
00155 policy.init = false;
00156 policy.lock_policy = ConnPolicy::LOCK_FREE;
00157 policy.size = 0;
00158 policy.transport = ORO_MQUEUE_PROTOCOL_ID;
00159
00160
00161 Handle hl( mr2->getNewDataOnPortEvent()->setup(
00162 boost::bind(&MQueueTest::new_data_listener, this, _1) ) );
00163 hl.connect();
00164
00165 DataFlowInterface* ports = tc->ports();
00166 DataFlowInterface* ports2 = t2->ports();
00167
00168 #if 1
00169
00170
00171 policy.type = ConnPolicy::DATA;
00172 policy.pull = false;
00173
00174 policy.name_id = "/data1";
00175 BOOST_CHECK( mw1->createConnection(*mr2, policy) );
00176 BOOST_CHECK( policy.name_id == "/data1" );
00177 testPortDataConnection();
00178 mw1->disconnect();
00179 mr2->disconnect();
00180 testPortDisconnected();
00181
00182 policy.type = ConnPolicy::DATA;
00183 policy.pull = true;
00184 policy.name_id = "";
00185 BOOST_CHECK( mw1->createConnection(*mr2, policy) );
00186 testPortDataConnection();
00187 mw1->disconnect();
00188 mr2->disconnect();
00189 testPortDisconnected();
00190 #endif
00191 #if 1
00192 policy.type = ConnPolicy::BUFFER;
00193 policy.pull = false;
00194 policy.size = 3;
00195 policy.name_id = "";
00196
00197 BOOST_CHECK( mw1->createConnection(*mr2, policy) );
00198 testPortBufferConnection();
00199 mw1->disconnect();
00200 mr2->disconnect();
00201 testPortDisconnected();
00202 #endif
00203 #if 1
00204 policy.type = ConnPolicy::BUFFER;
00205 policy.pull = true;
00206 policy.size = 3;
00207 policy.name_id = "";
00208
00209 BOOST_CHECK( mw1->createConnection(*mr2, policy) );
00210 testPortBufferConnection();
00211
00212 mw1->disconnect();
00213 mr2->disconnect();
00214 testPortDisconnected();
00215 #endif
00216 }
00217
00218 BOOST_AUTO_TEST_CASE( testPortStreams )
00219 {
00220
00221 ConnPolicy policy;
00222 policy.type = ConnPolicy::DATA;
00223 policy.init = false;
00224 policy.lock_policy = ConnPolicy::LOCK_FREE;
00225 policy.size = 0;
00226 policy.transport = ORO_MQUEUE_PROTOCOL_ID;
00227
00228
00229 Handle hl( mr2->getNewDataOnPortEvent()->setup(
00230 boost::bind(&MQueueTest::new_data_listener, this, _1) ) );
00231 hl.connect();
00232
00233 DataFlowInterface* ports = tc->ports();
00234 DataFlowInterface* ports2 = t2->ports();
00235
00236
00237
00238 policy.type = ConnPolicy::DATA;
00239 policy.pull = false;
00240 policy.name_id = "/data1";
00241 BOOST_CHECK( mw1->createStream( policy ) );
00242 BOOST_CHECK( mr2->createStream( policy ) );
00243 testPortDataConnection();
00244 mw1->disconnect();
00245 mr2->disconnect();
00246 testPortDisconnected();
00247
00248 policy.type = ConnPolicy::DATA;
00249 policy.pull = true;
00250 policy.name_id = "";
00251 BOOST_CHECK( mw1->createStream( policy ) );
00252 BOOST_CHECK( mr2->createStream( policy ) );
00253 testPortDataConnection();
00254 mw1->disconnect();
00255 mr2->disconnect();
00256 testPortDisconnected();
00257
00258 policy.type = ConnPolicy::BUFFER;
00259 policy.pull = false;
00260 policy.size = 3;
00261 policy.name_id = "/buffer1";
00262 BOOST_CHECK( mw1->createStream( policy ) );
00263 BOOST_CHECK( mr2->createStream( policy ) );
00264 testPortBufferConnection();
00265 mw1->disconnect();
00266 mr2->disconnect();
00267 testPortDisconnected();
00268
00269 policy.type = ConnPolicy::BUFFER;
00270 policy.pull = true;
00271 policy.size = 3;
00272 policy.name_id = "";
00273 BOOST_CHECK( mw1->createStream( policy ) );
00274 BOOST_CHECK( mr2->createStream( policy ) );
00275 testPortBufferConnection();
00276 mw1->disconnect();
00277 mr2->disconnect();
00278 testPortDisconnected();
00279 }
00280
00281 BOOST_AUTO_TEST_CASE( testPortStreamsTimeout )
00282 {
00283
00284 ConnPolicy policy;
00285 policy.type = ConnPolicy::DATA;
00286 policy.init = false;
00287 policy.lock_policy = ConnPolicy::LOCK_FREE;
00288 policy.size = 0;
00289 policy.transport = ORO_MQUEUE_PROTOCOL_ID;
00290
00291
00292 policy.type = ConnPolicy::DATA;
00293 policy.pull = false;
00294 policy.name_id = "/data1";
00295 BOOST_CHECK( mr2->createStream( policy ) == false );
00296 BOOST_CHECK( mr2->connected() == false );
00297 mr2->disconnect();
00298
00299 policy.type = ConnPolicy::BUFFER;
00300 policy.pull = false;
00301 policy.size = 10;
00302 policy.name_id = "/buffer1";
00303 BOOST_CHECK( mr2->createStream( policy ) == false );
00304 BOOST_CHECK( mr2->connected() == false );
00305 mr2->disconnect();
00306 }
00307
00308
00309 BOOST_AUTO_TEST_CASE( testPortStreamsWrongName )
00310 {
00311
00312 ConnPolicy policy;
00313 policy.type = ConnPolicy::DATA;
00314 policy.init = false;
00315 policy.lock_policy = ConnPolicy::LOCK_FREE;
00316 policy.size = 0;
00317 policy.transport = ORO_MQUEUE_PROTOCOL_ID;
00318
00319
00320 policy.type = ConnPolicy::DATA;
00321 policy.pull = false;
00322 policy.name_id = "data1";
00323 BOOST_CHECK( mr2->createStream( policy ) == false );
00324 BOOST_CHECK( mr2->connected() == false );
00325 mr2->disconnect();
00326
00327 policy.type = ConnPolicy::BUFFER;
00328 policy.pull = false;
00329 policy.size = 10;
00330 policy.name_id = "buffer1";
00331 BOOST_CHECK( mr2->createStream( policy ) == false );
00332 BOOST_CHECK( mr2->connected() == false );
00333 mr2->disconnect();
00334 }
00335
00336
00337 BOOST_AUTO_TEST_CASE( testVectorTransport )
00338 {
00339
00340 ConnPolicy policy;
00341 policy.type = ConnPolicy::DATA;
00342 policy.init = false;
00343 policy.lock_policy = ConnPolicy::LOCK_FREE;
00344 policy.size = 0;
00345 policy.transport = ORO_MQUEUE_PROTOCOL_ID;
00346
00347
00348 Handle hl( mr2->getNewDataOnPortEvent()->setup(
00349 boost::bind(&MQueueTest::new_data_listener, this, _1) ) );
00350 hl.connect();
00351
00352 DataFlowInterface* ports = tc->ports();
00353 DataFlowInterface* ports2 = t2->ports();
00354
00355 std::vector<double> data(20, 3.33);
00356 InputPort< std::vector<double> > vin("VIn");
00357 OutputPort< std::vector<double> > vout("Vout");
00358 ports->addPort(&vin, "input port");
00359 ports2->addPort(&vout, "output port");
00360
00361
00362 vout.setDataSample( data );
00363 data = vout.getLastWrittenValue();
00364 for(int i=0; i != 20; ++i)
00365 BOOST_CHECK_CLOSE( data[i], 3.33, 0.01);
00366
00367 policy.type = ConnPolicy::DATA;
00368 policy.pull = false;
00369 policy.name_id = "/vdata1";
00370 BOOST_CHECK( vout.createStream( policy ) );
00371 BOOST_CHECK( vin.createStream( policy ) );
00372
00373
00374 BOOST_CHECK_EQUAL( vin.read(data), NoData);
00375
00376
00377 data.clear();
00378 data.resize(10, 6.66);
00379 for(int i=0; i != data.size(); ++i)
00380 BOOST_CHECK_CLOSE( data[i], 6.66, 0.01);
00381
00382 rtos_enable_rt_warning();
00383 vout.write( data );
00384 rtos_disable_rt_warning();
00385
00386
00387 data.clear();
00388 data.resize(20, 0.0);
00389 usleep(200000);
00390
00391 rtos_enable_rt_warning();
00392 BOOST_CHECK_EQUAL( vin.read(data), NewData);
00393 rtos_disable_rt_warning();
00394
00395
00396 BOOST_CHECK_EQUAL( data.size(), 10);
00397 BOOST_CHECK_EQUAL( data.capacity(), 20);
00398 for(int i=0; i != data.size(); ++i)
00399 BOOST_CHECK_CLOSE( data[i], 6.66, 0.01);
00400
00401 rtos_enable_rt_warning();
00402 BOOST_CHECK_EQUAL( vin.read(data), OldData);
00403 rtos_disable_rt_warning();
00404 }
00405
00406 BOOST_AUTO_TEST_SUITE_END()
00407