X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=senf%2FPPI%2FMultiConnectorMixin.test.cc;h=998a5c777bf71272e2aa28b39666b4f14b6e64bf;hb=93d9568d448749dc187e7622b733a4a3caa319df;hp=84fcbafe1455e1c33f3ed812f32e1bb438206cfd;hpb=0584aff454ea331f482f830c3ee16d4fdafb3ffb;p=senf.git diff --git a/senf/PPI/MultiConnectorMixin.test.cc b/senf/PPI/MultiConnectorMixin.test.cc index 84fcbaf..998a5c7 100644 --- a/senf/PPI/MultiConnectorMixin.test.cc +++ b/senf/PPI/MultiConnectorMixin.test.cc @@ -1,6 +1,6 @@ // $Id$ // -// Copyright (C) 2009 +// Copyright (C) 2009 // Fraunhofer Institute for Open Communication Systems (FOKUS) // Competence Center NETwork research (NET), St. Augustin, GERMANY // Stefan Bund @@ -27,38 +27,83 @@ //#include "MultiConnectorMixin.test.ih" // Custom includes -#include "PPI.hh" +#include "MultiConnectorMixin.hh" +#include "DebugModules.hh" +#include "Joins.hh" +#include "AnnotationRouter.hh" #include #include #define prefix_ -///////////////////////////////cc.p//////////////////////////////////////// - +//-///////////////////////////////////////////////////////////////////////////////////////////////// namespace ppi = senf::ppi; namespace connector = ppi::connector; namespace module = ppi::module; namespace debug = module::debug; namespace { - // We only test the user-collection case, all other cases are already handled by - // existing modules + + // Primitive join + class SequenceContainerModule + : public module::Module, + public module::MultiConnectorMixin > + { + SENF_PPI_MODULE(SequenceContainerModule); + typedef module::MultiConnectorMixin > base; + + public: + connector::ActiveOutput<> output; + + using base::connectors; + + SequenceContainerModule() : count (0u) + { + noroute(output); + } + + unsigned count; + + private: + void connectorSetup(connector::PassiveInput<> & c) + { + route(c, output); + c.onRequest(boost::bind(&SequenceContainerModule::request, this, boost::ref(c))); + ++ count; + } + + void connectorDestroy(connector::PassiveInput<> const & c) + { + -- count; + } + + void request(connector::PassiveInput<> & c) + { + output(c()); + } + + friend class module::MultiConnectorMixin >; + }; // Primitive duplicator - class MyModule + class UserContainerModule : public module::Module, - public module::MultiConnectorMixin, void, void> + public module::MultiConnectorMixin, void, void> { - SENF_PPI_MODULE(MyModule); + SENF_PPI_MODULE(UserContainerModule); + typedef std::vector< boost::shared_ptr > Connectors; public: connector::PassiveInput<> input; - MyModule() + UserContainerModule() { - noroute(input); - input.onRequest(&MyModule::request); + noroute(input); + input.onRequest(&UserContainerModule::request); } + Connectors const & connectors() const + { return connectors_; } + private: void connectorSetup(std::auto_ptr c) { @@ -66,6 +111,15 @@ namespace { connectors_.push_back(boost::shared_ptr(c)); } + void connectorDestroy(ConnectorType const * c) + { + Connectors::iterator i ( + std::find_if(connectors_.begin(), connectors_.end(), + boost::bind(&Connectors::value_type::get,_1) == c)); + if (i != connectors_.end()) + connectors_.erase(i); + } + void request() { senf::Packet p (input()); @@ -74,12 +128,11 @@ namespace { (**i)(p); } - typedef std::vector< boost::shared_ptr > Connectors; Connectors connectors_; - - friend class module::MultiConnectorMixin, void, void>; + + friend class module::MultiConnectorMixin, void, void>; }; - + struct IntAnnotation { int value; bool operator<(IntAnnotation const & other) const { return value < other.value; } @@ -91,10 +144,38 @@ namespace { { os << value.value; return os; } } -BOOST_AUTO_UNIT_TEST(multiConnectorMixin_userContainer) +SENF_AUTO_UNIT_TEST(multiConnectorMixin_sequenceContainer) +{ + debug::ActiveSource source1; + debug::ActiveSource source2; + SequenceContainerModule module; + debug::PassiveSink sink; + + ppi::connect(source1, module); + ppi::connect(source2, module); + ppi::connect(module, sink); + ppi::init(); + + senf::Packet p (senf::DataPacket::create()); + + source1.submit(p); + BOOST_CHECK_EQUAL( sink.size(), 1u ); + BOOST_CHECK( sink.pop_front() == p ); + source2.submit(p); + BOOST_CHECK_EQUAL( sink.size(), 1u ); + BOOST_CHECK( sink.pop_front() == p ); + + BOOST_CHECK_EQUAL( module.connectors().size(), 2u ); + BOOST_CHECK_EQUAL( module.count, 2u ); + source1.output.disconnect(); + BOOST_CHECK_EQUAL( module.connectors().size(), 1u ); + BOOST_CHECK_EQUAL( module.count, 1u ); +} + +SENF_AUTO_UNIT_TEST(multiConnectorMixin_userContainer) { debug::ActiveSource source; - MyModule module; + UserContainerModule module; debug::PassiveSink sink1; debug::PassiveSink sink2; @@ -110,23 +191,27 @@ BOOST_AUTO_UNIT_TEST(multiConnectorMixin_userContainer) BOOST_CHECK_EQUAL( sink2.size(), 1u ); BOOST_CHECK( sink1.pop_front() == p ); BOOST_CHECK( sink2.pop_front() == p ); + + BOOST_CHECK_EQUAL( module.connectors().size(), 2u ); + sink1.input.disconnect(); + BOOST_CHECK_EQUAL( module.connectors().size(), 1u ); } -BOOST_AUTO_UNIT_TEST(multiConnectorMixin_multipleModules) +SENF_AUTO_UNIT_TEST(multiConnectorMixin_multipleModules) { debug::ActiveSource source; debug::PassiveSink sink; module::PassiveJoin join1; module::PassiveJoin join2; module::AnnotationRouter router; - MyModule module; - + UserContainerModule module; + ppi::connect(source, join1); ppi::connect(join1, router); ppi::connect(router, 1, join2); ppi::connect(join2, module); ppi::connect(module, sink); - + senf::Packet p (senf::DataPacket::create()); p.annotation().value = 1; @@ -135,7 +220,7 @@ BOOST_AUTO_UNIT_TEST(multiConnectorMixin_multipleModules) BOOST_CHECK( sink.pop_front() == p ); } -///////////////////////////////cc.e//////////////////////////////////////// +//-///////////////////////////////////////////////////////////////////////////////////////////////// #undef prefix_